Python Flask实现图片验证码与邮箱验证码流程详细讲解

yizhihongxing

细致的Python Flask实现图片验证码与邮箱验证码流程详细讲解,以下就是教程:

1. 图片验证码的流程

1.1 安装依赖库

首先要安装依赖库,可以使用pip直接安装如下库

pip install flask flask-wtf Pillow
  • Flask是Web框架
  • Flask-wtf是Flask的表单框架
  • Pillow是Python中的图像处理库

1.2 创建Flask应用及路由

在Python文件中,我们需要导入相关的库,用Flask来搭建我们的web应用,代码如下:

from flask import Flask, make_response, request, jsonify, session
from flask_wtf import CSRFProtect
from flask_wtf.csrf import generate_csrf
from PIL import Image, ImageDraw, ImageFont
import random
import io

接下来需要创建Flask实例,并设置一些属性,如下所示:

app = Flask(__name__)
app.config.from_pyfile('config.py')
csrf = CSRFProtect(app)

这里使用了一个叫config.py的配置文件,用来设置一些常规的配置项,如下所示:

#debug模式
DEBUG = True
#安全密钥
SECRET_KEY = 'i-am-a-secret-key'
#CSRF保护
WTF_CSRF_ENABLED = True

接着创建Route来设置URL和URL处理函数,代码如下:

@app.route('/')
def index():
    return 'index page'

@app.route('/gen_captcha', methods=['GET'])
def generate_captcha():
    # 具体生成验证码的代码
    pass

我们目前只是声明了Route方法,函数的实现我们会在后面进行说明。

1.3 开始生成验证码代码

生成验证码的主要三个过程:

  • 生成随机字符串
  • 绘制验证码图像
  • 返回图像

我们分步骤来看。

1.3.1 生成随机字符串

def generate_random():
    return ''.join(random.sample(
        '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 4))

这个函数将会生成长度为4的随机字符串,用于作为验证码的数字。

1.3.2 绘制验证码图像

def generate_captcha_image(random_str):
    image = Image.new('RGB', (100, 38), (255, 255, 255))
    font = ImageFont.truetype("arial.ttf", 24)
    draw = ImageDraw.Draw(image)
    draw.text((10, 10), random_str, font=font, fill=(0, 0, 0))
    for i in range(random.randint(2, 4)):
        start = (random.randint(0, 100), random.randint(0, 38))
        end = (random.randint(0, 100), random.randint(0, 38))
        draw.line([start, end], fill=(0, 0, 0))
    return image

这个方法将会接收一个字符串参数random_str,然后生成相应的验证码图像,步骤如下:

  • 创建100x38大小的白色图像
  • 加载字体,设置字体大小(24),写入随机字符串
  • 随机生成2-4条干扰直线
  • 返回图像

1.3.3 返回图像

@app.route('/gen_captcha', methods=['GET'])
def generate_captcha():
    random_str = generate_random()
    img = generate_captcha_image(random_str)
    buf = io.BytesIO()
    #使用JPEG格式保存图像,然后在HTTP响应中返回图像数据
    img.save(buf, 'JPEG', quality=70)
    buf_str = buf.getvalue()
    response = make_response(buf_str)
    response.headers['Content-Type'] = 'image/jpeg'
    response.headers['Cache-Control'] = 'no-store'
    # 将生成的验证码字符串存入session
    session['captcha'] = random_str
    return response

这个方法实现将验证码图片返回客户端,为防止浏览器缓存,设置了缓存控制响应头,同时将验证码的字符串存储在session中。

1.4 验证码校验

接下来,我们校验验证码输入是否正确。在某个验证需求的位置,我们定义如下接口:

@app.route('/verify_captcha', methods=['POST'])
def verify_captcha():
    captcha = session.pop('captcha', None)
    if not captcha:
        return jsonify({'status': '0', 'msg': '验证码已失效'})
    user_input = request.form.get('captcha', '').strip()
    if user_input.lower() != captcha.lower():
        return jsonify({'status': '0', 'msg': '验证码错误'})
    return jsonify({'status': '1', 'msg': '验证成功'})

其实这个接口就是一个标准的POST Form提交处理,从Session中获取到验证码字符串的值,然后比对用户提交的值,如果一致则表示验证成功,否则就是验证失败。

1.5 完整的示例

完整的样例代码可以到这里查看。

2. 邮箱验证码的流程

2.1 安装依赖库

在我们开始之前,需要先安装如下库:

pip install flask flask-wtf flask-mail
  • Flask是Web框架
  • Flask-mail是Flask邮件框架

2.2 邮箱配置

能够使用发邮件的服务(SMTP)就行,在这里我使用网易邮件来提供SMTP服务,当然,其他也是可以的,如下是配置信息:

EMAIL_SERVER = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_USERNAME = 'Your mail.163.com email address'
EMAIL_PASSWORD = 'Your mail.163.com email password'

注意:这里需要修改‘你的邮箱地址’和‘你的邮箱密码’才能进行使用。

2.3 发送邮件

先创建一个邮件实例对象msg,在构造该对象的过程中需要添加发送者和接收者的信息以及邮件内容,如下所示:

from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)

app.config.update(
    #邮箱服务器
    MAIL_SERVER='smtp.163.com',
    #邮箱端口
    MAIL_PORT=25,
    #邮箱用户名
    MAIL_USERNAME='Your mail.163.com email address',
    #邮箱密码,注意这里是授权码
    MAIL_PASSWORD='Your mail.163.com authorization code',
    #邮箱默认发送者
    MAIL_DEFAULT_SENDER='Your mail.163.com email address'
)

mail = Mail(app)

@app.route("/send_email")
def send_email():
    #收件人的邮箱,多个邮箱用逗号分隔
    recipients = ['123456@163.com']
    #创建邮件
    msg = Message('邮件标题',
                  recipients=recipients)
    #设置邮件内容
    msg.body = '邮件正文 <h1>测试Flask发送邮件!</h1>'
    #发送邮件
    mail.send(msg)
    return "发送邮件成功"

这里用到了邮件框架中的MailMessage两个类,分别用于邮件的实例创建和邮件类型以及信息的设置。

2.4 生成验证码

话不多说直接上代码,如下所示:

def generate_random():
    return ''.join(random.sample(
        '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 4))

def send_email_code(to):
    code = generate_random()
    msg = Message('注册码', recipients=[to])
    msg.body = 'Hello, 您的注册码是:%s , 有效期为5分钟。' % code
    mail.send(msg)
    return code

这个方法用于生成四位数的随机验证码,并将授权码发送到指定邮箱地址。

2.5 完整的示例

完整的样例代码可以到这里查看,更多注释请查看代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Flask实现图片验证码与邮箱验证码流程详细讲解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 使用flask如何获取post请求参数

    获取POST请求参数是常见的需求,在使用Flask框架开发Web应用时,也需要处理POST请求中携带的参数,本文将详细讲解使用Flask如何获取POST请求参数的完整攻略,并提供两条相关的示例,方便读者参考。 获取POST请求参数的方法 Flask中获取POST请求参数的方法主要有以下三种: 使用request.form对象 使用request.get_js…

    Flask 2023年5月16日
    00
  • Flask路由尾部有没有斜杠有什么区别

    Flask作为一款流行的Python Web框架,路由的使用是至关重要的一部分。其中,路由尾部是否包含斜杠这个小细节也是需要注意的。下面,我们就来详细讲解一下“Flask路由尾部有没有斜杠有什么区别”。 为什么要注意路由尾部的斜杠? 在Flask中,如果定义了一个包含斜杠的路由,比如/hello/,那么如果用户访问/hello,Flask会自动将请求重定向到…

    Flask 2023年5月16日
    00
  • 关于Flask 上下文详细介绍

    关于 Flask 上下文的详细介绍,分为两个部分: 一、什么是Flask上下文 在 Flask 中,上下文是指当前应用和请求的状态。可以把上下文看作是一个全局变量,它存储了 Flask 应用的配置信息、请求和响应、Session 和 Cookies 等。在 Flask 中,有两种类型的上下文:应用上下文和请求上下文。 1. 应用上下文 应用上下文是关于Fla…

    Flask 2023年5月15日
    00
  • 5分钟教会你用Docker部署一个Python应用

    下面我将提供一个完整的攻略,教会你如何用 Docker 部署一个 Python 应用。 第一步:安装 Docker 首先,你需要在你的机器上安装 Docker。在这里,我提供两种安装方式。 方式一:通过官方安装脚本进行安装 可以通过 Docker 官方网站提供的安装脚本进行安装。在终端中输入以下命令: curl -sSL https://get.docker…

    Flask 2023年5月16日
    00
  • python实现通过flask和前端进行数据收发

    实现通过Flask和前端进行数据收发的过程大致可以分为以下几个步骤: 1. 安装Flask框架 首先需要安装Flask框架,可以通过pip命令进行安装: pip install Flask 2. 编写后端Flask应用 编写一个简单的Flask应用,实现接收前端数据,处理数据并返回结果。以下是一个示例代码: from flask import Flask, …

    Flask 2023年5月15日
    00
  • 在 Django/Flask 开发服务器上使用 HTTPS

    使用HTTPS是现代Web开发中必不可少的安全手段之一,可以加密Web应用程序和服务器之间的通信,防止敏感数据被恶意截取。在Django/Flask开发服务器上使用HTTPS,可以提高Web应用程序的安全性。下面是详细的攻略: 一、Django 1. 生成证书和密钥 使用openssl在本地主机上生成自签名ssl证书和密钥文件: $ openssl req …

    Flask 2023年5月15日
    00
  • flask开启多线程的具体方法

    下面是关于Flask如何在应用程序中开启多线程的攻略。 1. 前置条件 在开始讲解Flask如何开启多线程之前,我们需要先确保已经满足以下前置条件: 已经安装了Flask和Python(版本要求3.4或更高); 在程序中,需要使用到threading和time模块。 2. Flask开启多线程的方法 在Flask中开启多线程的主要方式是使用Python标准库…

    Flask 2023年5月15日
    00
  • Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍

    下面给您详细讲解“Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍”的完整攻略。 一对多关系 一对多关系适用于一个模型拥有多个其他模型的实例,但是其他模型的实例只属于一个模型实例。比如一个用户可以拥有多篇文章,但是一篇文章只属于一个用户。 在 Flask sqlalchemy 中可以使用 relationship 属性来建立一对多关系,…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部