日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用python實現一個簡單的驗證碼

瀏覽:25日期:2022-07-02 17:03:16

我們經常在登錄一個網站,或者注冊的時候需要輸入一個驗證碼,有時候覺得很煩,因為有些驗證碼不僅復雜還看不清,許多用戶就會因為這些而懶得再登錄或者注冊之類的。既然驗證碼會造成流失用戶的風險,為什么大家都還要使用驗證碼呢?這是驗證碼在一定程度上起到保護網站安全的作用,比如防止大規模惡意注冊(比如手機驗證碼形式,一機一戶),再比如反爬蟲(至少不會輕易讓你爬取數據)等,你看用戶基數最大的12306,就會有各種驗證碼。既然驗證碼這么重要,它的原理是什么?是怎么實現的?它的原理其實很簡單,就是在服務器端生成驗證碼,發送給客戶端,并以圖像格式顯示。客戶端提交所顯示的驗證碼,服務端接收并進行比較,若比對失敗則不能實現登錄或注冊,反之成功后跳轉相應界面。

我們知道了其原理,實現起來就很簡單了,現在網絡上也有各種各樣已經做好的驗證碼,我們完全可以拿來即用。但是為了更好的理解其原理,我們來手擼一個簡單的驗證碼,以下是在Django中實現。

簡單的驗證碼

(1)、我們在urls.py中定義一條路由,如下:

url(r’getcode’, views.get_code, name='get_code'),

(2)、我們定義一個視圖函數get_code(),如下:

from io import BytesIOfrom PIL import Image, ImageDraw, ImageFontfrom django.conf import settingsfrom django.shortcuts import render, HttpResponse, redirectdef get_code(request): ''' 手擼一個驗證碼 ''' # 定義圖像顏色模型 mode = 'RGB' # 定義圖像尺寸 size = (200, 100) # 定義背景色 bg_color = (255, 0, 0) # 創建圖像 image = Image.new(mode=mode, size=size, color=bg_color) # 創建畫布 image_draw = ImageDraw.Draw(image, mode=mode) # 創建字體,第一個參數是字體,第二個參數是字體大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 創建一個驗證碼 verify_code = 'Joke' # 生成驗證碼 fill_color = (255,255,255) for i in range(4): image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color) # 保存圖像 fp = BytesIO() image.save(fp, 'png') return HttpResponse(fp.getvalue(), content_type='image/png')

其中settings.FONT_PATH是我預先定義好的字段,如下

STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'statics'),]FONT_PATH = os.path.join(os.path.join(STATICFILES_DIRS[0], 'fonts'),'constan.ttf')

然后我們我們啟動服務python manager.py runserver,在瀏覽器上就可以看到驗證碼生成了

用python實現一個簡單的驗證碼

能是實現了,但是我們現在是自定義了一個驗證碼字段,我們是需要隨機生成驗證碼,而且字體顏色,背景顏色這些也不要定死了,然后我們再生成一些干擾點,我們對代碼進行如下重構:

def get_code(request): ''' 手擼一個驗證碼 ''' # 定義圖像顏色模型 mode = 'RGB' # 定義圖像尺寸 size = (200, 100) # 定義背景色 bg_color = (get_color(), get_color(), get_color()) # 創建圖像 image = Image.new(mode=mode, size=size, color=bg_color) # 創建畫布 image_draw = ImageDraw.Draw(image, mode=mode) # 創建字體,第一個參數是字體,第二個參數是字體大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 創建一個驗證碼 # verify_code = 'Joke' verify_code = get_verify_code() # 生成驗證碼 # fill_color = (255,255,255) for i in range(4): fill_color = (get_color(),get_color(),get_color()) image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color) # 加入干擾點 for i in range(10000): fill_color = (get_color(),get_color(),get_color()) xy = (random.randrange(200), random.randrange(100)) image_draw.point(xy=xy,fill=fill_color) # 保存圖像 fp = BytesIO() image.save(fp, 'png') return HttpResponse(fp.getvalue(), content_type='image/png')def get_color(): '''隨機獲取顏色''' return random.randrange(256)def get_verify_code(): '''隨機獲取驗證碼''' verify_code = ’’.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for x in range(4)) return verify_code

然后我們重啟應用,刷新頁面如下

用python實現一個簡單的驗證碼

是不是有點神似了?下面我們創建一個簡單的login頁面,來實際應用一下驗證碼。

簡單的登錄頁面

(1)、創建一個路由

url(r’login’,views.login, name='login'),

(2)、創建一個Login的視圖函數

def login(request): '''登錄頁面''' if request.method == 'POST': pass return render(request, 'login.html')

(3)、創建一個login.html的template

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Login</title></head><body><form action='{% url ’app01:login’ %}' method='post'>{% csrf_token %} <span>用戶名:</span><input type='text' name='username'> <br> <span>驗證碼:</span><input type='text' name='verify_code'> <br> <img src='http://m.b3g6.com/bcjs/{% url ’app01:get_code’ %}' alt=''> <br> <button>登錄</button></form></body></html>

然后重啟服務,瀏覽器訪問如下

用python實現一個簡單的驗證碼

現在我們只是簡單的搭建起了流程,我們需要的功能還沒有實現,我們需要的功能有:1、驗證碼校驗2、點擊圖片自動刷新驗證碼3、忽略大小寫

我們現在對項目進行重構,如下:(1)、我們在get_code視圖函數添加一行代碼,如下

# 創建一個驗證碼 # verify_code = 'Joke' verify_code = get_verify_code()# 加入session request.session[’verify_code’] = verify_code ......

(2)、修改login視圖函數,如下

def login(request): '''登錄頁面''' if request.method == 'POST': storage_code = request.session.get('verify_code') submit_code = request.POST.get('verify_code') if storage_code.lower() == submit_code.lower(): return HttpResponse('登錄成功') return render(request, 'login.html')

(3)、修改login.html代碼如下

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Login</title></head><body><form action='{% url ’app01:login’ %}' method='post'> {% csrf_token %} <span>用戶名:</span><input type='text' name='username'> <br> <span>驗證碼:</span><input type='text' name='verify_code'> <br> <img src='http://m.b3g6.com/bcjs/{% url ’app01:get_code’ %}' alt='' name='verify_image'> <br> <button>登錄</button></form><script src='https://cdn.bootcss.com/jquery/3.2.0/jquery.js'></script><script> $(function () { $('img').on('click', function () { console.log('來了啊') $(this).attr('src','{% url ’app01:get_code’ %}'+'?id='+Math.random()) }) })</script></body></html>

然后就可以愉快的玩耍了,是不是很簡單呢?

以上就是用python實現一個簡單的驗證碼的詳細內容,更多關于python 實現驗證碼的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品一二| 国产日产精品_国产精品毛片| 久久精品国产精品亚洲毛片| 国产精品videosex极品| 91精品在线免费视频| 欧美一区二区三区久久| 久久精品av麻豆的观看方式| 国产欧美日韩亚洲一区二区三区| 久久国产麻豆精品| 日韩av午夜在线观看| 久久激情五月婷婷| 精品国产一区二区三区性色av| 国产精品亚洲产品| 精品视频国产| 欧美日韩在线网站| 老司机久久99久久精品播放免费| 一区二区三区国产在线| 日韩福利视频一区| 欧美国产先锋| 亚洲深夜视频| 黄色成人精品网站| 亚洲精品影视| 久久不见久久见中文字幕免费| 国产精品精品国产一区二区| 最新中文字幕在线播放| 激情自拍一区| 午夜久久av| 久久99国产精品视频| 久久精品亚洲人成影院| 麻豆91精品| 美女国产一区二区三区| 九九色在线视频| 中文字幕成人| 欧美激情福利| 欧美中文字幕一区二区| 亚洲九九精品| 国内自拍视频一区二区三区| 久久精品影视| 日韩国产高清在线| 国模精品一区| 欧美日韩精品一本二本三本| 欧美在线91| 成人看片网站| 日韩亚洲精品在线观看| 国产成人精品福利| 美女精品一区| 国产成年精品| 久久福利毛片| 国产美女高潮在线| 一区二区不卡| 激情视频网站在线播放色| 久久亚洲图片| 国产成人精选| 丝袜美腿成人在线| 精品视频一区二区三区四区五区 | 国产亚洲精品久久久久婷婷瑜伽| 国产探花一区| 欧美日韩中文一区二区| 日韩精品成人| 久久狠狠婷婷| 欧美激情 亚洲a∨综合| 国产免费成人| 五月激情久久| 国产欧美一区二区三区国产幕精品| 在线日韩一区| 久久av综合| 一区二区自拍| 久久久久久婷| 日本va欧美va精品发布| 蜜桃视频欧美| 国产在线视频欧美一区| 中文字幕亚洲精品乱码| 麻豆精品蜜桃| 国产精品一级在线观看| 午夜在线一区二区| 日韩欧美三级| 欧美国产中文高清| 日本一区免费网站| 9国产精品视频| 在线一区av| 欧美激情福利| 免费成人在线影院| 亚洲高清不卡| 国产一区一一区高清不卡| 青草综合视频| 亚洲精品成人一区| 香蕉久久99| 黑森林国产精品av| 国产乱子精品一区二区在线观看| 国产模特精品视频久久久久| 日韩中文在线播放| 日本一区二区高清不卡| 久久狠狠亚洲综合| 中文字幕成人| 欧美资源在线| 欧美特黄a级高清免费大片a级| 里番精品3d一二三区| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 丝袜av一区| 久草精品视频| 国产精品.xx视频.xxtv| 91在线成人| 91精品丝袜国产高跟在线| 中文一区一区三区免费在线观| 欧美成人综合| 久久精品影视| 亚洲一级黄色| 激情欧美日韩一区| 欧美日韩一二三四| 久久一区二区中文字幕| 视频二区不卡| 日本午夜大片a在线观看| 精品无人区麻豆乱码久久久 | 美女久久精品| 九九99久久精品在免费线bt| 欧美激情三区| 麻豆免费精品视频| 麻豆免费精品视频| 麻豆国产一区| 久久亚洲精品中文字幕| 六月丁香综合在线视频| 麻豆成人av在线| 国产精品久久久久蜜臀| 香蕉成人av| 一区二区三区视频免费观看| 蜜桃视频欧美| 国产精品免费看| 中文字幕一区二区三区四区久久| 亚洲午夜久久| 欧美日韩夜夜| 久久香蕉网站| 福利视频一区| 99成人在线视频| 久久高清免费| aa国产精品| 蜜臀av国产精品久久久久| 亚洲综合色婷婷在线观看| 亚洲视频二区| 国产精品亚洲综合久久| 精品中文字幕一区二区三区| 国产不卡一区| 136国产福利精品导航网址| 黄色成人精品网站| 午夜视频一区二区在线观看| 国产精品一国产精品| 国产一区二区三区探花| 91tv亚洲精品香蕉国产一区| 亚洲高清二区| 伊人久久亚洲| 欧美国产精品| 久久久精品五月天| 免费在线欧美视频| 国产精品午夜一区二区三区| 成人片免费看| 在线亚洲一区| 日本不卡高清视频| 蜜桃精品视频| 亚洲1234区| 亚洲色图综合| 国产精品永久| 亚洲高清激情| 91成人精品在线| 国产一区一一区高清不卡| 丝袜av一区| 婷婷综合福利| 欧美激情另类| 男女精品网站| 久久精品一区二区国产| 激情欧美亚洲| 国产美女视频一区二区| 国产高清不卡| 日韩在线视频一区二区三区| 国产成人免费| 天使萌一区二区三区免费观看| 国产图片一区| 亚洲午夜一级| 欧美国产亚洲精品| 国产亚洲在线观看| 久久wwww| 夜夜嗨av一区二区三区网站四季av| 国产日产高清欧美一区二区三区| 久久91导航| 97久久精品| 欧美亚洲国产精品久久| 国产日产精品_国产精品毛片| 欧美成人精品| 精品国产乱码| 中文一区一区三区免费在线观| 精品久久在线| 亚洲有吗中文字幕| 快播电影网址老女人久久| 日韩精品视频一区二区三区| 亚洲www啪成人一区二区| 日韩国产在线观看| 久久亚洲国产| 黄色网一区二区| 日韩中文av| 波多野结衣一区| 电影91久久久| 欧美片第1页综合|