细致的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 "发送邮件成功"
这里用到了邮件框架中的Mail
和Message
两个类,分别用于邮件的实例创建和邮件类型以及信息的设置。
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技术站