广告位联系
返回顶部
分享到

Python Flask实现图片验证码与邮箱验证码流程

python 来源:互联网 作者:佚名 发布时间:2022-10-09 22:35:39 人浏览
摘要

1. 图片验证码 1.1 工具类-utility.py 将所有和图片验证码有关的方法放在类 ImageCode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import random import string from io import BytesIO from PIL

1. 图片验证码

1.1 工具类-utility.py

将所有和图片验证码有关的方法放在类 ImageCode

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import random

import string

from io import BytesIO

from PIL import Image, ImageFont, ImageDraw

class ImageCode:

    def rand_color(self):

        """生成用于绘制字符串的随机颜色(可以随意指定0-255之间的数字)"""

        red = random.randint(32, 200)

        green = random.randint(22, 255)

        blue = random.randint(0, 200)

        return red, green, blue

    def gen_text(self):

        """生成4位随机字符串"""

        # sample 用于从一个大的列表或字符串中,随机取得N个字符,来构建出一个子列表

        list = random.sample(string.ascii_letters, 5)

        return ''.join(list)

    def draw_verify_code(self):

        """绘制验证码图片"""

        code = self.gen_text()

        width, height = 120, 50  # 设定图片大小,可根据实际需求调整

        im = Image.new('RGB', (width, height), 'white')  # 创建图片对象,并设定背景色为白色

        font = ImageFont.truetype(font='arial.ttf', size=40)  # 选择使用何种字体及字体大小

        draw = ImageDraw.Draw(im)  # 新建ImageDraw对象

        # 绘制字符串

        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()

此时可以在上面的类中加上下面的代码,单独运行一下,看图片验证码是否会生成

1

ImageCode().draw_verify_code()

如果正常运行的话,会默认打开自己电脑的图片查看器,然后显示一张图片验证码

还可以在图片验证码中加上干扰线

在 类ImageCode 中,生成验证码方法 draw_verify_code() 的上面加上绘制干扰线的方法,然后在绘制时进行调用

绘制干扰线方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

def draw_lines(self, draw, num, width, height):

    """

    绘制干扰线

    :param draw: 图片对象

    :param num: 干扰线数量

    :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)

绘制图片验证码时,在 im.show() 前调用上述绘制干扰线的方法

方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

def draw_verify_code(self):

    """绘制验证码图片"""

    code = self.gen_text()

    width, height = 120, 50  # 设定图片大小,可根据实际需求调整

    im = Image.new('RGB', (width, height), 'white')  # 创建图片对象,并设定背景色为白色

    font = ImageFont.truetype(font='arial.ttf', size=40)  # 选择使用何种字体及字体大小

    draw = ImageDraw.Draw(im)  # 新建ImageDraw对象

    # 绘制字符串

    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()

然后再次运行,效果如下:

上述的图片是存储在内存里的,关闭图片后,程序会自动终止

因为最终图片是要返回到前端的,所以上述生成验证码的方法还需再次进行修改,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

def draw_verify_code(self):

    """绘制验证码图片"""

    code = self.gen_text()

    width, height = 120, 50  # 设定图片大小,可根据实际需求调整

    im = Image.new('RGB', (width, height), 'white')  # 创建图片对象,并设定背景色为白色

    font = ImageFont.truetype(font='arial.ttf', size=40)  # 选择使用何种字体及字体大小

    draw = ImageDraw.Draw(im)  # 新建ImageDraw对象

    # 绘制字符串

    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()  # 如需临时调试,可以直接将生成的图片显示出来

    return im, code

1.2 控制层-user.py

将图片返回给前端

1

2

3

4

5

6

7

8

9

10

11

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

将上述控制器注册进程序的主入口 main.py

1

2

3

4

if __name__ == '__main__':

    from controller.user import *

    app.register_blueprint(user)

    app.run(debug=True)  # 使项目已debug方式运行

到这里,图片验证码的后端已全部实现

至于前端的话,大家在自己想要放置图片验证码的地方,加个 img 标签即可,然后 src 属性里的值为上述控制器的接口,如下:

1

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

要想和网上那些点击图片验证码之后,重新生成新的图片验证码的话,就加上一个 onclick 事件

1

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

至于为什么后面要加一个随机数,是因为如果不加的话,前端浏览器识别到是一样的请求时,就不会重新发送,除非你强制刷新页面。但是加个随机数的话,浏览器发现每个请求都是不一样的,就会正常的发送到后端

2. 邮箱验证码

2.1 准备

此次举例使用的是QQ邮箱,使用其他邮箱也可以,操作大致一样

登录自己的QQ邮箱,开通 POP3/SMTP 服务,然后在各自的界面下找到“生成授权码”的按钮,按照各自的流程生成授权码

2.2 工具类-utility.py

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

注意,最好不要将方法放在 类ImageCode,就单独放在外面就可以了,也可以新增一个邮箱类,然后放在里面

本人就直接放在外面

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

from smtplib import SMTP_SSL

from email.mime.text import MIMEText

from email.header import Header

def send_email(self, receiver, ecode):

    """发送邮件"""

    sender = 'XXX <xxxxxxxxx@qq.com>'  # 邮箱账号和发件者签名

    # 定义发送邮件的内容,支持HTML和CSS样式

    content = f"您的邮箱验证码为:<span style='color: red; font-size: 20px;'>{ecode}</span>"

    message = MIMEText(content, 'html', 'utf-8')  # 实例化邮件对象,并指定邮件的关键信息

    # 指定邮件的标题,同样使用utf-8编码

    message['Subject'] = Header('验证码', 'utf-8')

    message['From'] = sender

    message['To'] = receiver

    smtpObj = SMTP_SSL('smtp.qq.com')  # QQ邮件服务器的链接

    smtpObj.login(user='xxxxxxxxx@qq.com', password='授权码')  # 通过自己的邮箱账号和获取到的授权码登录QQ邮箱

    # 指定发件人、收件人和邮件内容

    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

1

2

3

4

5

6

7

8

9

10

11

12

13

@user.route('/ecode', methods=['POST'])

def ecode():

    email = request.form.get('email')

    # 对邮箱进行格式校验

    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  # 将邮箱验证码保存在session中

        return 'send-pass'

    except:

        return 'send-fail'

到这里,邮箱验证码的后端已全部实现


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/wanzijy/article/details/127159822
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计