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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

83.Django项目中使用验证码

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 83.Django项目中使用验证码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 概述

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

2. 類別

? 當今驗證碼各種不同的類別很多,常見的如下:

  • 普通型:隨機多個(一般是4個)字母、數字和中文的圖片,可能加一些干擾項

  • 問答型:圖片中顯示一個問題,譬如3+3=?

  • 拖動行為型:拖動一個小圖片到一個拼圖中

    ![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-q9AglfUS-1669135661830)(.\imgs\captcha_drag.jpg)](https://img-blog.csdnimg.cn/737e0f0029bd458ab851e02f4b48d5c2.png)

  • 點擊行為型:按照順序點擊圖片中的特定位置

  • 3. 實現思路

    ? 大部分的驗證碼驗證的思路都是這樣的:

  • 客戶端發送獲取驗證碼的請求
  • 服務端接收到驗證碼請求后,生成對應的驗證碼和正確答案
  • 服務端將驗證碼的正確答案保存到會話對象當中
  • 服務端將驗證碼返回到客戶端
  • 客戶端看到驗證碼后:
    • 如果看不清等原因,可以重新獲取,那么就重新回到第1步
    • 正確顯示后,輸入答案,提交答案到服務端
  • 服務端接收到驗證碼答案后,和保存在會話對象中的正確答案比對,正確就通過驗證,失敗則返回錯誤提示
  • 4. Django項目中實現驗證碼

    ? 本文檔中以普通的4個字母的驗證碼作為演示
    首先新建項目:captcha_study,子應用:captcha_app。在mysql數據庫中新建庫catcha_study庫。在settings中掛載子應用,配置數據庫。然后遷移數據庫。創建后臺管理superuser用戶。以上操作都可以參考本專欄的前幾篇文章。

    4.1 實現登錄功能(未使用驗證碼)

    ? 借用之前 session學習 課程中的部分的登錄模塊代碼
    3. settings中配置數據庫:

    DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'captcha_study','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': '3306',}}
  • 遷移數據庫

    由于只使用了django自帶的應用的數據庫模型,所以直接 migrate 就可以

  • python manage.py migrate
  • 創建 superuser
  • python manager.py createsuperuser
  • 修改主應用的urls.py:
  • path('captcha/', include('captcha_app.urls')),
  • 新增子應用的urls.py
  • from django.urls import pathfrom . import viewsapp_name = 'captcha_app'urlpatterns = [path('', views.index, name='index'),path('login/', views.login, name='login'),path('logout/', views.logout, name='logout'),]
  • views中修改:
  • from django.contrib import authfrom django.contrib.auth.decorators import login_requiredfrom django.shortcuts import render, redirect# 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')# 驗證用戶名和密碼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')
  • 新增template
  • 在子應用中建立 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同一級目錄

    # captcha_study\common\captcha_4char\captcha.py import os from PIL import Image, ImageDraw, ImageFont, ImageFilter import random import stringdef random_str(length=4):""" 隨機字符串 默認長度 4:param length: 默認長度 4:return:"""return ''.join(random.sample(string.ascii_letters, length))def random_color(s=1, e=255):""" 隨機 RGB 顏色:param s: 起始值, 0-255:param e: 結束時, 0-255:return: (r, g, b)"""return random.randint(s, e), random.randint(s, e), random.randint(s, e)def veri_code(length=4, width=160, height=40, size=28):""" 生成驗證碼圖片:param length: 驗證碼字符串長度:param width: 圖片寬度:param height: 圖片高度:param size: 字體大小:return: (驗證碼圖片, 驗證碼字符串)"""# 創建Image對象image = Image.new('RGB', (width, height), (255, 255, 255))# 創建Font對象file = os.path.dirname(os.path.abspath(__file__))font = ImageFont.truetype(f'{file}/common/captcha_4char/simfang.ttf', size)# 創建Draw對象draw = ImageDraw.Draw(image)# 隨機顏色填充每個像素for x in range(0, width, 2):for y in range(height):draw.point((x, y), fill=random_color(64, 255))# 驗證碼code = random_str(length)# 隨機顏色驗證碼寫到圖片上for t in range(length):draw.text((40 * t + 5, 5), code[t], font=font, fill=random_color(32, 127))# 模糊濾鏡image = image.filter(ImageFilter.BLUR)return image, codeif __name__ == '__main__':img, code = veri_code()with open('test.png', 'wb') as f:img.save(f)

    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# 創建流文件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项目中使用验证码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。