Python + Flask 实现简单的验证码系统

下面是关于“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-ControlPragma字段设置为预防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.pyapp.pycaptcha.py文件中包含了生成验证码图片的代码,app.py文件则是完整的Flask应用程序代码。此外,还有一个HTML模板文件index.html,用于呈现验证码表单。

OK,以上就是关于“Python + Flask 实现简单的验证码系统”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python + Flask 实现简单的验证码系统 - Python技术站

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

相关文章

  • 使用Python的Flask框架实现视频的流媒体传输

    使用Python的Flask框架实现视频的流媒体传输可以分为以下步骤: 1. 安装依赖 在开始之前,请确保安装了Flask、OpenCV和FFmpeg库。 2. 准备样例视频 为了演示如何使用Flask实现视频的流媒体传输,需要一个样例视频。你可以从互联网上下载一个视频,例如https://sample-videos.com/video123/mp4/720…

    Flask 2023年5月16日
    00
  • Python-Flask:动态创建表的示例详解

    下面是详细的攻略: 标题:Python-Flask:动态创建表的示例详解 1. 示例一: 在Flask Web框架中,可以通过SQLAlchemy库来实现动态创建数据库表的功能。首先需要导入SQLAlchemy库,并配置数据库连接参数,例如: from flask_sqlalchemy import SQLAlchemy app = Flask(__name…

    Flask 2023年5月15日
    00
  • Python中import导入上一级目录模块及循环import问题的解决

    导入上一级目录模块在Python中十分常见,可以通过修改Python路径或使用相对路径解决。而循环import问题则需要注意模块之间的依赖关系,防止出现无限循环导致程序崩溃问题。本文将详细讲解这两个问题的解决方案,其中包含两个示例代码。 导入上一级目录模块 在Python中,导入上一级目录模块,可以通过修改系统路径添加或使用相对路径来解决。 修改系统路径添加…

    Flask 2023年5月16日
    00
  • Flask框架钩子函数功能与用法分析

    Flask框架钩子函数功能与用法分析 定义 在 Flask 中,钩子函数是指在请求的不同阶段执行的函数,它可以被用于在请求被处理之前或之后添加额外的操作。Flask 框架提供了多个钩子函数,这些函数以装饰器的形式实现,可以很方便地添加到代码中。 功能与用法 钩子函数可以用于多种目的,以下列出了一些常见的用途: 身份验证 from flask import r…

    Flask 2023年5月15日
    00
  • python web框架Flask实现图形验证码及验证码的动态刷新实例

    针对这个话题,我将详细解释如何使用 Flask 实现图形验证码及验证码的动态刷新。 需求分析: 我们的目标是实现两个示例: Example 1:静态图形验证码 Example 2:动态图形验证码 环境部署: 首先,我们需要安装 Flask 和 Pillow 两个库。Flask 用于构建我们的 Web 应用程序,而 Pillow 用于操作图像。 pip ins…

    Flask 2023年5月16日
    00
  • Golang两行代码实现发送钉钉机器人消息

    当你想要通过钉钉机器人来发送消息时,可以使用Golang来实现,且只需要两行代码即可完成。下面是实现的完整攻略: 步骤一:创建钉钉机器人 首先需要在钉钉官网上创建一个机器人,并获取其Webhook URL。具体步骤如下: 登录钉钉开放平台:https://open-dev.dingtalk.com/#/login 点击左侧导航栏中的“自定义机器人管理”。 点…

    Flask 2023年5月16日
    00
  • 基于SQLAlchemy实现操作MySQL并执行原生sql语句

    基于SQLAlchemy实现操作MySQL并执行原生sql语句的完整攻略如下: 安装SQLAlchemy 首先需要安装SQLAlchemy,可以通过pip命令安装: pip install sqlalchemy 连接到MySQL数据库 使用SQLAlchemy连接到MySQL数据库的代码如下: from sqlalchemy import create_en…

    Flask 2023年5月16日
    00
  • 在Python的Flask框架下收发电子邮件的教程

    在Python的Flask框架下收发电子邮件需要使用到Python标准库中的smtplib和email模块。 安装Flask-Mail 在开始之前,需要先安装Flask-Mail。 可以在终端中使用以下命令进行安装: pip install Flask-Mail 或者在服务器/虚拟环境中使用以下命令进行安装: sudo pip install Flask-M…

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