Django實戰(一)-----使用者登入與註冊系統4(圖片驗證碼)
為了防止機器人頻繁登入網站或者破壞分子惡意登入,很多使用者登入和註冊系統都提供了圖形驗證碼功能。
驗證碼(CAPTCHA)是一種區分使用者是計算機還是人的公共全自動程式。
可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊使用者用特定程式暴力破解方式進行不斷的登陸嘗試。
圖形驗證碼的歷史比較悠久,到現在已經有點英雄末路的味道了。因為機器學習、影象識別的存在,機器人已經可以比較正確的識別影象內的字元了。
但不管怎麼說,作為一種防禦手段,至少還是可以抵擋一些低階入門的攻擊手段,抬高了攻擊者的門檻。
在Django中實現圖片驗證碼功能非常簡單,有現成的第三方庫可以使用。這個庫叫做 django-simple-captcha
。
一、安裝captcha
在Pycharm的terminal中,首先進入mysite_env虛擬環境,然後安裝第三方庫:
pip install django-simple-captcha
Django自動幫我們安裝了相關的依賴庫 six
、 olefile
和 Pillow
,其中的Pillow是大名鼎鼎的繪圖模組。
二、註冊captcha
在settings中,將‘captcha’註冊到app列表裡:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'login', 'captcha', ]
captcha需要在資料庫中建立自己的資料表,所以需要執行migrate命令生成資料表:
python manage.py migrate
三、新增url路由
在根目錄下的urls.py檔案中增加captcha對應的網址:
from django.conf.urls import url from django.conf.urls import include from django.contrib import admin from login import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), url(r'^register/', views.register), url(r'^logout/', views.logout), url(r'^captcha', include('captcha.urls')) ]
由於使用了二級路由機制,需要在頂部 from django.conf.urls import include
四、修改forms.py
如果上面都OK了,就可以直接在我們的forms.py檔案中新增CaptchaField了。
from django import forms from captcha.fields import CaptchaField class UserForm(forms.Form): username = forms.CharField(label="使用者名稱", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'})) password = forms.CharField(label="密碼", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'})) captcha = CaptchaField(label='驗證碼')
注意需要提前匯入 from captcha.fields import CaptchaField
,然後就像寫普通的form欄位一樣新增一個captcha欄位就可以了!
五、修改login.html
由於我們前面是手動生成的form表單,所以還要修改一下,新增captcha的相關內容,如下所示:
{% extends 'login/../base.html' %} {% load staticfiles %} {% block title %}登入{% endblock %} {% block css %}<link href="{% static 'css/login.css' %}" rel="stylesheet"/>{% endblock %} {% block content %} <div class="container"> <div class="col-md-4 col-md-offset-4"> <form class='form-login' action="/login/" method="post"> {% if message %} <div class="alert alert-warning">{{ message }}</div> {% endif %} {% csrf_token %} <h2 class="text-center">歡迎登入</h2> <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.errors }} {{ login_form.captcha.label_tag }} {{ login_form.captcha }} </div> <button type="reset" class="btn btn-default pull-left">重置</button> <button type="submit" class="btn btn-primary pull-right">提交</button> </form> </div> </div> <!-- /container --> {% endblock %}
這裡額外增加了一條 {{ login_form.captcha.errors }}
用於明確指示使用者,你的驗證碼不正確。
六、檢視效果
重啟伺服器,進入登入頁面,嘗試用使用者名稱錯誤、密碼不對、驗證碼不對、全對的不同情況,看看我們新增的四位驗證碼的效果如何。
就是這麼簡單!
我們加入了一個防止機器人或者惡意登入的圖形驗證碼功能,雖然介面難看了點,但底子是好的,你可以根據需要進行美化。
其中驗證圖形碼是否正確的工作都是在後臺自動完成的,只需要使用 is_valid()
這個forms內建的驗證方法就一起進行了,完全不需要在檢視函式中新增任何的驗證程式碼,非常方便快捷!
關於captcha的功能,當然絕不僅限於此,你可以設定六位、八位驗證碼,可以對圖形噪點的生成模式進行定製,這些就留待你自己學習和研究了。