Django如何限制API访问频率

  介绍

本篇文章给大家分享的是有关Django如何限制API访问频率、小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>解决思路

<强> 1。Django官方插件库中有个django-ratelimit插件可以满足要求,django-ratelimit文档地址,很灵活很强大,只需要在我们的观点函数上加上

@ratelimit(关键=& # 39;IP # 39;,率=& # 39;1/30s& # 39;,块=True)
装饰器就可以了,网站上的资料不多,大部分都是英文的。在这里稍微解释下参数:

键=& # 39;IP # 39;,必填项,标识按照IP划分,我理解的是同一IP,遵循后面参数设定的规则。

率=& # 39;1/30s& # 39;,必填项,设置的频率值,这个意思是30秒内执行一次,也可以按照“分”,“时”,“日”等划分,很灵活的配置,比如每分钟执行5次,可以这样写率=& # 39;5/猴# 39;,这里参考文档足够弄明白

块=True,在这里吃了个亏,默认是假,加上了装饰器没写该参数,访问不受限制,没有达到间隔时间内不能再访问的预期效果,果断回去翻文档,

谷歌翻译:错误是否阻止请求而不是注释。

我理解大概的意思是,当访问进来的时候是否去阻止它,把块=True之后,在次测试访问,可以看到403年,确实是阻止了。

还有其它的参数,有更多需求的话可以看看,这是其一。

<强> 2。通过会话存储访问时间

这里其实有两种方式,第一是写在中间件中,第二是装饰器,每个人需求不一样,我这一大堆函数就几个需要给外部调用的,干脆就做了装饰器,先贴码:

 def限制(秒=5):
  & # 39;& # 39;& # 39;
  @func:限制访问频率装饰器
  & # 39;& # 39;& # 39;
  def rate_limit(函数):
  def func_limit(请求):
  现在=time.time ()
  request_time=request.session.get (& # 39; request_time& # 39;, 0)
  interval_time=int(现在- request_time)
  如果interval_time & lt;秒:
  ret=ret_content (20008 & # 39; % s秒后可再次访问& # 39;% (seconds-interval_time))
  返回JsonResponse (ret)
  其他:
  request.session [& # 39; request_time& # 39;]=time.time ()
  ret=func(请求)
  返回受潮湿腐烂
  返回func_limit
  返回rate_limit
  def ret_content (ret_code、消息):
  返回{& # 39;ret_code& # 39;: ret_code, & # 39;消息# 39;:消息}

大概思路是:将当前访问的时间存会话,设置时间间隔,当在时间间隔之内的时候,不让其刷新,并返回json,超过时间间隔,更新会话,让其执行。使用如下:

@limit(秒=30)

30年代内执行一次,我这个乞丐版的没第一种方法灵活了,不过在禁止期间返回的结果值会比较友好,不是403。程序处理会比较方便,另外针对IP的情况,我这里没做处理,需要的话自己可以改的改,把request_time换成IP +盐方式就可以了。

外部IP地址获取代码这里也贴出来:

 def get_remote_cli_ip(请求):
  & # 39;& # 39;& # 39;
  @func:获取客户端ip
  & # 39;& # 39;& # 39;
  ip=request.META.get (& # 39; HTTP_X_FORWARDED_FOR& # 39;, 0)
  如果ip==0:
  返回request.META [& # 39; REMOTE_ADDR& # 39;】
  其他:
  返回的ip 

以上就是Django如何限制API访问频率、小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

Django如何限制API访问频率