您好,登錄后才能下訂單哦!
利用python怎么實現一個驗證碼功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
簡單的驗證碼
(1)、我們在urls.py中定義一條路由,如下:
url(r'getcode', views.get_code, name="get_code"),
(2)、我們定義一個視圖函數get_code(),如下:
from io import BytesIO from PIL import Image, ImageDraw, ImageFont from django.conf import settings from django.shortcuts import render, HttpResponse, redirect def 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,在瀏覽器上就可以看到驗證碼生成了
能是實現了,但是我們現在是自定義了一個驗證碼字段,我們是需要隨機生成驗證碼,而且字體顏色,背景顏色這些也不要定死了,然后我們再生成一些干擾點,我們對代碼進行如下重構:
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
然后我們重啟應用,刷新頁面如下
是不是有點神似了?下面我們創建一個簡單的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="{% url 'app01:get_code' %}" > <br> <button>登錄</button> </form> </body> </html>
然后重啟服務,瀏覽器訪問如下
現在我們只是簡單的搭建起了流程,我們需要的功能還沒有實現,我們需要的功能有:
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="{% url 'app01:get_code' %}" 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怎么實現一個驗證碼功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。