需求描述:
平台中需要編寫介面供第三方呼叫,需要控制呼叫頻率,需求為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 使用數值,...