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日

相关文章

  • Flask框架之数据交互的实现

    Flask是一款轻巧灵活的Python Web框架,通过Flask框架搭建后端服务可以快速地进行前后端的数据交互。本文将详细讲解Flask框架中数据交互的实现完整攻略,包括使用Flask框架通过GET和POST方式实现前后端数据传递的两个具体示例。 一、GET方式实现数据交互 GET方式是HTTP请求中最常见的一种方式,我们一般通过在URL中进行上传数据来实…

    Flask 2023年5月15日
    00
  • 一个基于flask的web应用诞生 记录用户账户登录状态(6)

    以下是“一个基于flask的web应用诞生 记录用户账户登录状态(6)”的完整攻略: 1. 添加用户注销功能 在用户登录成功后,我们需要给出注销的入口。在html文件中添加以下代码,链接到注销路由: {% if current_user.is_authenticated %} <li class="nav-item"> &lt…

    Flask 2023年5月15日
    00
  • Flask框架的学习指南之制作简单blog系统

    下面我将详细讲解 Flask 框架的学习指南之制作简单 blog 系统的完整攻略,并且会提供两个示例说明。 概述 Flask 是一个 Python Web 开发框架,它基于 Werkzeug WSGI 工具和 Jinja2 模板引擎。Flask 提供了简单易用的 API,并且具有易于扩展的灵活性。制作一个简单的 blog 系统是学习 Flask 框架的一个好…

    Flask 2023年5月15日
    00
  • Python利用Redis计算经纬度距离案例

    下面是关于“Python利用Redis计算经纬度距离”的完整攻略。 简介 在开发一些基于地理位置的应用时,常常需要计算地理位置之间的距离来辅助决策和优化用户体验。Redis 提供了具有地理位置信息存储和计算距离功能的 Geo 数据库,可以快速地处理这种需求,本文将介绍如何使用 Python 利用 Redis 完成地理位置之间距离计算的功能。 环境准备 在开始…

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

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

    Flask 2023年5月15日
    00
  • Flask框架中request、请求钩子、上下文用法分析

    Flask是一个轻量级的Web框架,它使用Python语言,且易于学习和使用。在Flask框架中,request、请求钩子以及上下文是非常重要的概念。本文将详细介绍这些概念的用法分析,并且提供两个示例说明。 request request是Flask框架中处理客户端请求的核心概念之一。通过request对象,你可以获取请求中的数据,例如GET和POST请求中…

    Flask 2023年5月16日
    00
  • django和flask哪个值得研究学习

    Django和Flask的区别 Django和Flask都是Python中流行的Web框架,但是它们在使用方式上有着很大的不同。 Django Django是一个完整的Web框架,提供了一整套Web开发的解决方案。Django包括了ORM、模板引擎、路由系统、Cookie/Session等常用组件,所以在创建一个Web应用时,可以省略掉很多低层次的工作。 D…

    Flask 2023年5月15日
    00
  • python中Flask Web 表单的使用方法介绍

    下面是 Python 中 Flask Web 表单的使用方法介绍: Flask Web 表单 Flask Web 表单(Flask Web Forms)是 Flask 框架的一个扩展,它提供了简单易用的 API 来处理 Web 表单。使用 Flask Web 表单,可以轻松地编写处理用户表单的代码并实现表单验证。 安装 Flask Web 表单 安装 Fla…

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