如何为带变量URL的Flask路由按id单独配置flask_limiter限流?
实现Flask路由按id变量单独限流
当前你的限流规则是针对整个路由生效,要实现同一IP对每个id每分钟仅可请求1次,但不同id可各请求1次的需求,只需通过Flask-Limiter的key_func参数自定义限流标识即可,具体操作如下:
- 定义一个自定义限流键生成函数,将客户端IP与路由中的
id变量组合,作为唯一限流标识:
from flask import request def ip_plus_id_key(): # 获取客户端IP client_ip = request.remote_addr # 获取路由中的id参数 target_id = request.view_args.get('id', '') # 返回IP+id的组合键 return f"{client_ip}:{target_id}"
- 修改
AsyncStatus类的限流装饰器,传入自定义的key_func:
class AsyncStatus(Resource): decorators = [limiter.limit("1/minute", key_func=ip_plus_id_key)] def get(self, id = ''): # 你的业务逻辑代码 return {"status": "success", "requested_id": id}
也可以直接在get方法上使用装饰器,效果一致:
class AsyncStatus(Resource): @limiter.limit("1/minute", key_func=ip_plus_id_key) def get(self, id = ''): # 你的业务逻辑代码 return {"status": "success", "requested_id": id}
原理说明
Flask-Limiter默认使用客户端IP作为限流标识,通过自定义key_func返回IP+id的组合键后,限流规则会对每个IP+id的独立组合进行计数,从而实现同一IP对不同id可分别触发限流规则的效果。
内容的提问来源于stack exchange,提问作者Db0
相关产品推荐
相关产品推荐

