最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Flask實(shí)現(xiàn)圖片驗(yàn)證碼與郵箱驗(yàn)證碼流程詳細(xì)講解

 更新時(shí)間:2022年10月08日 17:03:50   作者:LinTa0  
這篇文章主要介紹了如何利用Python生成隨機(jī)的圖片驗(yàn)證碼與郵箱驗(yàn)證碼,驗(yàn)證碼是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起試試

1. 圖片驗(yàn)證碼

1.1 工具類-utility.py

將所有和圖片驗(yàn)證碼有關(guān)的方法放在類 ImageCode

import random
import string
from io import BytesIO
from PIL import Image, ImageFont, ImageDraw
class ImageCode:
    def rand_color(self):
        """生成用于繪制字符串的隨機(jī)顏色(可以隨意指定0-255之間的數(shù)字)"""
        red = random.randint(32, 200)
        green = random.randint(22, 255)
        blue = random.randint(0, 200)
        return red, green, blue
    def gen_text(self):
        """生成4位隨機(jī)字符串"""
        # sample 用于從一個(gè)大的列表或字符串中,隨機(jī)取得N個(gè)字符,來構(gòu)建出一個(gè)子列表
        list = random.sample(string.ascii_letters, 5)
        return ''.join(list)
    def draw_verify_code(self):
        """繪制驗(yàn)證碼圖片"""
        code = self.gen_text()
        width, height = 120, 50  # 設(shè)定圖片大小,可根據(jù)實(shí)際需求調(diào)整
        im = Image.new('RGB', (width, height), 'white')  # 創(chuàng)建圖片對(duì)象,并設(shè)定背景色為白色
        font = ImageFont.truetype(font='arial.ttf', size=40)  # 選擇使用何種字體及字體大小
        draw = ImageDraw.Draw(im)  # 新建ImageDraw對(duì)象
        # 繪制字符串
        for i in range(4):
            draw.text((5 + random.randint(-3, 3) + 23 * i, 5 + random.randint(-3, 3)),
                      text=code[i], fill=self.rand_color(), font=font)
        im.show()

此時(shí)可以在上面的類中加上下面的代碼,單獨(dú)運(yùn)行一下,看圖片驗(yàn)證碼是否會(huì)生成

ImageCode().draw_verify_code()

如果正常運(yùn)行的話,會(huì)默認(rèn)打開自己電腦的圖片查看器,然后顯示一張圖片驗(yàn)證碼

還可以在圖片驗(yàn)證碼中加上干擾線

在 類ImageCode 中,生成驗(yàn)證碼方法 draw_verify_code() 的上面加上繪制干擾線的方法,然后在繪制時(shí)進(jìn)行調(diào)用

繪制干擾線方法

def draw_lines(self, draw, num, width, height):
    """
    繪制干擾線
    :param draw: 圖片對(duì)象
    :param num: 干擾線數(shù)量
    :param width: 圖片的寬
    :param height: 圖片的高
    :return:
    """
    for num in range(num):
        x1 = random.randint(0, width / 2)
        y1 = random.randint(0, height / 2)
        x2 = random.randint(0, width)
        y2 = random.randint(height / 2, height)
        draw.line(((x1, y1), (x2, y2)), fill='black', width=2)

繪制圖片驗(yàn)證碼時(shí),在 im.show() 前調(diào)用上述繪制干擾線的方法

方法如下:

def draw_verify_code(self):
    """繪制驗(yàn)證碼圖片"""
    code = self.gen_text()
    width, height = 120, 50  # 設(shè)定圖片大小,可根據(jù)實(shí)際需求調(diào)整
    im = Image.new('RGB', (width, height), 'white')  # 創(chuàng)建圖片對(duì)象,并設(shè)定背景色為白色
    font = ImageFont.truetype(font='arial.ttf', size=40)  # 選擇使用何種字體及字體大小
    draw = ImageDraw.Draw(im)  # 新建ImageDraw對(duì)象
    # 繪制字符串
    for i in range(4):
        draw.text((5 + random.randint(-3, 3) + 23 * i, 5 + random.randint(-3, 3)),text=code[i], fill=self.rand_color(), font=font)
    self.draw_lines(draw, 4, width, height)  # 繪制干擾線
    im.show()

然后再次運(yùn)行,效果如下:

上述的圖片是存儲(chǔ)在內(nèi)存里的,關(guān)閉圖片后,程序會(huì)自動(dòng)終止

因?yàn)樽罱K圖片是要返回到前端的,所以上述生成驗(yàn)證碼的方法還需再次進(jìn)行修改,如下:

def draw_verify_code(self):
    """繪制驗(yàn)證碼圖片"""
    code = self.gen_text()
    width, height = 120, 50  # 設(shè)定圖片大小,可根據(jù)實(shí)際需求調(diào)整
    im = Image.new('RGB', (width, height), 'white')  # 創(chuàng)建圖片對(duì)象,并設(shè)定背景色為白色
    font = ImageFont.truetype(font='arial.ttf', size=40)  # 選擇使用何種字體及字體大小
    draw = ImageDraw.Draw(im)  # 新建ImageDraw對(duì)象
    # 繪制字符串
    for i in range(4):
        draw.text((5 + random.randint(-3, 3) + 23 * i, 5 +random.randint(-3, 3)), text=code[i], fill=self.rand_color(), font=font)
        self.draw_lines(draw, 4, width, height)  # 繪制干擾線
    # im.show()  # 如需臨時(shí)調(diào)試,可以直接將生成的圖片顯示出來
    return im, code

1.2 控制層-user.py

將圖片返回給前端

from flask import Blueprint, make_response, session
from common.utility import ImageCode
from module.users import Users
user = Blueprint('user', __name__)
@user.route('/vcode')
def vcode():
    code, bstring = ImageCode().get_code()
    response = make_response(bstring)
    response.headers['Content-Type'] = 'image/jpeg'
    session['vcode'] = code.lower()
    return response

將上述控制器注冊進(jìn)程序的主入口 main.py

if __name__ == '__main__':
    from controller.user import *
    app.register_blueprint(user)
    app.run(debug=True)  # 使項(xiàng)目已debug方式運(yùn)行

到這里,圖片驗(yàn)證碼的后端已全部實(shí)現(xiàn)

至于前端的話,大家在自己想要放置圖片驗(yàn)證碼的地方,加個(gè) img 標(biāo)簽即可,然后 src 屬性里的值為上述控制器的接口,如下:

<img src="/vcode" style="cursor:pointer;"/>

要想和網(wǎng)上那些點(diǎn)擊圖片驗(yàn)證碼之后,重新生成新的圖片驗(yàn)證碼的話,就加上一個(gè) onclick 事件

<img src="/vcode" id="loginvcode" class="col-3" style="cursor:pointer;" onclick="this.src='/vcode?'+Math.random()"/>

至于為什么后面要加一個(gè)隨機(jī)數(shù),是因?yàn)槿绻患拥脑?,前端瀏覽器識(shí)別到是一樣的請求時(shí),就不會(huì)重新發(fā)送,除非你強(qiáng)制刷新頁面。但是加個(gè)隨機(jī)數(shù)的話,瀏覽器發(fā)現(xiàn)每個(gè)請求都是不一樣的,就會(huì)正常的發(fā)送到后端

2. 郵箱驗(yàn)證碼

2.1 準(zhǔn)備

此次舉例使用的是QQ郵箱,使用其他郵箱也可以,操作大致一樣

登錄自己的QQ郵箱,開通 POP3/SMTP 服務(wù),然后在各自的界面下找到“生成授權(quán)碼”的按鈕,按照各自的流程生成授權(quán)碼

2.2 工具類-utility.py

在上述的工具類中新增方法

注意,最好不要將方法放在 類ImageCode,就單獨(dú)放在外面就可以了,也可以新增一個(gè)郵箱類,然后放在里面

本人就直接放在外面

from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.header import Header
def send_email(self, receiver, ecode):
    """發(fā)送郵件"""
    sender = 'XXX <xxxxxxxxx@qq.com>'  # 郵箱賬號(hào)和發(fā)件者簽名
    # 定義發(fā)送郵件的內(nèi)容,支持HTML和CSS樣式
    content = f"您的郵箱驗(yàn)證碼為:<span style='color: red; font-size: 20px;'>{ecode}</span>" 
    message = MIMEText(content, 'html', 'utf-8')  # 實(shí)例化郵件對(duì)象,并指定郵件的關(guān)鍵信息
    # 指定郵件的標(biāo)題,同樣使用utf-8編碼
    message['Subject'] = Header('驗(yàn)證碼', 'utf-8')
    message['From'] = sender
    message['To'] = receiver
    smtpObj = SMTP_SSL('smtp.qq.com')  # QQ郵件服務(wù)器的鏈接
    smtpObj.login(user='xxxxxxxxx@qq.com', password='授權(quán)碼')  # 通過自己的郵箱賬號(hào)和獲取到的授權(quán)碼登錄QQ郵箱
    # 指定發(fā)件人、收件人和郵件內(nèi)容
    smtpObj.sendmail(sender, receiver, str(message))
    smtpObj.quit()
def gen_email_code(self):
    str = random.sample(string.ascii_letters + string.digits, 6)
    return ''.join(str)

2.3 控制層-user.py

@user.route('/ecode', methods=['POST'])
def ecode():
    email = request.form.get('email')
	# 對(duì)郵箱進(jìn)行格式校驗(yàn)
    if not re.match('^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$', email):
        return 'email-invalid'
    code = gen_email_code()
    try:
        send_email(email, code)
        session['ecode'] = code  # 將郵箱驗(yàn)證碼保存在session中
        return 'send-pass'
    except:
        return 'send-fail'

到這里,郵箱驗(yàn)證碼的后端已全部實(shí)現(xiàn)

到此這篇關(guān)于Python Flask實(shí)現(xiàn)圖片驗(yàn)證碼與郵箱驗(yàn)證碼流程詳細(xì)講解的文章就介紹到這了,更多相關(guān)Python驗(yàn)證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python將鄰接矩陣輸出成圖的實(shí)現(xiàn)

    python將鄰接矩陣輸出成圖的實(shí)現(xiàn)

    今天小編就為大家分享一篇python將鄰接矩陣輸出成圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Django xadmin安裝及使用詳解

    Django xadmin安裝及使用詳解

    這篇文章主要介紹了Django xadmin安裝及使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python安裝第三方庫如xlrd的方法

    python安裝第三方庫如xlrd的方法

    這篇文章主要介紹了python安裝第三方庫如xlrd的方法,本文通過兩種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • python 將列表中的字符串連接成一個(gè)長路徑的方法

    python 將列表中的字符串連接成一個(gè)長路徑的方法

    今天小編就為大家分享一篇python 將列表中的字符串連接成一個(gè)長路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python實(shí)現(xiàn)定時(shí)發(fā)送監(jiān)控郵件

    Python實(shí)現(xiàn)定時(shí)發(fā)送監(jiān)控郵件

    這篇文章主要為大家講解如何用python連接郵箱,實(shí)現(xiàn)自動(dòng)發(fā)送監(jiān)控郵件,文中的示例講解詳細(xì),對(duì)我們了解Python有一定的幫助,需要的可以參考一下
    2022-01-01
  • python中l(wèi)ambda函數(shù) list comprehension 和 zip函數(shù)使用指南

    python中l(wèi)ambda函數(shù) list comprehension 和 zip函數(shù)使用指南

    這篇文章主要介紹了python中l(wèi)ambda函數(shù) list comprehension 和 zip函數(shù)使用方法,非常的實(shí)用,有需要的朋友可以參考下
    2014-09-09
  • python入門基礎(chǔ)之用戶輸入與模塊初認(rèn)識(shí)

    python入門基礎(chǔ)之用戶輸入與模塊初認(rèn)識(shí)

    Python的強(qiáng)大之處在于他有非常豐富和強(qiáng)大的標(biāo)準(zhǔn)庫和第三方庫,幾乎你想實(shí)現(xiàn)的任何功能都有相應(yīng)的Python庫支持。下面通過本文給大家介紹python入門基礎(chǔ)之用戶輸入與模塊初認(rèn)識(shí),一起看看吧
    2016-11-11
  • Python matplotlib 動(dòng)畫繪制詳情

    Python matplotlib 動(dòng)畫繪制詳情

    這篇文章主要介紹了Python matplotlib 動(dòng)畫繪制,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • 基于Python實(shí)現(xiàn)格斗小游戲的示例代碼

    基于Python實(shí)現(xiàn)格斗小游戲的示例代碼

    格斗游戲,曾經(jīng)是街機(jī)廳里最火爆的游戲之一,甚至可以把“之一”去掉,那個(gè)年代的格斗游戲就是街機(jī)游戲的王。本文就來用Python實(shí)現(xiàn)一個(gè)簡單的格斗游戲,感興趣的可以了解一下
    2023-03-03
  • Python正則表達(dá)式教程之二:捕獲篇

    Python正則表達(dá)式教程之二:捕獲篇

    什么是捕獲呢?使用小括號(hào)指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(即匹配的內(nèi)容)可以在表達(dá)式或者其他過程中接著用,下面這篇文章就主要介紹了Python正則表達(dá)式中關(guān)于捕獲的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03

最新評(píng)論

龙江县| 永和县| 澄迈县| 新野县| 道真| 谷城县| 伊通| 体育| 建水县| 三门县| 孟连| 绥中县| 拉萨市| 临夏县| 神木县| 邓州市| 江西省| 栖霞市| 十堰市| 遵义县| 徐州市| 凭祥市| 平陆县| 长泰县| 永仁县| 灌阳县| 义乌市| 汝南县| 云林县| 汕头市| 富顺县| 林甸县| 休宁县| 疏勒县| 关岭| 澎湖县| 怀安县| 上思县| 郧西县| 芒康县| 佛学|