驗證碼
- 在用戶注冊、登錄頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續處理,可以減輕一些服務器的壓力
- 使用驗證碼也是一種有效的防止crsf的方法
- 驗證碼效果如下圖:
驗證碼視圖
- 新建viewsUtil.py,定義函數verifycode
- 此段代碼用到了PIL中的Image、ImageDraw、ImageFont模塊,需要先安裝Pillow(3.4.1)包,詳細文檔參考http://pillow.readthedocs.io/en/3.4.x/
- Image表示畫布對象
- ImageDraw表示畫筆對象
-
ImageFont表示字體對象,ubuntu的字體路徑為“/usr/share/fonts/truetype/freefont”
-
代碼如下:
from django.http import HttpResponse
def verifycode(request):
#引入繪圖模塊
from PIL import Image, ImageDraw, ImageFont
#引入隨機函數模塊
import random
#定義變量,用於畫面的背景色、寬、高
bgcolor = (random.randrange(20, 100), random.randrange(
20, 100), 255)
width = 100
height = 25
#創建畫面對象
im = Image.new('RGB', (width, height), bgcolor)
#創建畫筆對象
draw = ImageDraw.Draw(im)
#調用畫筆的point()函數繪制噪點
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)
#定義驗證碼的備選值
str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
#隨機選取4個值作為驗證碼
rand_str = ''
for i in range(0, 4):
rand_str += str1[random.randrange(0, len(str1))]
#構造字體對象
font = ImageFont.truetype('FreeMono.ttf', 23)
#構造字體顏色
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
#繪制4個字
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,用於做進一步驗證
request.session['verifycode'] = rand_str
#內存文件操作
import io
buf = io.StringIO()
#將圖片保存在內存中,文件類型為png
im.save(buf, 'png')
#將內存中的圖片數據返回給客戶端,MIME類型為圖片png
return HttpResponse(buf.getvalue(), 'image/png')
配置url
- 在urls.py中定義請求驗證碼視圖的url
from . import viewsUtil
urlpatterns = [
url(r'^verifycode/$', viewsUtil.verifycode),
]
顯示驗證碼
- 在模板中使用img標簽,src指向驗證碼視圖
<img id='verifycode' src="/verifycode/" alt="CheckCode"/>
- 啟動服務器,查看顯示成功
- 擴展:點擊“看不清,換一個”時,可以換一個新的驗證碼
<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'>看不清,換一個</span>
- 為了能夠實現提交功能,需要增加form和input標簽
<form method='post' action='/verifycodeValid/'>
<input type="text" name="vc">
<img id='verifycode' src="/verifycode/?1" alt="CheckCode"/>
<span id='verifycodeChange'>看不清,換一個</span>
<br>
<input type="submit" value="提交">
</form>
驗證
- 接收請求的信息,與session中的內容對比
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')
- 配置驗證處理的url
urlpatterns = [
url(r'^verifycodeValid/$', views.verifycodeValid),
]