中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用python怎么實現一個驗證碼功能

發布時間:2020-12-10 15:57:43 來源:億速云 閱讀:234 作者:Leah 欄目:開發技術

利用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,在瀏覽器上就可以看到驗證碼生成了

利用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="{% url 'app01:get_code' %}" >
  <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="{% 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' %}"+"&#63;id="+Math.random())
    })
  })
</script>
</body>
</html>

看完上述內容,你們掌握利用python怎么實現一個驗證碼功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

从江县| 南澳县| 滦平县| 西林县| 青龙| 阿拉善右旗| 南和县| 杭锦后旗| 阿坝| 睢宁县| 开阳县| 青龙| 顺义区| 桂东县| 墨脱县| 岢岚县| 平邑县| 云梦县| 礼泉县| 涿州市| 江孜县| 岫岩| 临洮县| 九龙县| 红河县| 大荔县| 始兴县| 商丘市| 锡林浩特市| 和林格尔县| 铁岭县| 漳平市| 都兰县| 荆门市| 道真| 兴国县| 虹口区| 家居| 壤塘县| 刚察县| 八宿县|