基于Django的python驗證碼(實例講解)
驗證碼
在用戶注冊、登錄頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續(xù)處理,可以減輕一些服務(wù)器的壓力
使用驗證碼也是一種有效的防止crsf的方法
驗證碼效果如下圖:

驗證碼視圖
新建viewsUtil.py,定義函數(shù)verifycode
此段代碼用到了PIL中的Image、ImageDraw、ImageFont模塊,需要先安裝Pillow(3.4.1)包,
詳細(xì)文檔參考 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
#引入隨機函數(shù)模塊
import random
#定義變量,用于畫面的背景色、寬、高
bgcolor = (random.randrange(20, 100), random.randrange(
20, 100), 255)
width = 100
height = 25
#創(chuàng)建畫面對象
im = Image.new('RGB', (width, height), bgcolor)
#創(chuàng)建畫筆對象
draw = ImageDraw.Draw(im)
#調(diào)用畫筆的point()函數(shù)繪制噪點
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))]
#構(gòu)造字體對象
font = ImageFont.truetype('FreeMono.ttf', 23)
#構(gòu)造字體顏色
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,用于做進(jì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中定義請求驗證碼視圖的url
from . import viewsUtil urlpatterns = [ url(r'^verifycode/$', viewsUtil.verifycode), ]
顯示驗證碼
•在模板中使用img標(biāo)簽,src指向驗證碼視圖
<img id='verifycode' src="/verifycode/" alt="CheckCode"/>
•啟動服務(wù)器,查看顯示成功
•擴(kuò)展:點擊“看不清,換一個”時,可以換一個新的驗證碼
<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>
•為了能夠?qū)崿F(xiàn)提交功能,需要增加form和input標(biāo)簽
<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中的內(nèi)容對比
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), ]
以上這篇基于Django的python驗證碼(實例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問題
這篇文章主要介紹了pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問題,針對問題整理了spark操作hive表的幾種方式,需要的朋友可以參考下2021-08-08
Python Numpy實現(xiàn)計算矩陣的均值和標(biāo)準(zhǔn)差詳解
NumPy(Numerical Python)是Python的一種開源的數(shù)值計算擴(kuò)展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表結(jié)構(gòu)要高效的多。本文主要介紹用NumPy實現(xiàn)計算矩陣的均值和標(biāo)準(zhǔn)差,感興趣的小伙伴可以了解一下2021-11-11
DJANGO-ALLAUTH社交用戶系統(tǒng)的安裝配置
django-allauth是集成了local用戶系統(tǒng)和social用戶系統(tǒng),其social用戶系統(tǒng)可以掛載多個賬戶。也是一個流行度非常高的Django user系統(tǒng),我們這里簡單介紹下,分享下個人的使用經(jīng)驗2014-11-11
Python數(shù)據(jù)標(biāo)準(zhǔn)化的實例分析
在本篇文章里小編給大家整理了關(guān)于Python數(shù)據(jù)標(biāo)準(zhǔn)化的實例內(nèi)容,有需要的朋友們可以測試學(xué)習(xí)下。2021-08-08
Python之DataFrame輸出為csv\txt\xlsx文件問題
這篇文章主要介紹了Python之DataFrame輸出為csv\txt\xlsx文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

