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

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

用python實現(xiàn)一個簡單的驗證碼

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

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

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

簡單的驗證碼

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

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

(2)、我們定義一個視圖函數(shù)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) # 創(chuàng)建圖像 image = Image.new(mode=mode, size=size, color=bg_color) # 創(chuàng)建畫布 image_draw = ImageDraw.Draw(image, mode=mode) # 創(chuàng)建字體,第一個參數(shù)是字體,第二個參數(shù)是字體大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 創(chuàng)建一個驗證碼 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實現(xiàn)一個簡單的驗證碼

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

def get_code(request): ''' 手擼一個驗證碼 ''' # 定義圖像顏色模型 mode = 'RGB' # 定義圖像尺寸 size = (200, 100) # 定義背景色 bg_color = (get_color(), get_color(), get_color()) # 創(chuàng)建圖像 image = Image.new(mode=mode, size=size, color=bg_color) # 創(chuàng)建畫布 image_draw = ImageDraw.Draw(image, mode=mode) # 創(chuàng)建字體,第一個參數(shù)是字體,第二個參數(shù)是字體大小 image_font = ImageFont.truetype(settings.FONT_PATH, 100) # 創(chuàng)建一個驗證碼 # 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實現(xiàn)一個簡單的驗證碼

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

簡單的登錄頁面

(1)、創(chuàng)建一個路由

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

(2)、創(chuàng)建一個Login的視圖函數(shù)

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

(3)、創(chuàng)建一個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://www.b3g6.com/bcjs/{% url ’app01:get_code’ %}' alt=''> <br> <button>登錄</button></form></body></html>

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

用python實現(xiàn)一個簡單的驗證碼

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

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

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

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

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://www.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實現(xiàn)一個簡單的驗證碼的詳細內(nèi)容,更多關于python 實現(xiàn)驗證碼的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
深夜福利视频一区二区| 日本不卡视频在线| 精品视频在线一区二区在线| 国产欧美在线| 国产精品亚洲二区| 国产精品www.| 欧美久久精品| 国产精品久久久久毛片大屁完整版| 日本视频一区二区| 国产精品亲子伦av一区二区三区| 国产精品超碰| 超碰在线99| 久久国产电影| 久久高清一区| 亚洲免费一区三区| 91精品国产自产精品男人的天堂 | 国产精品久一| 国产精品一区二区中文字幕| 精品高清久久| 欧美日韩免费观看视频| 精品1区2区3区4区| 午夜电影一区| 欧美激情aⅴ一区二区三区 | 久久影院一区| 亚洲欧美日本日韩| 日本午夜精品视频在线观看| 精品国产精品国产偷麻豆| 成人午夜亚洲| 亚洲国产成人精品女人| 日韩精品免费观看视频| 日本久久综合| 亚洲综合精品四区| 国产美女亚洲精品7777| 日韩欧美视频专区| 亚洲小说春色综合另类电影| 久久不卡国产精品一区二区| 久久精品国产68国产精品亚洲| 日韩中文字幕一区二区高清99| 久久精品国产在热久久| 国产一区二区三区自拍| 日韩高清一区二区| 日韩在线观看一区| 久久电影一区| 久久精品亚洲| 日韩一区欧美二区| 精品视频网站| 日韩专区一卡二卡| 精品国产乱码久久久久久樱花| av一区二区高清| 国产精品自在| 亚洲国产不卡| 麻豆视频一区| 老牛国产精品一区的观看方式| 欧美国产另类| 日韩精品一级中文字幕精品视频免费观看 | 国产资源在线观看入口av| 国产一区二区精品| 久久av综合| 亚洲一区二区三区高清| 免费观看亚洲天堂| 在线一区免费观看| 国产精品久久久久久久久久久久久久久| 激情久久中文字幕| 欧美激情福利| 免费在线观看视频一区| 中文字幕在线高清| 日本aⅴ亚洲精品中文乱码 | 欧美日韩国产观看视频| 视频一区二区三区在线| 福利一区二区免费视频| 日本中文字幕视频一区| 午夜av成人| 久草精品视频| 欧美一级网址| 鲁大师成人一区二区三区| 欧美sm一区| 乱一区二区av| 91麻豆精品| 蜜臀久久99精品久久久久宅男 | 国产精品片aa在线观看 | 国产精品自在| 日韩影院在线观看| 久久九九精品| 国产成人精品一区二区三区在线| 欧美一区免费| 亚洲另类av| 午夜宅男久久久| av亚洲免费| 久久精品二区三区| 狠狠躁少妇一区二区三区| 国产激情精品一区二区三区| 日本视频一区二区| 美女尤物久久精品| 国产精品97| 亚洲一级网站| 亚洲成人精品| 播放一区二区| 日韩欧美一区二区三区免费观看| 精品国产欧美日韩一区二区三区| 国产探花在线精品一区二区| 日本不卡的三区四区五区| 日韩精品一区第一页| 一区在线观看| 亚洲精品在线观看91| 久久久久国产精品一区三寸| 国产黄大片在线观看| 国产成人精品一区二区三区免费| 91精品日本| 日本视频一区二区| 日本午夜免费一区二区 | 久久不见久久见免费视频7 | 免费在线观看视频一区| 免费日韩一区二区| 国产精品日韩久久久| 红桃视频国产一区| 日韩视频一区| 国产精品日韩久久久| 欧美粗暴jizz性欧美20| 日本久久成人网| 99热国内精品| 亚洲成人三区| 99视频+国产日韩欧美| 99在线精品免费视频九九视| 日韩视频在线一区二区三区 | 久久久91麻豆精品国产一区| 久久国产免费看| 欧美亚洲三级| 国产精品调教| 精品伊人久久| 色网在线免费观看| 国产99久久| 久久亚洲一区| 91成人福利| 欧美激情久久久久久久久久久| 久久影院资源站| av资源亚洲| 亚洲精品91| 亚洲色图国产| 国产欧美另类| 精品91福利视频| 鲁鲁在线中文| 亚洲网站视频| 视频一区国产视频| 日本强好片久久久久久aaa| 国产精品久久久久9999高清| 国产一区二区精品福利地址| 欧洲一级精品| 亚洲主播在线| 国产乱子精品一区二区在线观看| 精品视频97| 亚洲午夜黄色| 深夜福利亚洲| 美女视频一区在线观看| 亚洲成a人片| 久久高清国产| 欧美在线精品一区| 国产精品二区不卡| 亚州av乱码久久精品蜜桃| 日本亚洲最大的色成网站www| 国产极品久久久久久久久波多结野| 国产盗摄——sm在线视频| 欧美69视频| 日韩精品1区2区3区| 精品日韩一区| 国产农村妇女精品一二区| 91欧美极品| 成午夜精品一区二区三区软件| 久久久影院免费| 日韩精品三级| av资源亚洲| 视频在线观看一区| 欧美aⅴ一区二区三区视频| 91精品在线观看国产| 日本91福利区| 成人午夜国产| 青青草伊人久久| 久久国产小视频| 国产美女撒尿一区二区| 国内精品福利| 国产精品亚洲片在线播放| 精品丝袜在线| 欧美一级一区| 国产综合色产| 老司机精品视频网| 久久国产精品99国产| 国产精品久久久免费| 五月婷婷亚洲| 免费在线亚洲| 免费人成精品欧美精品| 国产精品久久久久蜜臀| 日韩中文字幕视频网| 欧美日韩亚洲在线观看| 国产精品久久国产愉拍| 妖精视频成人观看www| 久久精品国产福利| 亚洲精品系列| 999精品一区| 久久影视三级福利片| 亚洲一区二区三区在线免费| 日本а中文在线天堂|