下面是关于“Python + Flask 实现简单的验证码系统”的完整攻略。
简介
验证码是一种用于区分人类用户和计算机程序的图像识别技术。在Web应用程序中,验证码被广泛地应用于注册、登录等需要用户提交信息的场景中,以保证提交表单的用户是真实的人类用户而不是自动化程序。本文将介绍如何使用Python语言和Flask框架实现一个简单的验证码系统。
环境设置
首先需要安装Flask和Pillow库。可以使用pip安装这两个库,具体命令如下所示:
pip install Flask Pillow
实现过程
生成验证码图片
我们可以先来实现一个函数,用于生成验证码图片。
import random
from PIL import Image, ImageDraw, ImageFont
# 生成验证码图片
def generate_code(size=(120, 40), length=4, font_size=32):
# 随机生成验证码字符
code = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length))
# 创建一个图像
img = Image.new('RGB', size, (255, 255, 255))
# 创建一个可绘制的对象
draw = ImageDraw.Draw(img)
# 设置字体
font = ImageFont.truetype('arial.ttf', font_size)
# 绘制验证码字符
for i in range(length):
x = size[0] / (length + 1) * (i + 1)
y = random.randint(0, size[1] - font_size)
draw.text((x, y), code[i], (0, 0, 0), font=font)
# 添加干扰点
for i in range(size[0] * size[1] // 20):
x = random.randint(0, size[0] - 1)
y = random.randint(0, size[1] - 1)
draw.point((x, y), fill=(0, 0, 0))
# 添加干扰线
for i in range(3):
x1 = random.randint(0, size[0] // 3)
y1 = random.randint(0, size[1] - 1)
x2 = random.randint(size[0] * 2 // 3, size[0] - 1)
y2 = random.randint(0, size[1] - 1)
draw.line((x1, y1, x2, y2), fill=(0, 0, 0))
# 返回验证码字符和图像
return code, img
这个函数接受三个参数,size表示生成图片的尺寸,length表示验证码字符的个数,font_size表示字体大小。该函数通过使用Pillow库生成一个空的图像对象,然后使用ImageDraw类绘制验证码字符、干扰点和干扰线,最后返回验证码字符和图像对象。
构建Flask应用程序
现在我们可以基于Flask框架构建一个Web应用程序,用于生成和显示验证码图片。
from flask import Flask, Response
# 创建一个Flask应用
app = Flask(__name__)
# 显示验证码图片
@app.route('/code/')
def show_code():
code, img = generate_code()
output = BytesIO()
img.save(output, format='JPEG')
response = Response(output.getvalue())
response.headers['Content-Type'] = 'image/jpeg'
response.headers['Cache-Control'] = 'no-store'
response.headers['Pragma'] = 'no-cache'
session['code'] = code
return response
# 运行应用
if __name__ == '__main__':
app.run()
在这个应用程序中,我们定义了一个路由方法show_code()
,该方法调用generate_code()
方法生成验证码图像,然后使用BytesIO类将图像数据写入内存,最后将图像数据作为响应返回到Web浏览器页面。注意,在返回响应头的时候需要将Cache-Control
和Pragma
字段设置为预防Web浏览器缓存验证码图像。
检验验证码
现在我们已经能够生成和显示验证码图像了,但是如何验证用户输入的验证码是否正确呢?我们可以在Web浏览器端添加一个表单元素来让用户输入验证码,然后在提交表单时,将表单数据发送到服务器端进行验证。这里我们通过Flask的session
机制来实现验证码验证。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>验证码示例</title>
</head>
<body>
<h1>验证码示例</h1>
<hr>
<p>请输入下面的验证码:</p>
<form method="POST" action="/">
<input type="text" name="code">
<img src="/code/" alt="验证码">
<input type="submit" value="提交">
</form>
</body>
</html>
这个示例代码以HTML的形式呈现一个验证码表单。表单中包含一个文本框和一个验证码图像,用户需要在文本框中输入验证码,并点击提交按钮提交表单数据。这里我们使用POST方法将表单数据提交到服务器端。
在服务器端,我们可以编写如下代码来验证验证码是否正确:
# 验证验证码
@app.route('/', methods=['GET', 'POST'])
def check_code():
if request.method == 'POST':
code = request.form.get('code', '').strip()
if 'code' in session and code.lower() == session['code'].lower():
return '验证码输入正确'
else:
return '验证码输入错误'
else:
return render_template('index.html')
这个方法首先判断表单数据是以POST方法提交过来的,然后获取表单数据中的验证码字符串。接着,如果服务器端的session
对象中保存有验证码字符串并且表单数据中的验证码字符串与服务器端的验证码字符串相等,那么返回“验证码输入正确”字符串,否则返回“验证码输入错误”字符串。
示例代码
以上就是实现一个简单的验证码系统的完整攻略了。为了方便读者可以查看完整的示例代码,我将完整代码放在了一个GitHub仓库中,链接为 https://github.com/garyhao/flask-captcha。
在代码仓库中,有两个Python代码文件:captcha.py
和app.py
。captcha.py
文件中包含了生成验证码图片的代码,app.py
文件则是完整的Flask应用程序代码。此外,还有一个HTML模板文件index.html
,用于呈现验证码表单。
OK,以上就是关于“Python + Flask 实现简单的验证码系统”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python + Flask 实现简单的验证码系统 - Python技术站