Django限制API訪問頻率的幾種思路

2022-05-01 14:45:09 字數 1716 閱讀 5773

需求描述:

平台中需要編寫介面供第三方呼叫,需要控制呼叫頻率,需求為5s內呼叫一次後不得再次呼叫。

解決思路

1.django官方外掛程式庫中有個django-ratelimit外掛程式可以滿足要求, django-ratelimit文件位址,很靈活很強大。只需要在我們的views函式上加上

key='ip', 必填項,標識按照ip劃分,我理解的是同一ip,遵循後面引數設定的規則。

rate='1/30s',必填項,設定的頻率值,這個意思是30秒內執行一次,也可以按照 「分」,「時」,「日」 等劃分,很靈活的配置,比如每分鐘執行5次,可以這樣寫rate='5/m',這裡參考文件足夠弄明白

block=true,在這裡吃了個虧,預設是false,加上了裝飾器沒寫該引數,訪問不受限制,沒有達到間隔時間內不能再訪問的預期效果,果斷回去翻文件,

谷歌翻譯:false是否阻止請求而不是注釋。

我理解大概的意思是,當訪問進來的時候是否去阻止它,把block=true之後,在次測試訪問,可以看到403,確實是阻止了。

還有其它的引數,有更多需求的話可以看看,這是其一。

2.通過session儲存訪問時間

這裡其實有兩種方式,第一是寫在中介軟體中,第二是裝飾器,每個人需求不一樣,我這一大堆函式就幾個需要給外部呼叫的,乾脆就做了裝飾器,先貼碼:

def limit(seconds = 5):

'''@func: 限制訪問頻率裝飾器

'''def rate_limit(func):

def func_limit(request):

now=time.time()

request_time = request.session.get('request_time',0)

interval_time = int(now - request_time)

if interval_time < seconds:

ret = ret_content(20008,'%s 秒後可再次訪問'%(seconds-interval_time))

return jsonresponse(ret)

else:

request.session['request_time'] = time.time()

ret = func(request)

return ret

return func_limit

return rate_limit

def ret_content(ret_code,message):

return

大概思路是:將當前訪問的時間存session,設定時間間隔,當在時間間隔之內的時候,不讓其重新整理,並返回json,超過時間間隔,更新session,讓其執行。使用如下:

@limit(seconds=30)

30s內執行一次,我這個乞丐版的沒第一種方法靈活了,不過在禁止期間返回的結果值會比較友好,不是403。程式處理會比較方便,另外針對ip的情況,我這裡沒做處理,需要的話自己可以改改,把request_time換成ip + salt方式就可以了。

def get_remote_cli_ip(request):

'''@func:獲取客戶端ip

Django 限制使用者訪問頻率

import time from django.utils.deprecation import middlewaremixin max request per second 2 每秒訪問次數 class requestblockingmiddleware middlewaremixin def p...

日常 nginx訪問頻率限制

去年的事,隨便記記 2017年3月15日 記錄 nginx限制請求頻率 server外面加上 limit req zone binary remote addr zone one 10m rate 1r s 裡面加上 limit req zone one burst 5 解釋 超過頻率的請求會被放到...

Redis應用 限制訪問頻率

如果 收到惡意攻擊,訪問頻率可能在某個時間段特別高可能,影響 效能,嚴重還能能導致往 直接崩潰 的訪問頻率限制可以解決這個問題,1 實現訪問 例如限制每個使用者在一段事件內只能訪問一定數量的次數如 一分鐘只能訪問100次,思路 key可以使用 rete.limiting ip value 使用數值,...