Django之验证码的实现,简单快捷的方法
Django之驗(yàn)證碼的實(shí)現(xiàn),簡(jiǎn)單快捷的方法
實(shí)現(xiàn)驗(yàn)證碼隨網(wǎng)頁(yè)變動(dòng)即時(shí)刷新,實(shí)現(xiàn)有期限時(shí)間
請(qǐng)確保安裝好pillow
直接show code:
0、路由urs.py
1、定義生成驗(yàn)證碼views.py
import os, random, time, string, io from django.shortcuts import render from django.http import HttpResponse from PIL import Image, ImageDraw, ImageFont # 生成驗(yàn)證碼,# 可以直接可以在html中的img引用 def captcha(request):# 定義背景顏色、寬、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width = 100height = 50# 創(chuàng)建畫面對(duì)象img = Image.new('RGB', (width, height), bgcolor)# 創(chuàng)建畫筆對(duì)象draw = ImageDraw.Draw(img)# 調(diào)用畫筆的point()函數(shù)繪制驗(yàn)證碼的干擾點(diǎn)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)# 定義驗(yàn)證碼的備選值_str = string.digits + string.ascii_letters# 隨機(jī)取四個(gè)值作為驗(yàn)證碼rand_codes = ''.join(random.sample(_str, 4))# 定義字體大小size = int(min(width / len(rand_codes), height))# 構(gòu)造字體對(duì)象font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', size)# 構(gòu)造字體顏色,四個(gè)字顏色不同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# # 將驗(yàn)證碼緩存入session,后面做進(jìn)一步驗(yàn)證,注意應(yīng)該在這里存入的時(shí)候變?yōu)樾?#xff0c;# 否則驗(yàn)證碼過(guò)期就變成了空,再進(jìn)行l(wèi)ower()操作會(huì)拋出異常request.session['verify_code'] = rand_codes.lower()# 驗(yàn)證碼有效時(shí)間60秒request.session.set_expiry(60)print("生成的驗(yàn)證碼是:", rand_codes)print("它應(yīng)該是與session存的驗(yàn)證碼一樣:", request.session['verify_code'])buf = io.BytesIO()img.save(buf, 'png')# 將內(nèi)存中的圖片數(shù)據(jù)返回給客戶端,MIME類型為png圖片return HttpResponse(buf.getvalue(), 'image/png')# 這樣也行# return HttpResponse(buf.getvalue(), 'jpg')關(guān)鍵點(diǎn)在于io.BytesIO()函數(shù)和它的getvalue()函數(shù)
BytesIO()使用的是Binary I/O(也叫buffered I/O)的方法,它的處理對(duì)象必須是字節(jié)類對(duì)象(bytes-like object),生成的對(duì)象是字節(jié)(bytes),這個(gè)過(guò)程不執(zhí)行解碼、編碼和換行轉(zhuǎn)換。這種類型的數(shù)據(jù)流可以用于所有非文本類的的數(shù)據(jù)(也就是二進(jìn)制文件或二進(jìn)制讀取的文本,如圖片、gif,以二進(jìn)制讀取的.txt,.py,.html等文件)。
而getvalue()返回儲(chǔ)存在緩存中對(duì)象整個(gè)內(nèi)容的字節(jié)
總之只要理解為:BytesIO()直接以二進(jìn)制方式讀取jpg、png、gif等文件并將它存于緩存中,而getvalue()方法則是將它從緩存中取出來(lái),還原成原來(lái)的樣子顯示給我們看。
2、路由導(dǎo)航函數(shù)views.py
# 測(cè)試頁(yè) def testpage(request):verify_msg = ''_captcha_submit = request.POST.get('verify_code').lower()# 注意這里提交的code需要小寫,而服務(wù)器的code已經(jīng)小寫,# 這樣分開做是為了避免當(dāng)驗(yàn)證碼過(guò)期了變?yōu)榭罩等〔坏絪ession拋出異常_captcha_server = request.session.get('verify_code')if _captcha_server == _captcha_submit:return render(request, 'axf/test.html', {"msg": "驗(yàn)證成功"})else:verify_msg = '驗(yàn)證失敗'return render(request, 'testapp/test.html', {"msg": verify_msg})3、模板下的HTML頁(yè)test.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>測(cè)試頁(yè)面</title> </head> <body><form action="/test/" method="post"><img src="/captcha/" alt="驗(yàn)證碼"/><div><label><input type="text" name="verify_code" placeholder="請(qǐng)輸入圖片中驗(yàn)證碼"></label><input type="submit" value="驗(yàn)證"/></div></form><a>驗(yàn)證結(jié)果:</a><p style="color: red">{{msg}}</p> </body> </html>展示結(jié)果:
驗(yàn)證碼設(shè)置了60秒過(guò)期,如果過(guò)了60秒再輸入驗(yàn)證碼是不會(huì)成功的
總結(jié)
以上是生活随笔為你收集整理的Django之验证码的实现,简单快捷的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 医学影像设备学_2020考研:影像大咖告
- 下一篇: 智慧交通day02-车流量检测实现03: