Django限制API訪問頻率常用方法解析
需求描述:
平臺中需要編寫接口供第三方調(diào)用,需要控制調(diào)用頻率,需求為5s內(nèi)調(diào)用一次后不得再次調(diào)用。
解決思路
1.Django官方插件庫中有個django-ratelimit插件可以滿足要求, django-ratelimit文檔地址,很靈活很強大。只需要在我們的views函數(shù)上加上
@ratelimit(key='ip', rate='1/30s', block=True)
裝飾器就可以了,網(wǎng)站上的資料不多,大部分都是英文的。在這里稍微解釋下參數(shù):
key='ip', 必填項,標識按照IP劃分,我理解的是同一IP,遵循后面參數(shù)設(shè)定的規(guī)則。
rate='1/30s',必填項,設(shè)置的頻率值,這個意思是30秒內(nèi)執(zhí)行一次,也可以按照 “分”,“時”,“日” 等劃分,很靈活的配置,比如每分鐘執(zhí)行5次,可以這樣寫rate='5/m',這里參考文檔足夠弄明白
block=True,在這里吃了個虧,默認是False,加上了裝飾器沒寫該參數(shù),訪問不受限制,沒有達到間隔時間內(nèi)不能再訪問的預(yù)期效果,果斷回去翻文檔,
谷歌翻譯:False是否阻止請求而不是注釋。
我理解大概的意思是,當訪問進來的時候是否去阻止它,把block=True之后,在次測試訪問,可以看到403,確實是阻止了。
還有其它的參數(shù),有更多需求的話可以看看,這是其一。
2.通過session存儲訪問時間
這里其實有兩種方式,第一是寫在中間件中,第二是裝飾器,每個人需求不一樣,我這一大堆函數(shù)就幾個需要給外部調(diào)用的,干脆就做了裝飾器,先貼碼:
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 {'ret_code':ret_code,'message':message}
大概思路是:將當前訪問的時間存session,設(shè)置時間間隔,當在時間間隔之內(nèi)的時候,不讓其刷新,并返回json,超過時間間隔,更新session,讓其執(zhí)行。使用如下:
@limit(seconds=30)
30s內(nèi)執(zhí)行一次,我這個乞丐版的沒第一種方法靈活了,不過在禁止期間返回的結(jié)果值會比較友好,不是403。程序處理會比較方便,另外針對IP的情況,我這里沒做處理,需要的話自己可以改改,把request_time換成IP + Salt方式就可以了。
外部IP地址獲取代碼這里也貼出來:
def get_remote_cli_ip(request): ''' @func:獲取客戶端ip ''' ip = request.META.get('HTTP_X_FORWARDED_FOR',0) if ip == 0: return request.META['REMOTE_ADDR'] else: return ip
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python使用xauth方式登錄飯否網(wǎng)然后發(fā)消息
這篇文章主要介紹了python使用xauth方式登錄飯否網(wǎng)然后發(fā)消息示例,需要的朋友可以參考下2014-04-04python實現(xiàn)用于測試網(wǎng)站訪問速率的方法
這篇文章主要介紹了python實現(xiàn)用于測試網(wǎng)站訪問速率的方法,涉及Python中urllib2模塊及時間的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05ndarray的轉(zhuǎn)置(numpy.transpose()與A.T命令對比分析)
這篇文章主要介紹了ndarray的轉(zhuǎn)置(numpy.transpose()與A.T命令對比分析),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02利用Python?NumPy庫及Matplotlib庫繪制數(shù)學(xué)函數(shù)圖像
最近開始學(xué)習(xí)數(shù)學(xué)了,有一些題目的函數(shù)圖像非常有特點,下面這篇文章主要給大家介紹了關(guān)于利用Python?NumPy庫及Matplotlib庫繪制數(shù)學(xué)函數(shù)圖像的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04