一、概述
平台中需要編寫接口供第三方調用,需要控制調用頻率,需求為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,才會有頻率限制效果。
本文參考鏈接: