
本文档旨在解决在使用 flask-limiter 进行速率限制时,如何针对未认证用户覆盖默认的 429 错误,并返回 401 未授权错误。通过修改 `before_request` 钩子,在用户未认证时直接返回 401 响应,从而避免触发速率限制。本文将提供详细的代码示例和解释,帮助开发者更好地理解和应用这一技巧。
在使用 Flask-Limiter 进行 API 速率限制时,一个常见的需求是区分已认证用户和未认证用户。通常,我们希望对未认证用户不进行速率限制,或者返回特定的未授权错误码 (401) 而不是速率限制错误码 (429)。以下是如何实现这一目标的详细步骤和代码示例。
核心思路是在 Flask 的 before_request 钩子中,优先检查用户是否已认证。如果用户未认证,则直接返回 401 未授权响应,从而避免执行后续的速率限制检查。
以下是一个示例代码,展示了如何修改 before_request 钩子来实现这一目标。
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)代码解释:
通过修改 Flask 的 before_request 钩子,我们可以灵活地控制速率限制的行为,并针对未认证用户返回特定的错误码。这种方法可以帮助我们更好地管理 API 的访问,并提供更好的用户体验。 这种方法避免了不必要的速率限制检查,提高了应用程序的性能。同时,通过明确地返回 401 未授权错误,可以更清晰地告知客户端需要进行身份验证。
以上就是Flask-Limiter:未认证用户绕过429错误处理教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号