Django 限制访问频率的思路详解


Posted in Python onDecember 24, 2019

最近做了一个系统由于部分接口需要进行耗时操作,因而不希望用户进行频繁访问,需要进行访问频率限制。如果要自己实现一个访问限制功能相对来说也不会太复杂,并且网上有各种代码可以参考。如果自己不想实现这个代码可以使用 Django Ratelimit 。

Django Ratelimit is a ratelimiting decorator for Django views.
https://travis-ci.org/jsocol/django-ratelimit.png?branch=master Code: https://github.com/jsocol/django-ratelimit License: Apache Software License Issues: https://github.com/jsocol/django-ratelimit/issues Documentation: http://django-ratelimit.readthedocs.org/

使用方法也相对来说比较简单:

@ratelimit(key='ip', rate='5/m')
def myview(request):
  # Will be true if the same IP makes more than 5 POST
  # requests/minute.
  was_limited = getattr(request, 'limited', False)
  return HttpResponse()
@ratelimit(key='ip', rate='5/m', block=True)
def myview(request):
  # If the same IP makes >5 reqs/min, will raise Ratelimited
  return HttpResponse()
@ratelimit(key='post:username', rate='5/m', method=['GET', 'POST'])
def login(request):
  # If the same username is used >5 times/min, this will be True.
  # The `username` value will come from GET or POST, determined by the
  # request method.
  was_limited = getattr(request, 'limited', False)
  return HttpResponse()
@ratelimit(key='post:username', rate='5/m')
@ratelimit(key='post:tenant', rate='5/m')
def login(request):
  # Use multiple keys by stacking decorators.
  return HttpResponse()
@ratelimit(key='get:q', rate='5/m')
@ratelimit(key='post:q', rate='5/m')
def search(request):
  # These two decorators combine to form one rate limit: the same search
  # query can only be tried 5 times a minute, regardless of the request
  # method (GET or POST)
  return HttpResponse()
@ratelimit(key='ip', rate='4/h')
def slow(request):
  # Allow 4 reqs/hour.
  return HttpResponse()
rate = lambda r: None if request.user.is_authenticated else '100/h'
@ratelimit(key='ip', rate=rate)
def skipif1(request):
  # Only rate limit anonymous requests
  return HttpResponse()
@ratelimit(key='user_or_ip', rate='10/s')
@ratelimit(key='user_or_ip', rate='100/m')
def burst_limit(request):
  # Implement a separate burst limit.
  return HttpResponse()
@ratelimit(group='expensive', key='user_or_ip', rate='10/h')
def expensive_view_a(request):
  return something_expensive()
@ratelimit(group='expensive', key='user_or_ip', rate='10/h')
def expensive_view_b(request):
  # Shares a counter with expensive_view_a
  return something_else_expensive()
@ratelimit(key='header:x-cluster-client-ip')
def post(request):
  # Uses the X-Cluster-Client-IP header value.
  return HttpResponse()
@ratelimit(key=lambda r: r.META.get('HTTP_X_CLUSTER_CLIENT_IP',
                  r.META['REMOTE_ADDR'])
def myview(request):
  # Use `X-Cluster-Client-IP` but fall back to REMOTE_ADDR.
  return HttpResponse()

不过需要注意如果和django rest framwork一起使用的话,要将Ratelimit 装饰器放到第一行,如下:

@ratelimit(key='user', rate='1/3s', block=True, method=ratelimit.ALL)
@api_view(['POST', 'GET'])
@csrf_exempt
def api_get_level(request):

否则会导致如下的错误信息:

IndexError at /rest-api/level/
tuple index out of range
Request Method: GET
Request URL: http://192.168.1.195:8006/rest-api/level/
Django Version: 2.2.7
Exception Type: IndexError
Exception Value: 
tuple index out of range
Exception Location: F:\PyCharmProjects\server\venv\lib\site-packages\ratelimit\decorators.py in _wrapped, line 23
Python Executable: F:\PyCharmProjects\server\venv\Scripts\python.exe
Python Version: 3.7.5
Python Path: 
['F:\\PyCharmProjects\\server\\TaichiGameServer',
 'I:\\Python37-64\\python37.zip',
 'I:\\Python37-64\\DLLs',
 'I:\\Python37-64\\lib',
 'I:\\Python37-64',
 'F:\\PyCharmProjects\\server\\venv',
 'F:\\PyCharmProjects\\server\\venv\\lib\\site-packages',
 'F:\\PyCharmProjects\\server\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg']
Server time: Tue, 24 Dec 2019 09:49:01 +0800
 
Traceback (most recent call last):
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
  response = get_response(request)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
  response = self.process_exception_by_middleware(e, request)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
  return view_func(*args, **kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
  return self.dispatch(request, *args, **kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\rest_framework\views.py", line 505, in dispatch
  response = self.handle_exception(exc)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
  self.raise_uncaught_exception(exc)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
  raise exc
 File "F:\PyCharmProjects\server\venv\lib\site-packages\rest_framework\views.py", line 502, in dispatch
  response = handler(request, *args, **kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\rest_framework\decorators.py", line 50, in handler
  return func(*args, **kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
  return view_func(*args, **kwargs)
 File "F:\PyCharmProjects\server\venv\lib\site-packages\ratelimit\decorators.py", line 23, in _wrapped
  request = args[1]
IndexError: tuple index out of range

总结

以上所述是小编给大家介绍的Django 限制访问频率的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
布同 统计英文单词的个数的python代码
Mar 13 Python
Python对象体系深入分析
Oct 28 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
python计算日期之间的放假日期
Jun 05 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
appium+python adb常用命令分享
Mar 06 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
Sep 20 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
python通配符之glob模块的使用详解
Apr 24 Python
python 统计文件中的字符串数目示例
Dec 24 #Python
如何基于python操作json文件获取内容
Dec 24 #Python
解决python 读取 log日志的编码问题
Dec 24 #Python
python实现按关键字筛选日志文件
Dec 24 #Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 #Python
Python3.7+tkinter实现查询界面功能
Dec 24 #Python
python 读取更新中的log 或其它文本方式
Dec 24 #Python
You might like
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
如何解决python多种版本冲突问题
2020/10/13 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
庆元旦广播稿
2014/02/10 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
单位政审意见范文
2015/06/04 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers