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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Django之验证码的实现,简单快捷的方法

發布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django之验证码的实现,简单快捷的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Django之驗證碼的實現,簡單快捷的方法

實現驗證碼隨網頁變動即時刷新,實現有期限時間
請確保安裝好pillow
直接show code:
0、路由urs.py

from django.urls import path, re_path from . import views urlpatterns = [re_path(r'^test/$', views.testpage, name='test'),re_path(r'^captcha/$', views.captcha, name='captcha'), ]

1、定義生成驗證碼views.py

import os, random, time, string, io from django.shortcuts import render from django.http import HttpResponse from PIL import Image, ImageDraw, ImageFont # 生成驗證碼,# 可以直接可以在html中的img引用 def captcha(request):# 定義背景顏色、寬、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width = 100height = 50# 創建畫面對象img = Image.new('RGB', (width, height), bgcolor)# 創建畫筆對象draw = ImageDraw.Draw(img)# 調用畫筆的point()函數繪制驗證碼的干擾點for i in range(0, 100):xy = (random.randrange(0, width), random.randrange(0, height))fill = (random.randrange(0, 255), random.randrange(0, 255), 55)draw.point(xy, fill=fill)# 定義驗證碼的備選值_str = string.digits + string.ascii_letters# 隨機取四個值作為驗證碼rand_codes = ''.join(random.sample(_str, 4))# 定義字體大小size = int(min(width / len(rand_codes), height))# 構造字體對象font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', size)# 構造字體顏色,四個字顏色不同for i in range(4):fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))draw.text((i * 25, 2), rand_codes[i], font=font, fill=fontcolor)# 釋放畫筆del draw# # 將驗證碼緩存入session,后面做進一步驗證,注意應該在這里存入的時候變為小寫,# 否則驗證碼過期就變成了空,再進行lower()操作會拋出異常request.session['verify_code'] = rand_codes.lower()# 驗證碼有效時間60秒request.session.set_expiry(60)print("生成的驗證碼是:", rand_codes)print("它應該是與session存的驗證碼一樣:", request.session['verify_code'])buf = io.BytesIO()img.save(buf, 'png')# 將內存中的圖片數據返回給客戶端,MIME類型為png圖片return HttpResponse(buf.getvalue(), 'image/png')# 這樣也行# return HttpResponse(buf.getvalue(), 'jpg')

關鍵點在于io.BytesIO()函數和它的getvalue()函數
BytesIO()使用的是Binary I/O(也叫buffered I/O)的方法,它的處理對象必須是字節類對象(bytes-like object),生成的對象是字節(bytes),這個過程不執行解碼、編碼和換行轉換。這種類型的數據流可以用于所有非文本類的的數據(也就是二進制文件或二進制讀取的文本,如圖片、gif,以二進制讀取的.txt,.py,.html等文件)。

而getvalue()返回儲存在緩存中對象整個內容的字節

總之只要理解為:BytesIO()直接以二進制方式讀取jpg、png、gif等文件并將它存于緩存中,而getvalue()方法則是將它從緩存中取出來,還原成原來的樣子顯示給我們看。

2、路由導航函數views.py

# 測試頁 def testpage(request):verify_msg = ''_captcha_submit = request.POST.get('verify_code').lower()# 注意這里提交的code需要小寫,而服務器的code已經小寫,# 這樣分開做是為了避免當驗證碼過期了變為空值取不到session拋出異常_captcha_server = request.session.get('verify_code')if _captcha_server == _captcha_submit:return render(request, 'axf/test.html', {"msg": "驗證成功"})else:verify_msg = '驗證失敗'return render(request, 'testapp/test.html', {"msg": verify_msg})

3、模板下的HTML頁test.html

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>測試頁面</title> </head> <body><form action="/test/" method="post"><img src="/captcha/" alt="驗證碼"/><div><label><input type="text" name="verify_code" placeholder="請輸入圖片中驗證碼"></label><input type="submit" value="驗證"/></div></form><a>驗證結果:</a><p style="color: red">{{msg}}</p> </body> </html>

展示結果:

驗證碼設置了60秒過期,如果過了60秒再輸入驗證碼是不會成功的

總結

以上是生活随笔為你收集整理的Django之验证码的实现,简单快捷的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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