前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django利用django-ratelimit设置接口请求频率限制

django利用django-ratelimit设置接口请求频率限制

作者头像
py3study
发布2020-12-15 12:00:12
2.1K0
发布2020-12-15 12:00:12
举报
文章被收录于专栏:python3python3

 一、概述

平台中需要编写接口供第三方调用,需要控制调用频率,需求为5s内调用一次后不得再次调用。

Django官方插件库中有个django-ratelimit插件可以满足要求, django-ratelimit文档地址,很灵活很强大。

官方文档:https://django-ratelimit.readthedocs.io/en/stable/

安装插件

代码语言:javascript
复制
pip3 install django-ratelimit

二、演示效果

要对某个url做限制,django-ratelimit有2种方法,一个是在路由里面配置,一个是在视图函数中添加装饰圈。

当然,还有其他方式,比如中间件,这里不做演示,具体请参考官方文档。

新建项目test1,app名为web

1.png
1.png

修改web/views.py,增加视图函数index

代码语言:javascript
复制
from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request,"index.html")

在templates目录下,创建index.html

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
Hello world
</body>
</html>

修改test1/urls.py,增加路由

代码语言:javascript
复制
from django.contrib import admin
from django.urls import path
from web import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index),
]

启动项目,访问默认页面

代码语言:javascript
复制
http://127.0.0.1:8000/

效果如下:

1.png
1.png

准备工作已经做好了,下面开始正式演示频率限制。

路由

修改test1/urls.py,增加限制

代码语言:javascript
复制
from django.contrib import admin
from django.urls import path
from ratelimit.decorators import ratelimit
from web import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', ratelimit(key='ip', method='GET', rate='1/5s',block=True)(views.index)),
]

参数说明:

ip 使用请求ip(获取request.META['REMOTE_ADDR']中的ip地址)

rate 频率参数,列表如下:

代码语言:javascript
复制
s - second
m - minute
h - hour
d - day

上面写的1/5s,表示5秒内,只能调用一次。

block=True 注意:必须设置为true,才能生效。

重启项目,测试访问

1.gif
1.gif

视图函数

先注释掉路由,还原为之前的

修改test1/urls.py

代码语言:javascript
复制
from django.contrib import admin
from django.urls import path
from web import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index),
]

修改web/views.py,在视图函数index前,增加装饰器

代码语言:javascript
复制
from django.shortcuts import render
from ratelimit.decorators import ratelimit

# Create your views here.
@ratelimit(key='ip', rate='1/m',block=True)
def index(request):
    return render(request,"index.html")

重启项目,测试访问。效果同上!

总结:还是用url里面定义是最方便的,不需要操作视图函数。

注意:针对uwsgi+nginx环境中,如果uwsgi运行了多个进程,这个限制效果会有影响。因为uwsgi多进程之间,内存是不共享的。

如果一个请求,刚好分配到一个新的uwsgi中,则是不受限制的。如果刚好分配到刚刚访问到的uswgi,才会有频率限制效果。

本文参考链接:

https://blog.csdn.net/qq_36387683/article/details/95452061

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  一、概述
  • 二、演示效果
    • 路由
      • 视图函数
      相关产品与服务
      消息队列 TDMQ
      消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档