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


     一、概述

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

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

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

    安装插件

    pip3 install django-ratelimit

    二、演示效果

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

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

    新建项目test1,app名为web

    修改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 lang="en">
    <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/

    效果如下:

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

    路由

    修改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,才能生效。

    重启项目,测试访问

     

    视图函数

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

    修改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

  • 相关阅读:
    wsl 如何去掉 windows 的环境变量
    wget出现Unable to establish SSL connection
    openssh 升级
    element/JS文件上传和下载excel问题
    mysql操作过程中常见问题汇总
    [VB.NET Tips]线程传递参数四种方法
    主路由拨号_openwrt做旁路由_ipv4端口映射的设置
    Openwrt_Linux_crontab任务_顺序执行脚本
    Armbian_笔记
    Debian10_Centos8_fail2ban
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/14113639.html
Copyright © 2020-2023  润新知