在用戶注冊(cè)、登錄頁面,為了防止暴力請(qǐng)求,可以加入驗(yàn)證碼功能,如果驗(yàn)證碼錯(cuò)誤,則不需要繼續(xù)處理,可以減輕一些服務(wù)器的壓力
使用驗(yàn)證碼也是一種有效的防止crsf的方法
驗(yàn)證碼效果如下圖:
驗(yàn)證碼視圖
新建viewsUtil.py,定義函數(shù)verifycode
此段代碼用到了PIL中的Image、ImageDraw、ImageFont模塊,需要先安裝Pillow(3.4.1)包,
詳細(xì)文檔參考 http://pillow.readthedocs.io/en/3.4.x/
Image表示畫布對(duì)象
ImageDraw表示畫筆對(duì)象
ImageFont表示字體對(duì)象,ubuntu的字體路徑為“/usr/share/fonts/truetype/freefont”
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
from django.http import HttpResponse def verifycode(request): #引入繪圖模塊 from PIL import Image, ImageDraw, ImageFont #引入隨機(jī)函數(shù)模塊 import random #定義變量,用于畫面的背景色、寬、高 bgcolor = (random.randrange(20, 100), random.randrange( 20, 100), 255) width = 100 height = 25 #創(chuàng)建畫面對(duì)象 im = Image.new('RGB', (width, height), bgcolor) #創(chuàng)建畫筆對(duì)象 draw = ImageDraw.Draw(im) #調(diào)用畫筆的point()函數(shù)繪制噪點(diǎn) for i in range(0, 100): xy = (random.randrange(0, width), random.randrange(0, height)) fill = (random.randrange(0, 255), 255, random.randrange(0, 255)) draw.point(xy, fill=fill) #定義驗(yàn)證碼的備選值 str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0' #隨機(jī)選取4個(gè)值作為驗(yàn)證碼 rand_str = '' for i in range(0, 4): rand_str += str1[random.randrange(0, len(str1))] #構(gòu)造字體對(duì)象 font = ImageFont.truetype('FreeMono.ttf', 23) #構(gòu)造字體顏色 fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255)) #繪制4個(gè)字 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor) draw.text((25, 2), rand_str[1], font=font, fill=fontcolor) draw.text((50, 2), rand_str[2], font=font, fill=fontcolor) draw.text((75, 2), rand_str[3], font=font, fill=fontcolor) #釋放畫筆 del draw #存入session,用于做進(jìn)一步驗(yàn)證 request.session['verifycode'] = rand_str #內(nèi)存文件操作 import io buf = io.StringIO() #將圖片保存在內(nèi)存中,文件類型為png im.save(buf, 'png') #將內(nèi)存中的圖片數(shù)據(jù)返回給客戶端,MIME類型為圖片png return HttpResponse(buf.getvalue(), 'image/png') |
配置url
在urls.py中定義請(qǐng)求驗(yàn)證碼視圖的url
1
2
3
4
5
|
from . import viewsUtil urlpatterns = [ url(r'^verifycode/$', viewsUtil.verifycode), ] |
顯示驗(yàn)證碼
•在模板中使用img標(biāo)簽,src指向驗(yàn)證碼視圖
1
|
< img id = 'verifycode' src = "/verifycode/" alt = "CheckCode" /> |
•啟動(dòng)服務(wù)器,查看顯示成功
•擴(kuò)展:點(diǎn)擊“看不清,換一個(gè)”時(shí),可以換一個(gè)新的驗(yàn)證碼
1
2
3
4
5
6
7
8
9
10
|
< script type = "text/javascript" src = "/static/jquery-1.12.4.min.js" ></ script > < script type = "text/javascript" > $(function(){ $('#verifycodeChange').css('cursor','pointer').click(function() { $('#verifycode').attr('src',$('#verifycode').attr('src')+1) }); }); </ script > < img id = 'verifycode' src = "/verifycode/?1" alt = "CheckCode" /> < span id = 'verifycodeChange' >看不清,換一個(gè)</ span > |
•為了能夠?qū)崿F(xiàn)提交功能,需要增加form和input標(biāo)簽
1
2
3
4
5
6
7
|
< form method = 'post' action = '/verifycodeValid/' > < input type = "text" name = "vc" > < img id = 'verifycode' src = "/verifycode/?1" alt = "CheckCode" /> < span id = 'verifycodeChange' >看不清,換一個(gè)</ span > < br > < input type = "submit" value = "提交" > </ form > |
驗(yàn)證
•接收請(qǐng)求的信息,與session中的內(nèi)容對(duì)比
1
2
3
4
5
6
7
8
|
from django.http import HttpResponse def verifycodeValid(request): vc = request.POST['vc'] if vc.upper() == request.session['verifycode']: return HttpResponse('ok') else: return HttpResponse('no') |
•配置驗(yàn)證處理的url
1
2
3
|
urlpatterns = [ url(r'^verifycodeValid/$', views.verifycodeValid), ] |
以上這篇基于Django的python驗(yàn)證碼(實(shí)例講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/venz-seventeen/p/7709110.html