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

python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼及驗(yàn)證碼的動(dòng)態(tài)刷新實(shí)例

 更新時(shí)間:2019年10月14日 08:31:32   作者:呱唧_T_呱唧  
在本篇文章里小編給大家整理的是關(guān)于python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼的相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。

下列代碼都是以自己的項(xiàng)目實(shí)例講述的,相關(guān)的文本內(nèi)容很少,主要說明全在代碼注釋中

自制圖形驗(yàn)證碼

這里所說的圖形驗(yàn)證碼都是自制的圖形,通過畫布、畫筆、畫筆字體的顏色繪制而成的。將驗(yàn)證碼封裝成一個(gè)類比較好管理,代碼里有絕對(duì)詳細(xì)的注釋,當(dāng)然大家可以直接復(fù)制。

里面涉及的字體都是從系統(tǒng)電腦上自帶的,大家直接復(fù)制當(dāng)前目錄下就可以了。

主目錄/utils/captcha/__init__.py

import random
import string

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


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

  # 構(gòu)建一個(gè)驗(yàn)證碼源文本
  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)

  # 用來繪制干擾點(diǎn)
  @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())

  # 生成隨機(jī)顏色
  @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))

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

  # 用來隨機(jī)生成一個(gè)字符串(包括英文和數(shù)字)
  @classmethod
  def gene_text(cls, numbers):
    # numbers是生成驗(yàn)證碼的位數(shù)
    return " ".join(random.sample(cls.SOURCE, numbers))

  # 生成驗(yàn)證碼
  @classmethod
  def gene_graph_captcha(cls):
    # 驗(yàn)證碼圖片的寬高
    width, height = cls.size
    # 創(chuàng)建圖片
    image = Image.new("RGBA", (width, height), cls.__gene_random_color(0, 100))
    # 驗(yàn)證碼的字體
    font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize)
    # 創(chuàng)建畫筆
    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)
    # 繪制干擾點(diǎn)
    cls.__gene_points(draw, 10, width, height)
    with open("captcha.png", "wb") as fp:
      image.save(fp)
    return text, image

顯示圖形驗(yàn)證碼

一般圖形驗(yàn)證碼都是在表單中,這樣短時(shí)間內(nèi)的數(shù)據(jù)及建議保存在redis緩存中(用戶點(diǎn)擊動(dòng)態(tài)刷新圖形驗(yàn)證碼)。首先我們繪制圖形驗(yàn)證碼保存到項(xiàng)目的目錄下(入口文件是主目錄(項(xiàng)目目錄)app.py文件,圖片也保存到主目錄下),然后通過url地址訪問自制的圖形驗(yàn)證碼(這里我只添加主要的代碼)

主目錄/common/views.py

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

  # BytesIO:字節(jié)流
  out = BytesIO()
  # 保存圖片
  image.save(out, "png")
  # 存儲(chǔ)完圖片,將文件的指針指向文件頭,使下次保存圖片能覆蓋前面保存的圖片,節(jié)省空間
  out.seek(0)
  # 訪問圖片,并將其作為一個(gè)響應(yīng)返回給前臺(tái)
  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="圖形驗(yàn)證碼">
    <span class="input-group-addon captcha-addon">
      <img id="captcha-img" class="captcha-img" src="{{ url_for("common.graph_captcha") }}" alt="">
    </span>
  </div>
</div>

動(dòng)態(tài)刷新驗(yàn)證碼

無非就是再生成一張圖形驗(yàn)證碼,通過url再次訪問就可以,但是這樣做是非常麻煩的,這里我很難解釋(很難?。。。?,大家就直接復(fù)制代碼吧,這個(gè)代碼就是點(diǎn)擊圖片生成一個(gè)新的url訪問圖片

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

var cpparam = {
  setParam: function(href, key, value){
    //重新加載整個(gè)頁面
    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;
  }
};

對(duì)應(yīng)html的js文件就需要實(shí)現(xiàn)元素(圖片)點(diǎn)擊刷新圖片,調(diào)用上面的變量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);
  });
});

以上就是本次介紹的關(guān)于python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。

相關(guān)文章

  • Python Unittest原理及基本使用方法

    Python Unittest原理及基本使用方法

    這篇文章主要介紹了Python Unittest原理及基本使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python學(xué)習(xí)之shell腳本的使用詳解

    Python學(xué)習(xí)之shell腳本的使用詳解

    這篇文章主要為大家分析一個(gè)python庫–sh(系統(tǒng)調(diào)用),主要內(nèi)容包括其使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04
  • 利用python實(shí)現(xiàn)萬年歷的查詢

    利用python實(shí)現(xiàn)萬年歷的查詢

    本篇文章主要給大家分享的是python實(shí)現(xiàn)萬年歷的查詢,利用python做能夠?qū)崿F(xiàn)萬年歷查詢的一個(gè)小功能,感興趣的小伙伴可以參考一下
    2021-10-10
  • python正則表達(dá)式對(duì)字符串的查找匹配

    python正則表達(dá)式對(duì)字符串的查找匹配

    正則表達(dá)式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”),下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式對(duì)字符串的查找匹配的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • python中的字典操作及字典函數(shù)

    python中的字典操作及字典函數(shù)

    本篇文章給大家介紹了python中的字典,包括字典的操作,字典函數(shù)實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2018-01-01
  • Python使用OpenCV對(duì)圖像進(jìn)行縮放功能

    Python使用OpenCV對(duì)圖像進(jìn)行縮放功能

    這篇文章主要介紹了Python使用OpenCV對(duì)圖像進(jìn)行縮放功能,文中給大家提到了兩種調(diào)用方式及OpenCV中pryUp和pryDown的用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 如何基于python實(shí)現(xiàn)不鄰接植花

    如何基于python實(shí)現(xiàn)不鄰接植花

    這篇文章主要介紹了如何基于python實(shí)現(xiàn)不鄰接植花,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Pyramid Mako模板引入helper對(duì)象的步驟方法

    Pyramid Mako模板引入helper對(duì)象的步驟方法

    ylons中的mako模板,默認(rèn)會(huì)引入一個(gè)helper對(duì)象,我們可以在里面擴(kuò)展方法,應(yīng)對(duì)在模板輸出時(shí)候會(huì)常用的操作,那么在Pyramid中如何默認(rèn)引入同樣的輔助類到模板中
    2013-11-11
  • 一文學(xué)會(huì)利用python解決文章付費(fèi)限制問題

    一文學(xué)會(huì)利用python解決文章付費(fèi)限制問題

    本篇文章主要介紹利用Python爬蟲爬取付費(fèi)文章,適合練習(xí)爬蟲基礎(chǔ)同學(xué),文中描述和代碼示例很詳細(xì),干貨滿滿,感興趣的小伙伴快來一起學(xué)習(xí)吧
    2023-05-05
  • python版百度語音識(shí)別功能

    python版百度語音識(shí)別功能

    這篇文章為大家詳細(xì)主要介紹了python版百度語音識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評(píng)論