python web框架Flask实现图形验证码及验证码的动态刷新实例

针对这个话题,我将详细解释如何使用 Flask 实现图形验证码及验证码的动态刷新。

需求分析:

我们的目标是实现两个示例:

  • Example 1:静态图形验证码
  • Example 2:动态图形验证码

环境部署:

首先,我们需要安装 Flask 和 Pillow 两个库。Flask 用于构建我们的 Web 应用程序,而 Pillow 用于操作图像。

pip install flask
pip install pillow

示例 1:静态图形验证码

步骤 1:创建 Flask 应用程序

from flask import Flask, make_response, session
from PIL import Image, ImageDraw, ImageFont
import random

app = Flask(__name__)
app.secret_key = 'hard to guess string'

这里我们引入 Flask 应用程序和相关库,并创建了一个 Flask 的实例 app,并设置了一个 secret_key,用于加强安全性。

步骤 2:定义路由

@app.route('/static')
def get_static_captcha():
    captcha_str = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyz', 4))
    img = Image.new('RGBA', (120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img)
    fonts_path = '/usr/share/fonts/truetype/freefont/FreeMono.ttf'
    font = ImageFont.truetype(fonts_path, 25)
    draw.text((10, 5), captcha_str, font=font, fill=(0, 0, 0))
    response = make_response(img.tobytes())
    response.headers['Content-Type'] = 'image/png'
    session['captcha'] = captcha_str
    return response

这里我们定义了一个路由,当用户访问 /static 路径时,会返回一个 PNG 图片。

步骤 3:设置图片响应头

response.headers['Content-Type'] = 'image/png'

设置图片的响应头(MIME 类型)为 image/png。

步骤 4:生成验证码字符串,并将其存储在 session 中

captcha_str = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyz', 4))
session['captcha'] = captcha_str

这里我们使用 Python 的 random 模块生成 4 位随机字符串,用于生成验证码,并将验证码字符串存储在 session 中,以备后续验证。

步骤 5:使用 Pillow 生成图形验证码

img = Image.new('RGBA', (120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img)
fonts_path = '/usr/share/fonts/truetype/freefont/FreeMono.ttf'
font = ImageFont.truetype(fonts_path, 25)
draw.text((10, 5), captcha_str, font=font, fill=(0, 0, 0))
response = make_response(img.tobytes())

使用 Pillow 库操作图像,生成 120 * 30 的白色图片,并在其上绘制生成的验证码,返回生成的图片对象。

步骤 6:启动 Flask 应用

if __name__ == '__main__':
    app.run()

将应用程序运行在本地服务器上。

启动应用后,可以通过浏览器访问 http://127.0.0.1:5000/static,即可看到生成的验证码。

示例 2:动态图形验证码

步骤 1:安装 jQuery

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask dynamic captcha demo</title>
    <script src="https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
    <img src="/dynamic" id="dynamic-captcha">
    <button id="refresh">Refresh</button>
    <script type="text/javascript">
        $(document).ready(function() {
            $("#refresh").click(function () {
                $("#dynamic-captcha").attr("src", "/dynamic");
            });
        });
    </script>
</body>
</html>

这里使用了 jQuery 库,添加了一个动态刷新验证码的按钮,当用户点击按钮时,会使用 Ajax 技术重新加载 /dynamic 路径,获取新的验证码。

步骤 2:创建路由

@app.route('/dynamic')
def generate_dynamic_captcha():
    captcha_str = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyz', 4))
    img = Image.new('RGBA', (120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img)
    fonts_path = '/usr/share/fonts/truetype/freefont/FreeMono.ttf'
    font = ImageFont.truetype(fonts_path, 25)
    draw.text((10, 5), captcha_str, font=font, fill=(0, 0, 0))
    response = make_response(img.tobytes())
    response.headers['Content-Type'] = 'image/png'
    session['captcha'] = captcha_str
    return response

这里我们定义了一个新的路由 /dynamic,与 /static 相比,这里增加了一个刷新验证码字符串的操作。

步骤 3:编写 HTML 模板

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask dynamic captcha demo</title>
    <script src="https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
    <img src="/dynamic" id="dynamic-captcha">
    <button id="refresh">Refresh</button>
    <script type="text/javascript">
        $(document).ready(function() {
            $("#refresh").click(function () {
                $("#dynamic-captcha").attr("src", "/dynamic");
            });
        });
    </script>
</body>
</html>

这里定义了一个包含动态或静态验证码的图片标签,并添加一个刷新按钮。

步骤 4:使用 Flask 渲染模板

@app.route('/')
def index():
    return render_template('index.html')

这里我们将模板 index.html 渲染为响应内容。

步骤 5:启动 Flask 应用

if __name__ == '__main__':
    app.run()

将应用程序运行在本地服务器上。

启动应用后,可以通过浏览器访问 http://127.0.0.1:5000,即可看到动态验证码的示例,而点击 Refresh 按钮后会刷新验证码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python web框架Flask实现图形验证码及验证码的动态刷新实例 - Python技术站

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

相关文章

  • flask中的wtforms使用方法

    下面是有关Flask中使用WTForms的详细攻略。 WTForms简介 WTForms是一个Python第三方库,用于构建Web表单。它为表单字段提供了类型安全、数据验证和呈现模板的便捷方法。WTForms还提供了可扩展的表单字段和验证器,以方便自定义表单实现。 此外,WTForms还具有与Flask框架的集成。因此,在Flask应用程序中使用WTForm…

    Flask 2023年5月16日
    00
  • Flask 请求钩子的实现

    在Flask应用程序中,请求钩子是一种机制,它允许您在请求到达您的视图函数之前或之后执行一些操作。这对于需要在请求到达或离开视图函数时进行一些特殊处理的情况非常有用。 Flask提供了四个请求钩子,分别是before_request、before_first_request、after_request和teardown_request。 before_req…

    Flask 2023年5月15日
    00
  • python实现查询IP地址所在地

    下面我来详细讲解一下“Python实现查询IP地址所在地”的完整攻略。主要分为以下几个步骤: 1. 确定数据来源 我们需要一个可以提供IP地址所在地数据的第三方数据源。常见的数据源有淘宝IP地址库、纯真IP地址库等。以淘宝IP地址库为例,在 https://ip.taobao.com/ 找到“API文档”,我们可以看到提供的查询API地址是: http://…

    Flask 2023年5月16日
    00
  • Python Flask利用SocketIO库实现图表的绘制

    我将详细讲解Python Flask利用SocketIO库实现图表的绘制攻略,并提供两条示例说明。 第一步:安装Flask和SocketIO库 在开始使用Flask和SocketIO库之前,需要确保它们已正确安装。可以使用pip工具进行安装。 在命令行中输入如下命令: pip install flask pip install flask_socketio …

    Flask 2023年5月16日
    00
  • 如何运用docker配合python开发环境实例

    很高兴为你介绍使用 Docker 配合 Python 开发环境的实例攻略。这里将会包含两个示例说明。 示例一:使用 Docker 配合 Python 开发环境 步骤一:安装 Docker 使用 Docker 前,需要在本地安装 Docker 软件,可以在 Docker 官网下载合适的版本进行安装。 步骤二:构建 Docker 镜像 进入项目的根目录,在该目录…

    Flask 2023年5月16日
    00
  • Python WEB应用部署的实现方法

    Python WEB应用部署的实现方法有很多,这里介绍两种常用的方法:使用Web服务器和使用容器。 使用Web服务器 Web服务器是一种比较传统且常见的部署方式,它的原理是Web服务器作为一个独立的应用程序监听特定的端口,接收HTTP请求并转发给相应的应用程序进行处理。Web服务器通常支持多种环境的应用程序部署,如WSGI、CGI等。 接下来我们以Nginx…

    Flask 2023年5月16日
    00
  • 用python实现监控视频人数统计

    下面我将为你详细讲解“用Python实现监控视频人数统计”的完整攻略。 1. 前置条件 首先,我们需要准备好以下的环境: Python3 openCV库 Numpy库 在准备环境时,需要注意openCV库的版本是否与Python版本兼容。可以通过打开Python命令提示符或Anaconda上的命令行终端,输入以下命令来检查openCV库的版本: import…

    Flask 2023年5月16日
    00
  • flask/django 动态查询表结构相同表名不同数据的Model实现方法

    Flask/Django是目前非常流行的Python Web框架,可以用于开发各种规模的Web应用程序。在开发Web应用程序时,经常需要动态地查询不同数据表中结构相同的数据。本文将介绍如何实现动态查询表结构相同、表名不同的数据表。 方法一:使用Django的多数据库 在Django应用程序中,可以使用多个数据库连接(Multi-database)来连接多个数…

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