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蓝图的踩坑记录 在编写Flask应用时,蓝图Blueprint是一种非常强大的组织代码结构的方式。但是使用蓝图Blueprint时也容易出现一些问题,本文就是从作者亲身经历的两个问题,详细讲解Python-Flask蓝图的使用注意事项。 第一个问题:Flask应用前缀设置不正确 在使用Flask应用时,我们需要将Blueprint…

    Flask 2023年5月15日
    00
  • vue+flask实现视频合成功能(拖拽上传)

    下面是详细讲解“vue+flask实现视频合成功能(拖拽上传)”的完整攻略。 总体思路 这个项目的目的是实现用户可以通过拖拽上传多个视频文件,并将这些视频文件拼接成一个新的视频文件自定义保存,同时该视频文件可以在前端进行预览播放。 具体的实现方案是:前端使用vue框架构建视图,并使用dropzone.js插件实现文件的拖拽上传;后端使用flask框架运行py…

    Flask 2023年5月16日
    00
  • 利用nginx解决跨域问题的方法(以flask为例)

    当我们使用 Flask 构建 API 并通过 AJAX 请求进行数据传递的时候,容易遇到跨域问题,这时候可以使用 Nginx 转发解决跨域问题。 方法一 下面是一个简单的 Nginx 配置,将 Flask 提供的 API 接口转发到本地 5000 端口,即可解决跨域问题。 首先安装并启动 Nginx,然后创建一个名为 myapp.conf 的 Nginx 配…

    Flask 2023年5月16日
    00
  • Flask-SocketIO服务端安装及使用代码示例

    下面是关于“Flask-SocketIO服务端安装及使用代码示例”的完整攻略。 安装Flask-SocketIO 首先要安装Flask-SocketIO模块,可以使用pip直接安装: pip install flask-socketio 或者,可以在项目的requirements.txt中添加一行: flask-socketio==5.1.0 使用示例1 下…

    Flask 2023年5月16日
    00
  • 详解Python flask的前后端交互

    本文将详细讲解如何使用Python flask实现前后端交互。主要分为以下几个部分: 安装Flask框架 创建Flask应用 构建接口 前端页面的编写 进行前后端交互 1. 安装Flask框架 在安装Flask之前,请确保你已经安装了Python环境。安装Flask的方法有多种,这里介绍pip安装方式。 可以运行以下命令来安装Flask: pip insta…

    Flask 2023年5月15日
    00
  • python flask中静态文件的管理方法

    下面是Python Flask中静态文件的管理方法的完整攻略。 1. Flask中静态文件的管理 在Flask中,我们可以使用内置的静态文件支持来处理静态文件。Flask会在应用程序静态文件目录中查找静态文件,这个目录默认为static。 你可以通过url_for函数来引用静态文件,在HTML模板中引用这个函数即可,例如: <img src=&quot…

    Flask 2023年5月16日
    00
  • python flask搭建web应用教程

    针对“python flask搭建web应用教程”的完整攻略,我可以为您提供以下的步骤: 1. 确认项目需求和环境 在开始构建Web应用程序之前,您需要先确定您的项目需求和应用程序架构。然后,您需要确保计算机中已安装了正确的Python版本。在安装Python的同时,您也需要安装pip包管理器。在确认了环境之后,您需要在终端中安装Flask和其他必需的依赖项…

    Flask 2023年5月15日
    00
  • python 获取sqlite3数据库的表名和表字段名的实例

    接下来我将详细讲解“python 获取sqlite3数据库的表名和表字段名的实例”的完整攻略,过程中也会包含两条示例说明。 1. 获取sqlite3数据库的表名 我们可以通过sqlite_master系统表来获取sqlite3数据库中的表名。 示例代码: import sqlite3 def get_table_names(db_file_path): co…

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