Django 生成登陸驗證碼代碼分享
環(huán)境準備
python3.52
pycharm5.05
Pillow
自制的驗證碼工具包/utils/check_code
驗證碼的作用
防惡意破解密碼:防止,使用程序或機器人惡意去試密碼.為了提高用戶的體驗,用戶輸入錯誤以后,才會要求輸入驗證碼.
防論壇灌水:這個是很常見的。有一種程序叫做頂帖機,如果無限制的刷,整個論壇可能到處是拉圾信息,比如,百度貼吧,你只要是新用戶或者剛剛關注的貼吧,要是發(fā)帖,會馬上出現(xiàn)驗證碼。
有效防止注冊,以防,使用程序或機器人去無限制注冊賬號.
防刷票,網上有很多投票類的網站.
2.驗證碼的原理
驗證碼于服務器端生成,發(fā)送給客戶端,并以圖像格式顯示??蛻舳颂峤凰@示的驗證碼,客戶端接收并進行比較,若比對失敗則不能實現(xiàn)登錄或注冊,反之成功后跳轉相應界面。
實現(xiàn)
生成驗證碼
點擊可刷新
代碼:
注意: 配置setting.py ; 創(chuàng)建數(shù)據(jù)庫!
/utils/check_code
#!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小寫字母,去除可能干擾的i,l,o,z _upper_cases = _letter_cases.upper() # 大寫字母 _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: 生成驗證碼圖片 @param size: 圖片的大小,格式(寬,高),默認為(120, 30) @param chars: 允許的字符集合,格式字符串 @param img_type: 圖片保存的格式,默認為GIF,可選的為GIF,JPEG,TIFF,PNG @param mode: 圖片模式,默認為RGB @param bg_color: 背景顏色,默認為白色 @param fg_color: 前景色,驗證碼字符顏色,默認為藍色#0000FF @param font_size: 驗證碼字體大小 @param font_type: 驗證碼字體,默認為 ae_AlArabiya.ttf @param length: 驗證碼字符個數(shù) @param draw_lines: 是否劃干擾線 @param n_lines: 干擾線的條數(shù)范圍,格式元組,默認為(1, 2),只有draw_lines為True時有效 @param draw_points: 是否畫干擾點 @param point_chance: 干擾點出現(xiàn)的概率,大小范圍[0, 100] @return: [0]: PIL Image實例 @return: [1]: 驗證碼圖片中的字符串 """ width, height = size # 寬高 # 創(chuàng)建圖形 img = Image.new(mode, size, bg_color) draw = ImageDraw.Draw(img) # 創(chuàng)建畫筆 def get_chars(): """生成給定長度的字符串,返回列表格式""" return random.sample(chars, length) def create_lines(): """繪制干擾線""" line_num = random.randint(*n_line) # 干擾線條數(shù) for i in range(line_num): # 起始點 begin = (random.randint(0, size[0]), random.randint(0, size[1])) # 結束點 end = (random.randint(0, size[0]), random.randint(0, size[1])) draw.line([begin, end], fill=(0, 0, 0)) def create_points(): """繪制干擾點""" 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(): """繪制驗證碼字符""" c_chars = get_chars() strs = ' %s ' % ' '.join(c_chars) # 每個字符前后以空格隔開 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) # 濾鏡,邊界加強(閾值更大) 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>驗證碼</title> </head> <body> <form action="yz_home.html" method="POST"> <div> 用戶名:<input type="text" placeholder="用戶名" name="username"></div> <div>密碼:<input type="password" placeholder="密碼" name="pwa"></div> <div>驗證碼:<input type="text" name="yzm"></div> <img src="/yanzheng.html" onclick="shuaxin(this);"> <div><input type="submit" value="確認"></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>
效果圖
知識點總結:
<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 ] )
設置或返回指定屬性propertyName的值。如果指定了value參數(shù),則表示設置屬性propertyName的值為value;如果沒有指定value參數(shù),則表示返回屬性propertyName的值。
總結
以上就是本文關于Django 生成登陸驗證碼代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
CentOS6.9 Python環(huán)境配置(python2.7、pip、virtualenv)
這篇文章主要介紹了CentOS6.9 Python環(huán)境配置(python2.7、pip、virtualenv)方法,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)GraphSAGE過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04