You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于请求方法为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:07:01