83.Django项目中使用验证码
1. 概述
? 驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計算機和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試等。
2. 類別
? 當今驗證碼各種不同的類別很多,常見的如下:
普通型:隨機多個(一般是4個)字母、數字和中文的圖片,可能加一些干擾項
問答型:圖片中顯示一個問題,譬如3+3=?
拖動行為型:拖動一個小圖片到一個拼圖中

點擊行為型:按照順序點擊圖片中的特定位置
3. 實現(xiàn)思路
? 大部分的驗證碼驗證的思路都是這樣的:
- 如果看不清等原因,可以重新獲取,那么就重新回到第1步
- 正確顯示后,輸入答案,提交答案到服務端
4. Django項目中實現(xiàn)驗證碼
? 本文檔中以普通的4個字母的驗證碼作為演示
首先新建項目:captcha_study,子應用:captcha_app。在mysql數據庫中新建庫catcha_study庫。在settings中掛載子應用,配置數據庫。然后遷移數據庫。創(chuàng)建后臺管理superuser用戶。以上操作都可以參考本專欄的前幾篇文章。
4.1 實現(xiàn)登錄功能(未使用驗證碼)
? 借用之前 session學習 課程中的部分的登錄模塊代碼
3. settings中配置數據庫:
遷移數據庫
由于只使用了django自帶的應用的數據庫模型,所以直接 migrate 就可以
在子應用中建立 templates 文件夾,再建立一個子文件夾:captcha_app
? 新增index.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>首頁</title> </head> <body>歡迎光臨, 用戶:{{ request.user.username }}, email:{{ request.user.email }}<a href="{% url 'captcha_app:logout' %}">退出登錄</a> </body> </html>? 新建login.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登錄頁面</title><script>function refreshcheckcode(obj) {obj.src = "{% url 'captcha_app:captcha_img' %}?r="+Math.random()console.log(obj.src);}</script> </head> <body><form method="post" action="{% url 'captcha_app:login' %}">{% csrf_token %}<table><tr><td>用戶名:</td><td><input type="text" value="" name="username" id="username"></td></tr><tr><td>密碼:</td><td><input type="password" value="" name="password" id="password"></td></tr><tr><td>驗證碼:</td><td><input type="text" name="checkbox"><!-- this對象指的就是圖片,當點擊時,重新獲取 --><img src="{% url 'captcha_app:captcha_img' %}" onclick="refreshcheckcode(this);"></td></tr>{% if error_message %}<tr><td colspan="2"><strong>{{ error_message }}</strong></td></tr>{% endif %}<tr><td colspan="2"><input type="submit" value="登錄"></td></tr></table></form> </body> </html>4.2 新增圖片
安裝Pillow庫
pip install Pillow==8.3.1驗證碼-生成圖片
在C盤的Windows中的Fonts選擇幾款喜歡的字體,放入和captcha.py同一級目錄
views視圖
from django.contrib import auth from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect, HttpResponse from captcha_study.common.captcha_4char import captcha from io import BytesIO # Create your views here. @login_required(login_url='captcha_app:login') def index(request):return render(request, 'captcha_app/index.html')def logout(request):# 登出auth.logout(request)return redirect('captcha_app:login')def login(request):""" 本應用的登錄請求登錄請求一般有2個不同的http的methodget: 顯示的就是登錄頁面post:在登錄頁面輸入用戶名和密碼之后,點擊登錄提交:param request::return:""" # get請求,對一個 登錄的頁面if request.method == 'GET':# 通過 session獲取 error_messageerror_message = request.session.get('error_message')request.session['error_message'] = Nonereturn render(request, 'captcha_app/login.html', {'error_message':error_message})else:username = request.POST.get('username')password = request.POST.get('password')# 獲取表單提交的驗證碼checkcode = request.POST.get('checkbox')print("提交的驗證碼:",checkcode)# 獲取session會話中的checkcodesession_checkcode = request.session.get('checkcode')print("正確的驗證碼:",session_checkcode)if checkcode and checkcode.lower() == session_checkcode.lower():# 驗證用戶名和密碼user = auth.authenticate(username=username, password=password)# 用戶名和密碼正確if user:# 使用auth應用的話,登錄成功必須調用 login 方法# 在其他 函數中 使用 request.user 獲取 用戶對象實例auth.login(request, user)return redirect('captcha_app:index')else:# 在不同的 視圖函數中傳遞參數,使用 sessionerror_message = '用戶名或者密碼錯誤!!'request.session['error_message'] = error_messagereturn redirect('captcha_app:login')else:# 添加驗證碼錯誤信息error_message = '驗證碼不正確'request.session['error_message'] = error_messagereturn redirect('captcha_app:login') # 不能直接返回模板templates,頁面會顯示重新提交# 生成驗證碼,以流文件形式保存 def captcha_img(request):img, code = captcha.veri_code()# 將code保存到session會話中request.session['checkcode'] = code# 創(chuàng)建流文件stream = BytesIO()# 保存到流文件中img.save(stream,'PNG')# 從流文件中獲取圖片return HttpResponse(stream.getvalue())urls路由
from django.urls import path from . import viewsapp_name = 'captcha_app' urlpatterns = [path('', views.index, name='index'),path('login/', views.login, name='login'),path('logout/', views.logout, name='logout'),path('captcha_img/',views.captcha_img, name='captcha_img'), ]總結
以上是生活随笔為你收集整理的83.Django项目中使用验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenDaylight是什么?
- 下一篇: 云开发电商小程序实战教程-篇首语