基於Django的python驗證碼,djangopython

來源:互聯網
上載者:User

基於Django的python驗證碼,djangopython
驗證碼

  • 在使用者註冊、登入頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續處理,可以減輕一些伺服器的壓力
  • 使用驗證碼也是一種有效防止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 HttpResponsedef 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 viewsUtilurlpatterns = [    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 HttpResponsedef 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),]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.