python web框架Flask——圖形驗證碼及驗證碼的動態刷新

来源:https://www.cnblogs.com/aitiknowledge/archive/2019/10/13/11669098.html
-Advertisement-
Play Games

下列代碼都是以自己的項目實例講述的,相關的文本內容很少,主要說明全在代碼註釋中 自製圖形驗證碼 這裡所說的圖形驗證碼都是自製的圖形,通過畫布、畫筆、畫筆字體的顏色繪製而成的。將驗證碼封裝成一個類比較好管理,代碼里有絕對詳細的註釋,當然大家可以直接複製。 裡面涉及的字體都是從系統電腦上自帶的,大家直接 ...


下列代碼都是以自己的項目實例講述的,相關的文本內容很少,主要說明全在代碼註釋中

自製圖形驗證碼  

  這裡所說的圖形驗證碼都是自製的圖形,通過畫布、畫筆、畫筆字體的顏色繪製而成的。將驗證碼封裝成一個類比較好管理,代碼里有絕對詳細的註釋,當然大家可以直接複製。

裡面涉及的字體都是從系統電腦上自帶的,大家直接複製當前目錄下就可以了。

主目錄/utils/captcha/__init__.py

import random
import string

# Image:一個畫布
# ImageDraw:一個畫筆
# ImageFont:畫筆的字體
from PIL import Image, ImageDraw, ImageFont


# Captcha驗證碼
class Captcha(object):
    # 生成4位數的驗證碼
    numbers = 4
    # 驗證碼圖片的寬度和高度
    size = (100, 30)
    # 驗證碼字體大小
    fontsize = 25
    # 加入干擾線的條數
    line_number = 2

    # 構建一個驗證碼源文本
    SOURCE = list(string.ascii_letters)
    for index in range(0, 10):
        SOURCE.append(str(index))

    # 用來繪製干擾線
    @classmethod
    def __gene_line(cls, draw, width, height):
        begin = (random.randint(0, width), random.randint(0, height))
        end = (random.randint(0, width), random.randint(0, height))
        draw.line([begin, end], fill=cls.__gene_random_color(), width=2)

    # 用來繪製干擾點
    @classmethod
    def __gene_points(cls, draw, point_chance, width, height):
        # 大小限在【0, 100】中
        chance = min(100, max(0, int(point_chance)))
        for w in range(width):
            for h in range(height):
                tmp = random.randint(0, 100)
                if tmp > 100 - chance:
                    draw.point((w, h), fill=cls.__gene_random_color())

    # 生成隨機顏色
    @classmethod
    def __gene_random_color(cls, start=0, end=255):
        random.seed()
        return (random.randint(start, end),
                random.randint(start, end),
                random.randint(start, end))

    # 隨機選擇一個字體
    @classmethod
    def __gene_random_font(cls):
        fonts = [
            "PAPYRUS.TTF",
            "CENTAUR.TTF",
            "Inkfree.ttf",
            "verdana.ttf",
        ]
        font = random.choice(fonts)
        return "utils/captcha/"+font

    # 用來隨機生成一個字元串(包括英文和數字)
    @classmethod
    def gene_text(cls, numbers):
        # numbers是生成驗證碼的位數
        return " ".join(random.sample(cls.SOURCE, numbers))

    # 生成驗證碼
    @classmethod
    def gene_graph_captcha(cls):
        # 驗證碼圖片的寬高
        width, height = cls.size
        # 創建圖片
        image = Image.new("RGBA", (width, height), cls.__gene_random_color(0, 100))
        # 驗證碼的字體
        font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize)
        # 創建畫筆
        draw = ImageDraw.Draw(image)
        # 生成字元串
        text = cls.gene_text(cls.numbers)
        # 獲取字體的尺寸
        font_width, font_height = font.getsize(text)
        # 填充字元串
        draw.text(((width-font_width)/2, (height-font_height)/2),
                  text, font=font, fill=cls.__gene_random_color(150, 255))
        # 繪製干擾線
        for x in range(0, cls.line_number):
            cls.__gene_line(draw, width, height)
        # 繪製干擾點
        cls.__gene_points(draw, 10, width, height)
        with open("captcha.png", "wb") as fp:
            image.save(fp)
        return text, image

顯示圖形驗證碼

  一般圖形驗證碼都是在表單中,這樣短時間內的數據及建議保存在redis緩存中(用戶點擊動態刷新圖形驗證碼)。首先我們繪製圖形驗證碼保存到項目的目錄下(入口文件是主目錄(項目目錄)app.py文件,圖片也保存到主目錄下),然後通過url地址訪問自製的圖形驗證碼(這裡我只添加主要的代碼)

主目錄/common/views.py

@bp.route("/captcha")
def graph_captcha():
    """
    使用定義好的圖形驗證碼類,來製作驗證碼
    以驗證碼為鍵、驗證碼為值(為了用戶的體驗,讓其忽略大小寫)存儲在redis緩存中
    通過BytesIO位元組流的方式保存和訪問圖片
    :return: 圖片響應
    """
    # 獲取驗證碼
    text, image = Captcha.gene_graph_captcha()
    cpcache.set(text.lower(), text.lower())

    # BytesIO:位元組流
    out = BytesIO()
    # 保存圖片
    image.save(out, "png")
    # 存儲完圖片,將文件的指針指向文件頭,使下次保存圖片能覆蓋前面保存的圖片,節省空間
    out.seek(0)
    # 訪問圖片,並將其作為一個響應返回給前臺
    resp = make_response(out.read())
    resp.content_type = "image/png"
    return resp

前端頁面的代碼如下:

<div class="form-group">
    <div class="input-group">
        <input type="text" class="form-control" name="graph_captcha" placeholder="圖形驗證碼">
        <span class="input-group-addon captcha-addon">
            <img id="captcha-img" class="captcha-img" src="{{ url_for("common.graph_captcha") }}" alt="">
        </span>
    </div>
</div>

動態刷新驗證碼

  無非就是再生成一張圖形驗證碼,通過url再次訪問就可以,但是這樣做是非常麻煩的,這裡我很難解釋(很難!!!),大家就直接複製代碼吧,這個代碼就是點擊圖片生成一個新的url訪問圖片

這個文件放在公共的目錄下就可以了

var cpparam = {
    setParam: function(href, key, value){
        //重新載入整個頁面
        var isReplaced = false;
        var urlArray = href.split("?");
        if(urlArray.length > 1){
            var queryArray = urlArray[1].split("&");
            for(var i=0; i < queryArray.length; i++){
                var paramArray = queryArray[i].split("=");
                if(paramArray[0] == key){
                    paramArray[1] = value;
                    queryArray[i] = paramArray.join("=");
                    isReplaced = true;
                    break;
                }
            }
            if(!isReplaced){
                var params = {};
                params[key] = value;
                if(urlArray.length > 1){
                    href = href + "$" + $.param(params);
                }else{
                    href = href + "?" + $.param(params);
                }
            }else{
                var params = queryArray.join("&");
                urlArray[1] = params;
                href = urlArray.join("?");
            }
        }else{
            var param = {};
            param[key] = value;
            if(urlArray.length > 1){
                href = href + "$" + $.param(param);
            }else{
                href = href + "?" + $.param(param);
            }
        }
        return href;
    }
};

  對應html的js文件就需要實現元素(圖片)點擊刷新圖片,調用上面的變數cpparam生成一章圖片並訪問。

$(function(){
   $("#captcha-img").on("click", function(){
       var self = $(this);
       var src = self.attr("src");
       var newsrc = cpparam.setParam(src, "xx", Math.random());
       self.attr("src", newsrc);
   });
});

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2.SpringMVC介紹 2.1.SpringMVC是什麼 SpringMVC是Spring組織下的一個表現層框架。和Struts2一樣。它是Spring框架組織下的一部分。我們可以從Spring的整體結構中看得出來: 2.2.SpringMVC的作用 1.接收Web請求中的參數 2.把處理好的數... ...
  • 場景 SpringCloud學習之運行第一個Eureka程式: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90611451 SpringCloud -創建統一的依賴管理: https://blog.csdn.net/BADAO ...
  • 場景 Spring Cloud 為開發者提供了在分散式系統(配置管理,服務發現,熔斷,路由,微代理,控制匯流排,一次性 Token,全居瑣,Leader 選舉,分散式 Session,集群狀態)中快速構建的工具,使用 Spring Cloud 的開發者可以快速的啟動服務或構建應用、同時能夠快速和雲平臺 ...
  • "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 給定一棵樹$T=(V,E),|V|=2^n 2,|E|=2^n 3$,輸出所有的$x$,使得存在一棵滿二叉樹$T'$,將$T'$中節點$x$的一個兒子刪除並把這個兒子的所有兒子接到$x$下後等於$T$。升序輸出。 $n\le17$。 ...
  • 預設下載安裝完的vscode並不能準確提示和檢測PHP的語法錯誤,需要手動指定一下本機的PHP程式路徑。按下麵的操作配置完後就能在文件保存的時候檢測語法有無錯誤。打開文件->首選項->setting,把PHP的執行路徑填進去,前提是本機已經安裝了PHP程式{ "workbench.sideBar.l ...
  • "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 給定一個$n$個單詞的文本,第$i$個單詞的長度為$len_i$,要求截取文本的一段(單詞必須取整的),分若幹行放,同行詞語用空格分隔,使得每行的長度不超過$m$,最多放$s$行。求截取的單詞數最多的截法。 $n\in[1,10^6 ...
  • 關於spring bean的生命周期,是深入學習spring的基礎,也是難點,本篇文章將採用代碼+圖文結論的方式來闡述spring bean的生命周期, 本篇文章將闡述清楚下圖。 一 項目結構及源碼 1.程式目錄結構 2.applicationContext.xml 3.UserDao.java 二 ...
  • django預設是有一個admin的後臺管理模塊,但是醜,功能也不齊全,但是大神給我們已經集成好了xadmin後臺,我們拿來用即可,但是呢,django已經升級到2.1版本了,xadmin貌似跟不上節奏,那麼在集成過程中咱就一步一步填坑吧,這也是一種學習的過程,遇到錯誤,找到錯誤的地方,看看djan ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...