在使用 Flask-Limiter(或类似的限流库)时,你可以设置一个标志来表示当请求频率超过设定的限制后采取的行为。这通常用于实现特定的逻辑,如锁定用户、记录违规行为或发送警告。
以下是一个基本示例,展示了如何在超过限制时设置标志:
安装 Flask-Limiter
确保你已经安装了 Flask-Limiter:
pip install Flask Flask-Limiter
limiter.limit
是 Flask-Limiter 中用于定义限流规则的装饰器,通常应用在 Flask 路由函数上。它的主要作用是为特定的路由设置请求频率的限制。limiter.limit
的参数允许你灵活地控制限流的行为。以下是每个参数的作用:
1. limit_value
- 描述: 定义请求的频率限制。通常以字符串形式表示,例如
"5 per minute"
或"10 per hour"
。 - 类型:
str
或者callable
- 作用: 决定一个用户在特定时间段内可以访问该路由的次数。如果传入的是
str
,则它是一个固定的限流规则。如果传入的是callable
(如 lambda 函数),则它可以动态返回一个限流规则,这样限流规则可以根据实际情况动态调整。 - 示例:
@limiter.limit("10 per minute") @limiter.limit(lambda: "5 per second")
2. key_func
- 描述: 用于计算限流的唯一标识符,即根据什么来区分不同的访问者。例如,可以基于用户 ID、IP 地址等。
- 类型:
callable
- 作用: 默认情况下,
Flask-Limiter
使用get_remote_address
(即 IP 地址)作为键值函数,但你可以自定义它。例如,通过用户 ID 或其他识别符来分配不同的限流。 - 示例:
@limiter.limit("10 per minute") @limiter.limit(lambda: "5 per second")
3. per_method
- 描述: 是否将不同的 HTTP 方法(如 GET、POST 等)视为独立的限流对象。
- 类型:
bool
- 作用: 如果设置为
True
,则相同的路由但不同的 HTTP 方法(如 GET 和 POST)将各自有独立的限流计数。默认是False
。
示例:
@limiter.limit("5 per minute", per_method=True)
4.
methods
- 描述: 指定限流适用的 HTTP 方法。
- 类型:
list
或None
- 作用: 如果提供了这个参数,限流规则只会应用于指定的 HTTP 方法(如
["GET", "POST"]
),忽略其他方法。 - 示例:
@limiter.limit("5 per minute", methods=["POST"])
5. error_message
- 描述: 自定义限流触发后的错误消息。
- 类型:
str
- 作用: 当用户请求超过限流配额时,返回的错误消息。你可以用它来替换默认的消息。
- 示例:
@limiter.limit("5 per minute", error_message="Too many requests, slow down!")
6. exempt_when
- 描述: 定义豁免限流的条件。
- 类型:
callable
- 作用: 如果条件为
True
,则当前请求不受限流规则的限制。你可以通过这个参数动态地为特定用户或条件豁免限流。 - 示例:
@limiter.limit("5 per minute", exempt_when=lambda: is_exempt_user(get_user_id()))
7. override_defaults
- 描述: 是否覆盖全局定义的限流规则。
- 类型:
bool
- 作用: 如果设置为
True
,则局部定义的限流规则会覆盖全局定义的规则,而不会叠加在全局规则之上。默认为False
。 - 示例:
@limiter.limit("5 per minute", override_defaults=True)
总结
limiter.limit
装饰器提供了灵活的限流控制能力,你可以根据需求动态调整限流规则、豁免特定条件下的限流、并且为不同的 HTTP 方法设定独立的限流规则。