用django缓存实现快速速率限制
django-fast-ratelimit的Python项目详细描述
django快速费率限制
Django fast ratelimit基于Django缓存框架提供了一种安全快速的ratelimit工具
安装
pip install django-fast-ratelimit
注意:pip>;=19是必需的,我使用新的pyproject.toml方法
用法
装饰工:
importratelimit@ratelimit.decorate(key="ip",rate="1/s")defexpensive_func(request):# how many ratelimits request limitingifrequest.ratelimit["request_limit"]>0:# reschedule with end of rate epochreturnrequest_waiting(request.ratelimit["end"])
阻塞修饰符(引发RatelimitError):
importratelimit@ratelimit.decorate(key="ip",rate="1/s",block=True,methods=ratelimit.UNSAFE)defexpensive_func(request):# how many ratelimits request limitingifrequest.ratelimit["end"]>0:
装饰视图(需要组):
importratelimitfromdjango.views.genericimportViewfromdjango.utils.decoratorsimportmethod_decorator@method_decorator(ratelimit.decorate(key="ip",rate="1/s",block=True,methods=ratelimit.SAFE,group="required"),name="dispatch")classFooView(View):...
手册
importratelimitdeffunc(request):ratelimit.get_ratelimit(key="ip",rate="1/s",request=request,group="123")# or only for GETratelimit.get_ratelimit(key="ip",rate="1/s",request=request,group="123",methods="GET")# also simple calls possible (note: key in bytes format)ratelimit.get_ratelimit(key=b"abc",rate="1/s",group="123")# check constraints of rater=ratelimit.parse_rate("1/s")# returns tuple (amount, period)assert(r[1]==1)# assert period is 1 second# for simple naming use o2g (object to group)ratelimit.get_ratelimit(key=b"abc",rate=r,group=ratelimit.o2g(func))
参数
ratelimit.get_ratelimit:
- 组:组名,可调用(fun(request))
- 方法:一组选中的方法,可以调用(fun(request,group)),模式:
- 可调用(请求,组):允许动态
- ratelimit.all(默认):选中所有方法
- (“head”,“get”):选中方法的列表
- ratelimit.inverted set([“HEAD”,“GET”]):检查方法的反向集合这里:每种方法都经过检查,除了HEAD,GET
- 请求:输入请求(如果键支持,则为可选,方法为ratelimit.all(默认))
- 键:可能有多种模式:
- str:“path.to.method:argument”
- str:“inbuildmethod:argument”有关有效参数的信息,请参见方法
- str:“inbuildmethod”方法,可用于(请求,组)
- 元组,list:[“method”,args…]:带有任意参数的方法(也可以是inbuild)
- 字节:静态密钥(不支持请求模式)
- 可调用:检查函数返回(fun(请求,组))
- 缓存:指定要使用的缓存,默认为RateLimit默认缓存设置(默认:“默认”)
- hash_algo:用于创建缓存密钥的哈希算法的名称(默认为ratelimit_key_hash设置(默认为sha256))。 注意:组是单独散列的
- hashctx:optimation参数,阅读代码,只有在知道自己在做什么时才使用。它基本上避开了参数散列,只散列键。如果键参数为真,则即使跳过键也不例外
ratelimit.decorate:
所有RateLimit。获取除请求之外的RateLimit。组在这里是可选的(除了使用decorator方法的装饰(不访问包装的函数))。 还支持:
- block:是否应使用RatelimitExceeded异常(PermissionDenied的子类)进行硬阻止,或仅使用ratelimit注释请求
设置
- RATELIMIT_GROUP_HASH:用于组哈希的哈希函数(默认值:md5)
- RATELIMIT_KEY_HASH:用作密钥哈希默认值的哈希函数,可以用HASH_algo重写(默认值:md5)
- RateLimit_enable禁用RateLimit(例如用于测试)(默认:已启用)
- ratelimit_key_prefix:散列键的内部前缀(因此不必创建新缓存)。默认为“frl:”
- RATELIMIT_DEFAULT_缓存:要使用的默认缓存,默认为“默认”,可由缓存参数覆盖
待办事项
- 更多文档