Django之验证码的实现,简单快捷的方法
生活随笔
收集整理的這篇文章主要介紹了
Django之验证码的实现,简单快捷的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Django之驗證碼的實現,簡單快捷的方法
實現驗證碼隨網頁變動即時刷新,實現有期限時間
請確保安裝好pillow
直接show code:
0、路由urs.py
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之验证码的实现,简单快捷的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医学影像设备学_2020考研:影像大咖告
- 下一篇: 智慧交通day02-车流量检测实现03: