日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

8. 图片验证码

發(fā)布時(shí)間:2024/9/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8. 图片验证码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為了防止機(jī)器人頻繁登錄網(wǎng)站或者破壞分子惡意登錄,很多用戶登錄和注冊(cè)系統(tǒng)都提供了圖形驗(yàn)證碼功能。

驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序。可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試。

圖形驗(yàn)證碼的歷史比較悠久,到現(xiàn)在已經(jīng)有點(diǎn)英雄末路的味道了。因?yàn)闄C(jī)器學(xué)習(xí)、圖像識(shí)別的存在,機(jī)器人已經(jīng)可以比較正確的識(shí)別圖像內(nèi)的字符了。但不管怎么說(shuō),作為一種防御手段,至少還是可以抵擋一些低級(jí)入門的攻擊手段,抬高了攻擊者的門檻。

在Django中實(shí)現(xiàn)圖片驗(yàn)證碼功能非常簡(jiǎn)單,有現(xiàn)成的第三方庫(kù)可以使用,我們不必自己開(kāi)發(fā)(也要能開(kāi)發(fā)得出來(lái),囧)。這個(gè)庫(kù)叫做django-simple-captcha。

一、安裝captcha

在Pycharm的terminal中,使用pip安裝第三方庫(kù):

執(zhí)行命令:pip install django-simple-captcha (venv) D:\work\2019\for_test\mysite>pip install django-simple-captcha Collecting django-simple-captchaDownloading https://files.pythonhosted.org/packages/86/d4/5baf10bfc9eb7844872c256898a405e81f22f7213e008ec90875689f913d/django-simple-captcha-0 .5.11.zip (234kB)100% |████████████████████████████████| 235kB 596kB/s Collecting six>=1.2.0 (from django-simple-captcha)Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none -any.whl Requirement already satisfied: Django>=1.8 in d:\work\2019\for_test\mysite\venv\lib\site-packages (from django-simple-captcha) (2.2) Collecting Pillow!=5.1.0,>=2.2.2 (from django-simple-captcha)Downloading https://files.pythonhosted.org/packages/40/f2/a424d4d5dd6aa8c26636969decbb3da1c01286d344e71429b1d648bccb64/Pillow-6.0.0-cp37-cp37m -win_amd64.whl (2.0MB)100% |████████████████████████████████| 2.0MB 2.2MB/s Collecting django-ranged-response==0.2.0 (from django-simple-captcha)Downloading https://files.pythonhosted.org/packages/70/e3/9372fcdca8e9c3205e7979528ccd1a14354a9a24d38efff11c1846ff8bf1/django-ranged-response- 0.2.0.tar.gz Requirement already satisfied: sqlparse in d:\work\2019\for_test\mysite\venv\lib\site-packages (from Django>=1.8->django-simple-captcha) (0.3.0)Requirement already satisfied: pytz in d:\work\2019\for_test\mysite\venv\lib\site-packages (from Django>=1.8->django-simple-captcha) (2018.9) Installing collected packages: six, Pillow, django-ranged-response, django-simple-captchaRunning setup.py install for django-ranged-response ... doneRunning setup.py install for django-simple-captcha ... done Successfully installed Pillow-6.0.0 django-ranged-response-0.2.0 django-simple-captcha-0.5.11 six-1.12.0

pip自動(dòng)幫我們安裝了相關(guān)的依賴庫(kù)six、olefile和Pillow,其中的Pillow是大名鼎鼎的繪圖模塊。

二、注冊(cè)captcha

在settings中,將‘captcha’注冊(cè)到app列表里:

# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','login','captcha', ]

captcha需要在數(shù)據(jù)庫(kù)中建立自己的數(shù)據(jù)表,所以需要執(zhí)行migrate命令生成數(shù)據(jù)表:

(venv) D:\work\2019\for_test\mysite>python manage.py migrate Operations to perform:Apply all migrations: admin, auth, captcha, contenttypes, login, sessions Running migrations:Applying captcha.0001_initial... OK

三、添加url路由

在根目錄下的urls.py文件中增加captcha對(duì)應(yīng)的url:

from django.contrib import admin from django.urls import path from django.urls import include from login import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),path('login/', views.login),path('register/', views.register),path('logout/', views.logout),path('captcha/', include('captcha.urls')) # 增加這一行 ]

由于使用了二級(jí)路由機(jī)制,需要在頂部from django.urls import include。

四、修改forms.py

如果上面都OK了,就可以直接在我們的forms.py文件中添加CaptchaField了。

from django import forms from captcha.fields import CaptchaFieldclass UserForm(forms.Form):username = forms.CharField(label="用戶名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': "Username",'autofocus': ''}))password = forms.CharField(label="密碼", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': "Password"}))captcha = CaptchaField(label='驗(yàn)證碼')

注意需要提前導(dǎo)入from captcha.fields import CaptchaField,然后就像寫普通的form字段一樣添加一個(gè)captcha字段就可以了!

五、修改login.html

由于我們前面是手動(dòng)生成的form表單,所以還要修改一下,添加captcha的相關(guān)內(nèi)容,如下所示:

{% load static %} <!doctype html> <html lang="en"><head><!-- Required meta tags --><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!-- 上述meta標(biāo)簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! --><!-- Bootstrap CSS --><link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"><link href="{% static 'login/css/login.css' %}" rel="stylesheet"/><title>登錄</title></head><body><div class="container"><div class="col"><form class="form-login" action="/login/" method="post">{% if login_form.captcha.errors %}<div class="alert alert-warning">{{ login_form.captcha.errors }}</div>{% elif message %}<div class="alert alert-warning">{{ message }}</div>{% endif %}{% csrf_token %}<h3 class="text-center">歡迎登錄</h3><div class="form-group">{{ login_form.username.label_tag }}{{ login_form.username}}</div><div class="form-group">{{ login_form.password.label_tag }}{{ login_form.password }}</div><div class="form-group">{{ login_form.captcha.label_tag }}{{ login_form.captcha }}</div><div><a href="/register/" class="text-success " ><ins>新用戶注冊(cè)</ins></a><button type="submit" class="btn btn-primary float-right">登錄</button></div></form></div></div> <!-- /container --><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS -->{# 以下三者的引用順序是固定的#}<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script><script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script><script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script></body> </html>

這里在頂部的消息處,在{% if %}模板代碼中,額外增加了一條{{ login_form.captcha.errors }}的判斷,用于明確指示用戶的驗(yàn)證碼不正確。

六、查看效果

重啟服務(wù)器,進(jìn)入登錄頁(yè)面,嘗試用用戶名錯(cuò)誤、密碼不對(duì)、驗(yàn)證碼不對(duì)、全對(duì)的不同情況,看看我們新增的四位驗(yàn)證碼的效果如何。

就是這么簡(jiǎn)單!我們加入了一個(gè)防止機(jī)器人或者惡意登錄的圖形驗(yàn)證碼功能,雖然界面難看了點(diǎn),但底子是好的,你可以根據(jù)需要進(jìn)行美化。其中驗(yàn)證圖形碼是否正確的工作都是在后臺(tái)自動(dòng)完成的,只需要使用is_valid()這個(gè)forms內(nèi)置的驗(yàn)證方法就一起進(jìn)行了,完全不需要在視圖函數(shù)中添加任何的驗(yàn)證代碼,非常方便快捷!

關(guān)于captcha的功能,當(dāng)然絕不僅限于此,你可以設(shè)置六位、八位驗(yàn)證碼,可以對(duì)圖形噪點(diǎn)的生成模式進(jìn)行定制,這些就留待你自己學(xué)習(xí)和研究了。

來(lái)源:https://www.liujiangblog.com/course/django/110

總結(jié)

以上是生活随笔為你收集整理的8. 图片验证码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。