成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Django REST framework 限流功能的使用

瀏覽:2日期:2024-09-03 18:04:59
目錄正文開始1. DRF 中的限流2. 限流進(jìn)階配置3. 限流思路分析4. 源碼分析5. 其它注意事項(xiàng)參考資料正文開始

先說一個限流這個概念,最早接觸這個概念是在前端。真實(shí)的業(yè)務(wù)場景是在搜索框中輸入文字進(jìn)行搜索時,并不希望每輸一個字符都去調(diào)用后端接口,而是有停頓后才真正的調(diào)用接口。這個功能很有必要,一方面減少前端請求與渲染的壓力,同時減輕后端接口訪問的壓力。類似前端的功能的代碼如下:

// 前端函數(shù)限流示例function throttle(fn, delay) { var timer; return function () {var _this = this;var args = arguments;if (timer) { return;}timer = setTimeout(function () { fn.apply(_this, args); timer = null;}, delay) }}

但是后端的限流從目的上來說與前端類似,但是實(shí)現(xiàn)上會有所不同,讓我們看看 DRF 的限流。

1. DRF 中的限流

項(xiàng)目配置

# demo/settings.pyREST_FRAMEWORK = { # ... ’DEFAULT_THROTTLE_CLASSES’: (’rest_framework.throttling.AnonRateThrottle’,’rest_framework.throttling.UserRateThrottle’, ’rest_framework.throttling.ScopedRateThrottle’, ), ’DEFAULT_THROTTLE_RATES’: {’anon’: ’10/day’,’user’: ’2/day’ },}# article/views.py# 基于ViewSet的限流class ArticleViewSet(viewsets.ModelViewSet, ExceptionMixin): ''' 允許用戶查看或編輯的API路徑。 ''' queryset = Article.objects.all() # 使用默認(rèn)的用戶限流 throttle_classes = (UserRateThrottle,) serializer_class = ArticleSerializer# 基于view的限流@throttle_classes([UserRateThrottle])

因?yàn)槲遗渲玫挠脩裘刻熘荒苷埱髢纱危栽谡埱蟮谌沃缶蜁o出 429 Too Many Requests的異常,具體的異常信息為下一次可用時間為 86398 秒后。

2. 限流進(jìn)階配置

上述演示的限流配置適用于對用戶的限流,比如我換個用戶繼續(xù)訪問,依然是有兩次的機(jī)會。

$ curl -H ’Accept: application/json; indent=4’ -u root:root http://127.0.0.1:8000/api/article/1/ { 'id': 1, 'creator': 'admin', 'tag': '現(xiàn)代詩', 'title': '如果', 'content': '今生今世 永不再將你想起n除了n除了在有些個n因落淚而濕潤的夜里 如果n如果你愿意'}

分別介紹一下三種限流類

AnonRateThrottle 適用于任何用戶對接口訪問的限制 UserRateThrottle 適用于請求認(rèn)證結(jié)束后對接口訪問的限制 ScopedRateThrottle 適用于對多個接口訪問的限制

所以三種不同的類適用于不同的業(yè)務(wù)場景,具體使用根據(jù)不同的業(yè)務(wù)場景選擇,通過配置相對應(yīng) scope 的頻率的配置就可以達(dá)到預(yù)期的效果。

3. 限流思路分析

試想一下如果是你編碼實(shí)現(xiàn)這個需求應(yīng)該怎么實(shí)現(xiàn)?

其實(shí)這個功能不難,核心的參數(shù)就是 時間、次數(shù)、使用范圍,下面演示對函數(shù)調(diào)用次數(shù)的限制。

from functools import wrapsTOTAL_RATE = 2FUNC_SCOPE = [’test’, ’test1’]def rate_count(func): func_num = {# 需要注意函數(shù)名不能重復(fù)func.__name__: 0 } @wraps(func) def wrapper():if func.__name__ in FUNC_SCOPE: if func_num[func.__name__] >= TOTAL_RATE:raise Exception(f'{func.__name__}函數(shù)調(diào)用超過設(shè)定次數(shù)') result = func() func_num[func.__name__] += 1 print(f' 函數(shù) {func.__name__} 調(diào)用次數(shù)為: {func_num[func.__name__]}') return resultelse: # 不在計數(shù)限制的函數(shù)不受限制 return func() return wrapper@rate_countdef test1(): pass@rate_countdef test2(): print('test2') passif __name__ == '__main__': try:test2()test2()test1()test1()test1() except Exception as e:print(e) test2() test2() '''test2test2 函數(shù) test1 調(diào)用次數(shù)為: 1 函數(shù) test1 調(diào)用次數(shù)為: 2test1函數(shù)調(diào)用超過設(shè)定次數(shù)test2test2'''

這里實(shí)現(xiàn)了對函數(shù)調(diào)用次數(shù)的監(jiān)控同時設(shè)置了能夠使用該功能的函數(shù)。當(dāng)函數(shù)調(diào)用次數(shù)超過設(shè)定閥值久拋出異常。只是這里沒有對時間做限制。

4. 源碼分析

剛才分析了如何實(shí)現(xiàn)對函數(shù)調(diào)用次數(shù)的限制,對于一個請求來說可能會復(fù)雜一點(diǎn),下面就看看 DRF 如何實(shí)現(xiàn)的:

class SimpleRateThrottle(BaseThrottle): # ......def allow_request(self, request, view):'''Implement the check to see if the request should be throttled.On success calls `throttle_success`.On failure calls `throttle_failure`.'''if self.rate is None: return Trueself.key = self.get_cache_key(request, view)if self.key is None: return Trueself.history = self.cache.get(self.key, [])self.now = self.timer()# 根據(jù)設(shè)置時間的限制改變請求次數(shù)的緩存while self.history and self.history[-1] <= self.now - self.duration: self.history.pop()# 核心邏輯就是這里判斷請求次數(shù)if len(self.history) >= self.num_requests: return self.throttle_failure()return self.throttle_success()# ...... class UserRateThrottle(SimpleRateThrottle): ''' Limits the rate of API calls that may be made by a given user. The user id will be used as a unique cache key if the user is authenticated. For anonymous requests, the IP address of the request will be used. ''' scope = ’user’ def get_cache_key(self, request, view):if request.user.is_authenticated: ident = request.user.pkelse: # 考慮到用戶沒有認(rèn)證的情況 與 AnonRateThrottle 中 key 一致 ident = self.get_ident(request)# 根據(jù)設(shè)置的范圍構(gòu)建緩存的 keyreturn self.cache_format % { ’scope’: self.scope, ’ident’: ident}

綜上所述:

核心的判斷邏輯依舊是緩存中獲取每個用戶調(diào)用次數(shù),根據(jù)范圍與時間判斷是否超過設(shè)置定的閥值。 不同類型的限流,在緩存 key 的設(shè)計上會有區(qū)別,默認(rèn)的 key 為請求中REMOTE_ADDR。 5. 其它注意事項(xiàng) 因?yàn)檫@里的實(shí)現(xiàn)用到緩存,所以需要注意在多實(shí)例部署的情況下需要配置統(tǒng)一的緩存服務(wù)(默認(rèn)的緩存為 Django 基于內(nèi)存實(shí)現(xiàn)的)。 緩存服務(wù)的重啟可能會導(dǎo)致已有的計數(shù)清零,如果有較強(qiáng)的業(yè)務(wù)邏輯需要,還請自己實(shí)現(xiàn)限流的邏輯。 如果是自定義的用戶表,需要重寫緩存中 get_cache_key 的邏輯。 如果需要統(tǒng)計分析用戶被限流情況也是需要重新設(shè)計限流的邏輯。 限流的邏輯在生產(chǎn)環(huán)境中慎用,因?yàn)闀拗朴脩羰褂卯a(chǎn)品,對用戶不夠友好。參考資料

DRF 限流Django 緩存

以上就是Django REST framework 限流功能的使用的詳細(xì)內(nèi)容,更多關(guān)于Django REST framework 限流功能的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Django
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产日韩欧美一区二区三区乱码| 久久99日本精品| 日韩1区2区3区| 亚洲视频导航| 亚洲视频狠狠干| 国精品一区二区三区| 久久日韩粉嫩一区二区三区| 成人中文字幕在线| 欧洲一区二区三区在线| 日韩不卡手机在线v区| 国产精品免费一区二区三区在线观看| 亚洲视频一区二区在线| 欧美xxx在线观看| 久久亚洲一级片| 丰满白嫩尤物一区二区| 欧美电视剧在线看免费| 成人免费高清在线观看| 日韩免费福利电影在线观看| 国产黄色成人av| 6080亚洲精品一区二区| 国产资源在线一区| 欧美精品日韩精品| 国产精品自拍一区| 欧美一级专区免费大片| 国产精品一二三四区| 777午夜精品视频在线播放| 国产乱码字幕精品高清av| 欧美一区二区三区在线观看视频| 成人午夜电影久久影院| 精品成人一区二区三区| 成人h动漫精品| 久久亚洲一区二区三区四区| 欧美成人一区二免费视频软件| 久久精品人人做人人爽97| 欧美一区二区三区四区夜夜大片| 日本一区二区三区高清不卡| 精品动漫一区| 亚洲一区二区三区四区中文字幕| 一本色道久久综合亚洲二区三区| 一级特黄大欧美久久久| 蜜桃av综合| 美女视频第一区二区三区免费观看网站| 在线观看亚洲a| 国产一区二区视频在线| 日韩精品一区二区三区视频在线观看| 99在线视频精品| 国产精品女上位| 99国产精品久久久久久久成人热| 亚洲福中文字幕伊人影院| 久久99精品久久久| 日韩精品中午字幕| 欧美欧美全黄| 亚洲精品日日夜夜| 米奇777在线欧美播放| 国产综合成人久久大片91| 精品国产123| 亚洲第一网站| 视频一区在线播放| 欧美一区二区三区喷汁尤物| jvid福利写真一区二区三区| 中文字幕色av一区二区三区| 亚洲欧美日韩精品在线| 久久国产精品区| 精品剧情v国产在线观看在线| 欧美chengren| 亚洲国产日韩综合久久精品| 欧美日韩久久不卡| 91尤物视频在线观看| 亚洲日本一区二区| 91久久香蕉国产日韩欧美9色| 黑人巨大精品欧美黑白配亚洲| 欧美精品一区二区精品网| 亚洲欧洲精品一区| 蜜臀av一区二区在线免费观看| 精品美女在线观看| 亚洲看片网站| 极品美女销魂一区二区三区| 国产日韩精品一区二区浪潮av | 国精产品一区一区三区mba桃花| 精品国一区二区三区| 亚洲人成高清| 久久国产福利国产秒拍| wwwwww.欧美系列| 国产精品视频| 国产成人免费av在线| 亚洲视频中文字幕| 欧美日韩在线精品一区二区三区激情| 99国产精品视频免费观看| 一区二区三区四区视频精品免费| 在线影院国内精品| 91丨porny丨在线| 亚洲成人一区二区在线观看| 欧美一区二区在线播放| 亚洲一级网站| 激情五月播播久久久精品| 国产精品天美传媒| 在线中文字幕一区二区| 91麻豆国产在线观看| 日韩综合小视频| 久久精品人人爽人人爽| 日本精品免费观看高清观看| 91视频在线看| 全国精品久久少妇| 中日韩av电影| 欧美欧美午夜aⅴ在线观看| 欧美日韩亚洲一区二区三区在线观看| 日韩电影一区二区三区| 国产精品女人毛片| 欧美一区二区三区在线播放| 一区二区欧美国产| 色婷婷久久久久swag精品| 99国产精品久久久久久久久久| 亚洲少妇30p| 日韩专区欧美专区| 亚欧美中日韩视频| 欧美在线不卡视频| 一区二区三区欧美亚洲| 亚洲色大成网站www久久九九| 欧美激情 亚洲a∨综合| 在线不卡视频| 久久福利视频一区二区| 国产高清一区日本| 91影院在线免费观看| 亚洲精美视频| 国产一区福利在线| 国产精品久久7| 自拍视频在线观看一区二区| 国产又黄又大久久| 久久久久一区二区三区四区| 欧美日韩精品欧美日韩精品一| 国产黄人亚洲片| 美女久久一区| 久久综合九色综合欧美亚洲| 国自产拍偷拍福利精品免费一| 久久精品女人| 欧美一区亚洲二区| 亚洲国产欧美一区二区三区丁香婷| 欧美成人一区二区三区| 久久青青草综合| 伊人久久大香线蕉综合热线| 成人免费三级在线| 久久99精品国产91久久来源| 中文字幕一区二区5566日韩| 欧美成人艳星乳罩| 欧美日韩一二区| 先锋亚洲精品| 在线欧美亚洲| 暖暖成人免费视频| 国产盗摄一区二区三区| 蜜臀av一级做a爰片久久| 一区二区三区蜜桃网| 国产女人aaa级久久久级| 4438x成人网最大色成网站| 色婷婷综合久久久久中文| 在线日韩av永久免费观看| 欧美尤物一区| 国产成人精品免费在线| 日韩国产精品大片| 亚洲国产成人精品视频| 国产精品国产精品国产专区不片| 2020国产精品| 日韩一区二区三区高清免费看看| 欧美主播一区二区三区美女| 乱人伦精品视频在线观看| aa级大片欧美三级| 激情欧美日韩| 欧美日韩日本网| 欧美福利网址| 欧美成人首页| 91免费国产在线| a级精品国产片在线观看| 成人动漫中文字幕| 国产精品888| 国产自产高清不卡| 精品影视av免费| 久久国产精品无码网站| 美女脱光内衣内裤视频久久网站| 日韩精品每日更新| 免费看日韩a级影片| 日本va欧美va精品发布| 五月天激情综合| 蜜臀久久久久久久| 日本成人在线看| 久久国产精品无码网站| 久久草av在线| 国产在线观看免费一区| 精品一区二区日韩| 麻豆久久一区二区| 青青国产91久久久久久| 五月婷婷久久综合| 日韩av电影一区| 看片网站欧美日韩| 久久福利资源站| 国产高清在线精品| 成人免费视频caoporn| 99国产精品久久久久久久久久久| 色综合视频在线观看| 欧美日韩第一区| 在线精品观看| 午夜宅男久久久|