用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_缓存:要使用的默认缓存,默认为“默认”,可由缓存参数覆盖

待办事项

  • 更多文档

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
servlets Java EE+GlassFish:如果用户在其他地方登录,则强制用户注销   java在不更改源代码的情况下添加钩子   安卓 Java TextView Onclick()返回表达式错误   java Excel文件未使用Apache存储内部内存   java getRowCount()和getSelectedColumn()不起作用   无法在java中生成视图绑定。util。Android Gradle插件2.1的NoTouchElementException   Java中的类型转换运算符百分比计算为零   主java中的调用方法   java在Javasound中播放多个示例   java如何知道webDriver成功打开URL   java jmock,每次调用时返回新对象   eclipse使用Java在Selenium WebDriver中生成可执行文件   macos捆绑Java OS X应用程序默认为MacRoman编码   java我应该把我的休息网关变成一个图书馆吗?   java Eclipse插件:查找包含子字符串的行号无效   Java IOException:在Linux上发送UDP数据包时没有可用的缓冲区空间   java无法解析jaxbxjc2中的名称“xjc:globalJavaType”。2.52.罐子   java是否有HibernateAPI来检查是否创建了数据库?