如何基于请求方法为Python ratelimit设置差异化限流(不拆分函数)
问题解答
你的代码不可行,因为装饰器的参数是在函数定义阶段就求值的,这时候method还没作为函数参数传进来,会直接抛出NameError(提示method未定义)。
要实现不拆分函数、根据请求方法应用不同限流规则的需求,可以自定义一个装饰器,根据传入的method动态选择对应的限流规则。具体实现如下:
from ratelimit import limits, sleep_and_retry from functools import wraps def dynamic_rate_limit(func): # 预先定义两种限流规则的装饰器实例 get_limiter = sleep_and_retry(limits(calls=5, period=1)) non_get_limiter = sleep_and_retry(limits(calls=1, period=10)) @wraps(func) def wrapper(method, *args, **kwargs): # 根据请求方法选择对应的限流规则 if method.upper() == 'GET': return get_limiter(func)(method, *args, **kwargs) else: # 匹配PUT/POST/DELETE方法 return non_get_limiter(func)(method, *args, **kwargs) return wrapper @dynamic_rate_limit def callrest(method, url, data): # 这里写你的REST API调用逻辑 print(f"执行{method}请求:{url},数据:{data}")
原理说明
- 预先创建
GET和非GET方法对应的限流装饰器实例,避免每次调用重复创建 - 自定义的
dynamic_rate_limit装饰器会在函数调用时,根据传入的method参数选择对应的限流规则执行 - 用
functools.wraps保留原函数的元信息,避免后续调试或反射时出现问题
内容的提问来源于stack exchange,提问作者fluter
相关产品推荐
相关产品推荐

