Django 生成登陸驗(yàn)證碼代碼分享
環(huán)境準(zhǔn)備
python3.52
pycharm5.05
Pillow
自制的驗(yàn)證碼工具包/utils/check_code
驗(yàn)證碼的作用
防惡意破解密碼:防止,使用程序或機(jī)器人惡意去試密碼.為了提高用戶(hù)的體驗(yàn),用戶(hù)輸入錯(cuò)誤以后,才會(huì)要求輸入驗(yàn)證碼.
防論壇灌水:這個(gè)是很常見(jiàn)的。有一種程序叫做頂帖機(jī),如果無(wú)限制的刷,整個(gè)論壇可能到處是拉圾信息,比如,百度貼吧,你只要是新用戶(hù)或者剛剛關(guān)注的貼吧,要是發(fā)帖,會(huì)馬上出現(xiàn)驗(yàn)證碼。
有效防止注冊(cè),以防,使用程序或機(jī)器人去無(wú)限制注冊(cè)賬號(hào).
防刷票,網(wǎng)上有很多投票類(lèi)的網(wǎng)站.
2.驗(yàn)證碼的原理
驗(yàn)證碼于服務(wù)器端生成,發(fā)送給客戶(hù)端,并以圖像格式顯示??蛻?hù)端提交所顯示的驗(yàn)證碼,客戶(hù)端接收并進(jìn)行比較,若比對(duì)失敗則不能實(shí)現(xiàn)登錄或注冊(cè),反之成功后跳轉(zhuǎn)相應(yīng)界面。
實(shí)現(xiàn)
生成驗(yàn)證碼
點(diǎn)擊可刷新
代碼:
注意: 配置setting.py ; 創(chuàng)建數(shù)據(jù)庫(kù)!
/utils/check_code
#!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小寫(xiě)字母,去除可能干擾的i,l,o,z _upper_cases = _letter_cases.upper() # 大寫(xiě)字母 _numbers = ''.join(map(str, range(3, 10))) # 數(shù)字 init_chars = ''.join((_letter_cases, _upper_cases, _numbers)) def create_validate_code(size=(120, 30), chars=init_chars, img_type="GIF", mode="RGB", bg_color=(238,99,99), fg_color=(0, 0, 255), font_size=18, font_type="Monaco.ttf", length=4, draw_lines=True, n_line=(1, 2), draw_points=True, point_chance=2): """ @todo: 生成驗(yàn)證碼圖片 @param size: 圖片的大小,格式(寬,高),默認(rèn)為(120, 30) @param chars: 允許的字符集合,格式字符串 @param img_type: 圖片保存的格式,默認(rèn)為GIF,可選的為GIF,JPEG,TIFF,PNG @param mode: 圖片模式,默認(rèn)為RGB @param bg_color: 背景顏色,默認(rèn)為白色 @param fg_color: 前景色,驗(yàn)證碼字符顏色,默認(rèn)為藍(lán)色#0000FF @param font_size: 驗(yàn)證碼字體大小 @param font_type: 驗(yàn)證碼字體,默認(rèn)為 ae_AlArabiya.ttf @param length: 驗(yàn)證碼字符個(gè)數(shù) @param draw_lines: 是否劃干擾線 @param n_lines: 干擾線的條數(shù)范圍,格式元組,默認(rèn)為(1, 2),只有draw_lines為T(mén)rue時(shí)有效 @param draw_points: 是否畫(huà)干擾點(diǎn) @param point_chance: 干擾點(diǎn)出現(xiàn)的概率,大小范圍[0, 100] @return: [0]: PIL Image實(shí)例 @return: [1]: 驗(yàn)證碼圖片中的字符串 """ width, height = size # 寬高 # 創(chuàng)建圖形 img = Image.new(mode, size, bg_color) draw = ImageDraw.Draw(img) # 創(chuàng)建畫(huà)筆 def get_chars(): """生成給定長(zhǎng)度的字符串,返回列表格式""" return random.sample(chars, length) def create_lines(): """繪制干擾線""" line_num = random.randint(*n_line) # 干擾線條數(shù) for i in range(line_num): # 起始點(diǎn) begin = (random.randint(0, size[0]), random.randint(0, size[1])) # 結(jié)束點(diǎn) end = (random.randint(0, size[0]), random.randint(0, size[1])) draw.line([begin, end], fill=(0, 0, 0)) def create_points(): """繪制干擾點(diǎn)""" chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100] for w in range(width): for h in range(height): tmp = random.randint(0, 100) if tmp > 100 - chance: draw.point((w, h), fill=(0, 0, 0)) def create_strs(): """繪制驗(yàn)證碼字符""" c_chars = get_chars() strs = ' %s ' % ' '.join(c_chars) # 每個(gè)字符前后以空格隔開(kāi) font = ImageFont.truetype(font_type, font_size) font_width, font_height = font.getsize(strs) draw.text(((width - font_width) / 3, (height - font_height) / 3), strs, font=font, fill=fg_color) return ''.join(c_chars) if draw_lines: create_lines() if draw_points: create_points() strs = create_strs() # 圖形扭曲參數(shù) params = [1 - float(random.randint(1, 2)) / 100, 0, 0, 0, 1 - float(random.randint(1, 10)) / 100, float(random.randint(1, 2)) / 500, 0.001, float(random.randint(1, 2)) / 500 ] img = img.transform(size, Image.PERSPECTIVE, params) # 創(chuàng)建扭曲 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 濾鏡,邊界加強(qiáng)(閾值更大) return img, strs
urls.py
from django.conf.urls import url from django.contrib import admin from web import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^yzhome.html',views.yz_home ), url(r'^yanzheng.html',views.yanzheng ), ]
views.py
from django.shortcuts import render from django.shortcuts import HttpResponse from utils.check_code import create_validate_code from django.shortcuts import redirect from io import BytesIO # Create your views here. def yz_home(requset): if requset.method=='GET': return render(requset,'yz_home.html') else: return HttpResponse('ok') def yanzheng(requset): f=BytesIO() img,code=create_validate_code() requset.session['check_code']=code img.save(f,'PNG') return HttpResponse(f.getvalue())
/templates/yz_home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>驗(yàn)證碼</title> </head> <body> <form action="yz_home.html" method="POST"> <div> 用戶(hù)名:<input type="text" placeholder="用戶(hù)名" name="username"></div> <div>密碼:<input type="password" placeholder="密碼" name="pwa"></div> <div>驗(yàn)證碼:<input type="text" name="yzm"></div> <img src="/yanzheng.html" onclick="shuaxin(this);"> <div><input type="submit" value="確認(rèn)"></div> <script src="/static/js/jquery-1.12.4.js"> </script> <script> function shuaxin(ths){ {# ths.src = ths.src + "?"#} var i =$(ths).prop("src") $(ths).prop("src",i+"?") } </script> </form> </body> </html>
效果圖
知識(shí)點(diǎn)總結(jié):
<img src="/yanzheng.html" onclick="shuaxin(this);"> <script> function shuaxin(ths){ ths.src = ths.src + "?" } </script>
=
<img src="/yanzheng.html" onclick="shuaxin(this);"> <script src="/static/js/jquery-1.12.4.js"> </script> <script> function shuaxin(ths){ var i =$(ths).prop("src") $(ths).prop("src",i+"?") } </script>
jQueryObject.prop( propertyName [, value ] )
設(shè)置或返回指定屬性propertyName的值。如果指定了value參數(shù),則表示設(shè)置屬性propertyName的值為value;如果沒(méi)有指定value參數(shù),則表示返回屬性propertyName的值。
總結(jié)
以上就是本文關(guān)于Django 生成登陸驗(yàn)證碼代碼分享的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
pycharm無(wú)法安裝cv2模塊問(wèn)題及解決方案
這篇文章主要介紹了pycharm無(wú)法安裝cv2模塊問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05CentOS6.9 Python環(huán)境配置(python2.7、pip、virtualenv)
這篇文章主要介紹了CentOS6.9 Python環(huán)境配置(python2.7、pip、virtualenv)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05Pytorch+PyG實(shí)現(xiàn)GraphSAGE過(guò)程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實(shí)現(xiàn)GraphSAGE過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Python內(nèi)置函數(shù)int()的具體使用
這篇文章主要為大家介紹了Python內(nèi)置函數(shù)int()的具體使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03python線程池threadpool實(shí)現(xiàn)篇
這篇文章主要為大家詳細(xì)介紹了python線程池threadpool的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04