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

发布时间:2020-12-11 13:53:52编辑:admin阅读(2425)

     一、概述

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

     

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

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

     

    安装插件

    pip3 install django-ratelimit

     

     

    二、演示效果

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

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

     

    新建项目test1,app名为web

    1.png

     

     

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

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

     

    在templates目录下,创建index.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    Hello world
    </body>
    </html>

     

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

    from django.contrib import admin
    from django.urls import path
    from web import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',views.index),
    ]

     

    启动项目,访问默认页面

    http://127.0.0.1:8000/

     

    效果如下:

    1.png

     

     

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

    路由

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

    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 频率参数,列表如下:

    s - second
    m - minute
    h - hour
    d - day

     

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

     

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

     

    重启项目,测试访问

     1.gif

    视图函数

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

    修改test1/urls.py

    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前,增加装饰器

    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


关键字