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

yizhihongxing

下面是关于“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日

相关文章

  • YOLOv5部署到web端详细过程(flask+js简单易懂)

    我将为您详细讲解“YOLOv5部署到web端详细过程(flask+js简单易懂)”的完整攻略。过程中将会包含两条示例说明。 YOLOv5部署到web端详细过程(flask+js简单易懂) 1. 简介 本教程将介绍如何将YOLOv5模型部署到web端,使用Flask作为后端框架和JavaScript作为前端框架,在网页上完成检测并展示结果。我们将提供两个示例:…

    Flask 2023年5月15日
    00
  • 用Python Flask创建简洁高效的URL短链接服务

    创建高效的URL短链接服务是一个非常流行的任务,它可以使网站更加用户友好并提高 SEO。在本文中,我将介绍如何使用Python Flask框架快速创建一个简洁高效的URL短链接服务。 步骤1:安装Flask Flask 可以通过pip包管理器安装。在执行下面的命令之前,请确保已经安装了pip: pip install Flask 步骤2:创建Flask应用程…

    Flask 2023年5月16日
    00
  • Flask 表单处理方法(含源码)

    Flask中表单处理是非常重要的一个功能。在这篇文章中,我们将会讲解如何使用Flask来处理表单。在我们开始之前,假定您已经熟悉Flask的基础知识,如创建应用程序、路由、模板等。 我们将会分为以下几个步骤介绍如何完成整个表单处理过程: 创建HTML表单 首先,我们需要在HTML页面上创建一个表单。表单需要有一个action,method和一个提交按钮。下面…

    Flask 2023年3月13日
    00
  • python异步的ASGI与Fast Api实现

    下面是关于“python异步的ASGI与Fast Api实现”的完整攻略,包括两条示例说明: 概述 在Python中,异步编程是一种非常流行的编程范式,以其高效性和低资源消耗而闻名。ASGI(异步服务器网关接口)是Python Web应用程序中使用的异步协议。FastAPI是一个基于ASGI的现代,快速(Fast)框架,可以让你使用Python 3.7+中最…

    Flask 2023年5月16日
    00
  • Flask SQLAlchemy一对一,一对多的使用方法实践

    下面我就详细讲解Flask SQLAlchemy一对一、一对多的使用方法实践的完整攻略,包含两条示例说明: 一、Flask SQLAlchemy一对一的使用方法实践 1.1 创建Flask项目 首先,我们需要创建一个Flask项目,可以使用以下命令来创建: mkdir flask_one_to_one cd flask_one_to_one virtuale…

    Flask 2023年5月16日
    00
  • Flask框架学习笔记(一)安装篇(windows安装与centos安装)

    下面我来详细讲解一下“Flask框架学习笔记(一)安装篇(Windows安装与CentOS安装)”这篇文章的完整攻略。 安装篇 1. Windows安装 1.1 安装Python环境 首先,我们需要在Windows系统中安装Python环境。进入Python官网(https://www.python.org/downloads/windows/),选择最新版…

    Flask 2023年5月15日
    00
  • Python微服务开发之使用FastAPI构建高效API

    我来详细讲解一下。 Python微服务开发之使用FastAPI构建高效API 本文将介绍如何使用FastAPI构建高效API,内容包括: FastAPI简介 FastAPI开发环境的搭建 FastAPI基本使用和注意事项 使用FastAPI构建示例API FastAPI简介 FastAPI是一个现代的、快速的、工具友好的API框架。它是基于Python 3.…

    Flask 2023年5月16日
    00
  • python flask项目打包成docker镜像发布的过程

    下面我来分享一下Python Flask项目打包为Docker镜像并发布的完整攻略。 环境准备 在开始之前,你需要确保已经安装好以下工具: Docker Docker-Compose Python Flask Git 如果你还没有安装,可以参考以下步骤进行安装: 安装Docker和Docker-Compose。可以访问Docker官网并按照官网的指引进行安装…

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