基于Django的python驗(yàn)證碼(實(shí)例講解)
驗(yàn)證碼
在用戶注冊(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”
代碼如下:
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
from . import viewsUtil urlpatterns = [ url(r'^verifycode/$', viewsUtil.verifycode), ]
顯示驗(yàn)證碼
•在模板中使用img標(biāo)簽,src指向驗(yàn)證碼視圖
<img id='verifycode' src="/verifycode/" alt="CheckCode"/>
•啟動(dòng)服務(wù)器,查看顯示成功
•擴(kuò)展:點(diǎn)擊“看不清,換一個(gè)”時(shí),可以換一個(gè)新的驗(yàn)證碼
<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)簽
<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ì)比
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
urlpatterns = [ url(r'^verifycodeValid/$', views.verifycodeValid), ]
以上這篇基于Django的python驗(yàn)證碼(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Django自定義插件實(shí)現(xiàn)網(wǎng)站登錄驗(yàn)證碼功能
- Django驗(yàn)證碼的生成與使用示例
- python django 實(shí)現(xiàn)驗(yàn)證碼的功能實(shí)例代碼
- Django 生成登陸驗(yàn)證碼代碼分享
- django 發(fā)送手機(jī)驗(yàn)證碼的示例代碼
- Django 登陸驗(yàn)證碼和中間件的實(shí)現(xiàn)
- Django實(shí)現(xiàn)登錄隨機(jī)驗(yàn)證碼的示例代碼
- Django框架驗(yàn)證碼用法實(shí)例分析
- Django框架實(shí)現(xiàn)的普通登錄案例【使用POST方法】
- 詳解Django框架中用戶的登錄和退出的實(shí)現(xiàn)
- Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能示例
相關(guān)文章
pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問題
這篇文章主要介紹了pyspark操作hive分區(qū)表及.gz.parquet和part-00000文件壓縮問題,針對(duì)問題整理了spark操作hive表的幾種方式,需要的朋友可以參考下2021-08-08
Python Numpy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差詳解
NumPy(Numerical Python)是Python的一種開源的數(shù)值計(jì)算擴(kuò)展。這種工具可用來存儲(chǔ)和處理大型矩陣,比Python自身的嵌套列表結(jié)構(gòu)要高效的多。本文主要介紹用NumPy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差,感興趣的小伙伴可以了解一下2021-11-11
Python HTMLTestRunner如何下載生成報(bào)告
這篇文章主要介紹了Python HTMLTestRunner如何下載生成報(bào)告,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
DJANGO-ALLAUTH社交用戶系統(tǒng)的安裝配置
django-allauth是集成了local用戶系統(tǒng)和social用戶系統(tǒng),其social用戶系統(tǒng)可以掛載多個(gè)賬戶。也是一個(gè)流行度非常高的Django user系統(tǒng),我們這里簡單介紹下,分享下個(gè)人的使用經(jīng)驗(yàn)2014-11-11
Python數(shù)據(jù)標(biāo)準(zhǔn)化的實(shí)例分析
在本篇文章里小編給大家整理了關(guān)于Python數(shù)據(jù)標(biāo)準(zhǔn)化的實(shí)例內(nèi)容,有需要的朋友們可以測(cè)試學(xué)習(xí)下。2021-08-08
Python之DataFrame輸出為csv\txt\xlsx文件問題
這篇文章主要介紹了Python之DataFrame輸出為csv\txt\xlsx文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

