基於Django的python驗證碼

驗證碼

  • 在用戶註冊、登陸頁面,爲了防止暴力請求,能夠加入驗證碼功能,若是驗證碼錯誤,則不須要繼續處理,能夠減輕一些服務器的壓力
  • 使用驗證碼也是一種有效的防止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」javascript

  • 代碼以下:css

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),
]
相關文章
相關標籤/搜索