0

0

Flask-Limiter:未认证用户绕过429错误处理教程

心靈之曲

心靈之曲

发布时间:2025-10-22 13:32:01

|

362人浏览过

|

来源于php中文网

原创

Flask-Limiter:未认证用户绕过429错误处理教程

本文档旨在解决在使用 flask-limiter 进行速率限制时,如何针对未认证用户覆盖默认的 429 错误,并返回 401 未授权错误。通过修改 `before_request` 钩子,在用户未认证时直接返回 401 响应,从而避免触发速率限制。本文将提供详细的代码示例和解释,帮助开发者更好地理解和应用这一技巧。

在使用 Flask-Limiter 进行 API 速率限制时,一个常见的需求是区分已认证用户和未认证用户。通常,我们希望对未认证用户不进行速率限制,或者返回特定的未授权错误码 (401) 而不是速率限制错误码 (429)。以下是如何实现这一目标的详细步骤和代码示例。

核心思路

核心思路是在 Flask 的 before_request 钩子中,优先检查用户是否已认证。如果用户未认证,则直接返回 401 未授权响应,从而避免执行后续的速率限制检查。

代码实现

以下是一个示例代码,展示了如何修改 before_request 钩子来实现这一目标。

Thiings
Thiings

免费的拟物化图标库

下载
from flask import Flask, jsonify
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from functools import wraps

app = Flask(__name__)
limiter = Limiter(
    app=app,
    key_func=get_remote_address,
    default_limits=["1 per day", "1 per hour"],
    storage_uri="memory://",
)

def is_authenticated():
    # 你的认证逻辑
    return False

@app.before_request
def check_rate_limit():
    print('Checking rate limit')
    if is_authenticated():
        print('User is authenticated')
        resp = limiter.check()
        if resp and resp[1]:
            return jsonify({"message": "Rate limit exceeded"}), 429
    else:
        print('User not authenticated')
        # 覆盖速率限制响应,当用户未认证时
        return jsonify({"message": "Unauthorized"}), 401

# 自定义装饰器,用于认证请求
def authenticated_request(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not is_authenticated():
            print('Not authenticated')
            return jsonify({"message": "Unauthorized"}), 401
        return f(*args, **kwargs)
    return decorated_function

@app.route('/example')
@authenticated_request
def example_route():
    return jsonify({"message": "This is an example route"})

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

代码解释:

  1. is_authenticated() 函数: 这是一个占位函数,你需要根据你的实际认证逻辑来实现它。它应该返回 True 如果用户已认证,否则返回 False。
  2. check_rate_limit() 函数: 这是 before_request 钩子函数。它首先检查用户是否已认证。
    • 如果用户已认证,它会调用 limiter.check() 来检查速率限制。如果超过了速率限制,它会返回 429 错误。
    • 如果用户未认证,它会直接返回 401 未授权错误,从而绕过速率限制。
  3. authenticated_request() 装饰器: 这是一个可选的装饰器,用于保护特定的路由。它也检查用户是否已认证,如果未认证,则返回 401 错误。
  4. /example 路由: 这个路由使用 authenticated_request() 装饰器进行保护。

注意事项

  • 确保你的 is_authenticated() 函数能够正确地判断用户是否已认证。
  • 根据你的实际需求调整速率限制的配置。
  • 考虑使用更健壮的存储后端来存储速率限制的信息,例如 Redis。
  • authenticated_request() 装饰器是可选的,但它可以提供额外的安全层,确保只有已认证用户才能访问特定的路由。
  • 如果需要对未认证用户进行不同的速率限制,可以在 else 分支中添加相应的逻辑。

总结

通过修改 Flask 的 before_request 钩子,我们可以灵活地控制速率限制的行为,并针对未认证用户返回特定的错误码。这种方法可以帮助我们更好地管理 API 的访问,并提供更好的用户体验。 这种方法避免了不必要的速率限制检查,提高了应用程序的性能。同时,通过明确地返回 401 未授权错误,可以更清晰地告知客户端需要进行身份验证。

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

85

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

72

2025.12.15

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

976

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

633

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

480

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

399

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

392

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

447

2024.04.07

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

6

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号