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

yizhihongxing

针对这个话题,我将详细解释如何使用 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框架运用Ajax实现轮询动态绘图

    首先,需要说明一下什么是Flask框架和Ajax。 Flask框架是一种基于Python的轻量级Web应用框架,它提供了一系列的工具和库,用于处理Web应用的常见任务,如路由、表单处理、会话管理等等。 Ajax是一种用于在Web应用中向服务器发出异步HTTP请求的技术,其最大的优点是,能够不刷新整个页面的情况下,更新Web页面的局部内容。 因此,结合这两者,…

    Flask 2023年5月16日
    00
  • Python框架Flask的基本数据库操作方法分析

    Python框架Flask的基本数据库操作方法分析 Flask是一个微型的Python Web框架。与其他Web框架不同,Flask并不是一个全能的大而全的框架,而是一个轻量级灵活的框架。前提条件:在使用Flask时,您需要连接到数据库并进行一些基本操作。在这里,我们将介绍Flask的基本数据库操作方法。 安装数据库 首先,您需要安装一个数据库,比如MySQ…

    Flask 2023年5月15日
    00
  • Ubuntu下Python+Flask分分钟搭建自己的服务器教程

    下面是 “Ubuntu下Python+Flask分分钟搭建自己的服务器教程” 的完整攻略。 1. 安装Python和Flask库 在 Ubuntu 系统中,Python 已经默认预装。我们只需要安装 Flask 库即可。 sudo apt-get update sudo apt-get install python-pip sudo pip install …

    Flask 2023年5月15日
    00
  • python框架中flask知识点总结

    下面我将为您详细讲解“python框架中flask知识点总结”的完整攻略。 什么是Flask? Flask是一个基于Python的轻量级Web应用框架,由Armin Ronacher在2010年创建。Flask的核心是Werkzeug和Jinja2,Werkzeug负责提供Web应用的基本结构,Jinja2则负责模板渲染。 Flask的优点 Flask具有以…

    Flask 2023年5月15日
    00
  • JS实现留言板功能

    JS实现留言板功能需要分为前端和后端两部分来完成。前端主要负责用户交互的展示和处理,后端主要负责数据的存储和传递。 前端实现 1. HTML和CSS 首先需要创建一个包含留言板所需元素的HTML文件,并使用CSS样式美化页面。留言板所需的元素可能包括标题、留言内容输入框、留言列表等等。需要注意的是,留言列表实际上是一个包含多个留言的容器,而每个留言又由多个元…

    Flask 2023年5月16日
    00
  • Python基于Webhook实现github自动化部署

    当我们需要在github代码更新后自动化部署Web应用时,我们可以通过使用Webhook来实现。本文将介绍如何使用Python基于Webhook实现github自动化部署,整个流程可以分为以下几个步骤: 在github仓库中添加Webhook 编写Python代码监听github的Webhook请求 自动拉取代码 自动部署应用 下面,我们分别来详细讲解每个步…

    Flask 2023年5月15日
    00
  • JQuery异步post上传表单数据标准化模板

    JQuery异步post上传表单数据标准化模板是一种常用的前端技术。本攻略将详细讲解此过程,并提供两条示例说明。具体步骤如下: 一、设置请求 url 和 data 请求 url 可以指向一个后台处理请求的页面。 data 是现有表单的序列化数据和其他要提交的数据的对象。对象的主要属性应与表单中的输入字段的“name”属性匹配。 二、设置异步ajax请求 设置…

    Flask 2023年5月16日
    00
  • Python单元测试的9个技巧技巧

    以下是关于“Python单元测试的9个技巧”的完整攻略。 1. 了解单元测试的概念 单元测试是指对程序的最小可测试模块进行验证性测试,这个模块可以是函数、类、方法的一部分或者整个模块。因为它是针对最小可测试模块的测试,所以它可以识别出代码质量的问题,增强代码的可维护性。 2. 使用assert语句进行检验 在Python中,如果测试表达式为False,将会抛…

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