欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年12月09日 11:42:06   作者:極客運維圈  
這篇文章主要介紹了用python實現(xiàn)一個簡單的驗證碼的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

我們經(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 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)
  # 創(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,在瀏覽器上就可以看到驗證碼生成了

能是實現(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

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

是不是有點神似了?下面我們創(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="{% url 'app01:get_code' %}" alt="">
  <br>
  <button>登錄</button>
</form>

</body>
</html>

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

現(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="{% 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)驗證碼的資料請關注腳本之家其它相關文章!

相關文章

  • python遞歸查詢菜單并轉換成json實例

    python遞歸查詢菜單并轉換成json實例

    本篇文章主要介紹了python遞歸查詢菜單并轉換成json實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • python中正則表達式與模式匹配

    python中正則表達式與模式匹配

    在之前找工作過程中,面試時經(jīng)常被問到會不會python,懂不懂正則表達式。這篇文章主要介紹了python中正則表達式與模式匹配,需要的朋友可以參考下
    2019-05-05
  • Python幫你識破雙11的套路

    Python幫你識破雙11的套路

    一年一度的“雙十一”又要來了,很多人已經(jīng)開始摩拳擦掌,畢竟幾天之后手還在不在就不好說了??纯碢ython幫你識破雙11的套路,需要的朋友可以參考下
    2019-11-11
  • python實現(xiàn)字母閃爍效果的示例代碼

    python實現(xiàn)字母閃爍效果的示例代碼

    本文主要介紹了python實現(xiàn)字母閃爍效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • pycharm配置Anaconda虛擬環(huán)境全過程

    pycharm配置Anaconda虛擬環(huán)境全過程

    這篇文章主要介紹了pycharm配置Anaconda虛擬環(huán)境全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 原來我一直安裝 Python 庫的姿勢都不對呀

    原來我一直安裝 Python 庫的姿勢都不對呀

    平常我都是直接執(zhí)行 pip install 安裝的第三方庫,很多教程也是這么介紹的,一直以來我都認為這是標準的、正確的安裝 Python 第三方庫的姿勢。下面小編給大家分享一篇教程,一起看看吧
    2019-11-11
  • python3基于TCP實現(xiàn)CS架構文件傳輸

    python3基于TCP實現(xiàn)CS架構文件傳輸

    這篇文章主要為大家詳細介紹了python3基于TCP實現(xiàn)CS架構文件傳輸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • CentOS6.5設置Django開發(fā)環(huán)境

    CentOS6.5設置Django開發(fā)環(huán)境

    這篇文章主要為大家詳細介紹了CentOS6.5設置Django開發(fā)環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • python實現(xiàn)websocket的客戶端壓力測試

    python實現(xiàn)websocket的客戶端壓力測試

    這篇文章主要為大家詳細介紹了python實現(xiàn)websocket的客戶端壓力測試,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 在Python中,不用while和for循環(huán)遍歷列表的實例

    在Python中,不用while和for循環(huán)遍歷列表的實例

    今天小編就為大家分享一篇在Python中,不用while和for循環(huán)遍歷列表的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評論