av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django限制API訪(fǎng)問(wèn)頻率常用方法解析

瀏覽:168日期:2024-09-21 09:40:17

需求描述:

平臺(tái)中需要編寫(xiě)接口供第三方調(diào)用,需要控制調(diào)用頻率,需求為5s內(nèi)調(diào)用一次后不得再次調(diào)用。

解決思路

1.Django官方插件庫(kù)中有個(gè)django-ratelimit插件可以滿(mǎn)足要求, django-ratelimit文檔地址,很靈活很強(qiáng)大。只需要在我們的views函數(shù)上加上

@ratelimit(key=’ip’, rate=’1/30s’, block=True)裝飾器就可以了,網(wǎng)站上的資料不多,大部分都是英文的。在這里稍微解釋下參數(shù):

key=’ip’, 必填項(xiàng),標(biāo)識(shí)按照IP劃分,我理解的是同一IP,遵循后面參數(shù)設(shè)定的規(guī)則。

rate=’1/30s’,必填項(xiàng),設(shè)置的頻率值,這個(gè)意思是30秒內(nèi)執(zhí)行一次,也可以按照 “分”,“時(shí)”,“日” 等劃分,很靈活的配置,比如每分鐘執(zhí)行5次,可以這樣寫(xiě)rate=’5/m’,這里參考文檔足夠弄明白

block=True,在這里吃了個(gè)虧,默認(rèn)是False,加上了裝飾器沒(méi)寫(xiě)該參數(shù),訪(fǎng)問(wèn)不受限制,沒(méi)有達(dá)到間隔時(shí)間內(nèi)不能再訪(fǎng)問(wèn)的預(yù)期效果,果斷回去翻文檔,

谷歌翻譯:False是否阻止請(qǐng)求而不是注釋。

我理解大概的意思是,當(dāng)訪(fǎng)問(wèn)進(jìn)來(lái)的時(shí)候是否去阻止它,把block=True之后,在次測(cè)試訪(fǎng)問(wèn),可以看到403,確實(shí)是阻止了。

還有其它的參數(shù),有更多需求的話(huà)可以看看,這是其一。

2.通過(guò)session存儲(chǔ)訪(fǎng)問(wèn)時(shí)間

這里其實(shí)有兩種方式,第一是寫(xiě)在中間件中,第二是裝飾器,每個(gè)人需求不一樣,我這一大堆函數(shù)就幾個(gè)需要給外部調(diào)用的,干脆就做了裝飾器,先貼碼:

def limit(seconds = 5):’’’@func: 限制訪(fǎng)問(wèn)頻率裝飾器’’’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 秒后可再次訪(fǎng)問(wèn)’%(seconds-interval_time))return JsonResponse(ret)else:request.session[’request_time’] = time.time()ret = func(request)return retreturn func_limitreturn rate_limitdef ret_content(ret_code,message):return {’ret_code’:ret_code,’message’:message}

大概思路是:將當(dāng)前訪(fǎng)問(wèn)的時(shí)間存session,設(shè)置時(shí)間間隔,當(dāng)在時(shí)間間隔之內(nèi)的時(shí)候,不讓其刷新,并返回json,超過(guò)時(shí)間間隔,更新session,讓其執(zhí)行。使用如下:

@limit(seconds=30)

30s內(nèi)執(zhí)行一次,我這個(gè)乞丐版的沒(méi)第一種方法靈活了,不過(guò)在禁止期間返回的結(jié)果值會(huì)比較友好,不是403。程序處理會(huì)比較方便,另外針對(duì)IP的情況,我這里沒(méi)做處理,需要的話(huà)自己可以改改,把request_time換成IP + Salt方式就可以了。

外部IP地址獲取代碼這里也貼出來(lái):

def get_remote_cli_ip(request):’’’@func:獲取客戶(hù)端ip’’’ip = request.META.get(’HTTP_X_FORWARDED_FOR’,0)if ip == 0:return request.META[’REMOTE_ADDR’]else:return ip

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 99精品欧美一区二区三区 | 一级a毛片| 女人一区 | 中国免费黄色片 | 成人网av | 四虎永久免费在线 | 欧美 日韩 中文 | 午夜精品一区 | 超碰网址 | 免费一级大片 | 日韩在线国产精品 | 日本一道本 | 色久伊人 | 日本一区二区高清视频 | 精品美女在线观看 | 可以在线看的黄色网址 | 中文字幕欧美在线观看 | 国产精品网址 | 性欧美精品一区二区三区在线播放 | 欧美视频在线观看 | 精品久久久久久久 | 欧洲在线视频 | 国产精品海角社区在线观看 | 欧美伦理一区 | 最新中文字幕 | 精品九九 | 色眯眯视频在线观看 | 欧美一区二区三区久久精品 | 大象一区| 欧美成人精品一区二区三区 | 国产精品一区一区 | 欧美一区视频 | 999久久久久久久久6666 | 精品1区 | 久久精品中文字幕 | 国产精品电影在线观看 | 一区二区三区视频在线 | 久久99精品久久久久久狂牛 | 欧美视频三区 | 中文字幕日韩欧美 | 国产真实精品久久二三区 |