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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM