日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Django REST framework 限流功能的使用

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

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

// 前端函數限流示例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) }}

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

1. DRF 中的限流

項目配置

# 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() # 使用默認的用戶限流 throttle_classes = (UserRateThrottle,) serializer_class = ArticleSerializer# 基于view的限流@throttle_classes([UserRateThrottle])

因為我配置的用戶每天只能請求兩次,所以在請求第三次之后就會給出 429 Too Many Requests的異常,具體的異常信息為下一次可用時間為 86398 秒后。

2. 限流進階配置

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

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

分別介紹一下三種限流類

AnonRateThrottle 適用于任何用戶對接口訪問的限制 UserRateThrottle 適用于請求認證結束后對接口訪問的限制 ScopedRateThrottle 適用于對多個接口訪問的限制

所以三種不同的類適用于不同的業務場景,具體使用根據不同的業務場景選擇,通過配置相對應 scope 的頻率的配置就可以達到預期的效果。

3. 限流思路分析

試想一下如果是你編碼實現這個需求應該怎么實現?

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

from functools import wrapsTOTAL_RATE = 2FUNC_SCOPE = [’test’, ’test1’]def rate_count(func): func_num = {# 需要注意函數名不能重復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__}函數調用超過設定次數') result = func() func_num[func.__name__] += 1 print(f' 函數 {func.__name__} 調用次數為: {func_num[func.__name__]}') return resultelse: # 不在計數限制的函數不受限制 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 函數 test1 調用次數為: 1 函數 test1 調用次數為: 2test1函數調用超過設定次數test2test2'''

這里實現了對函數調用次數的監控同時設置了能夠使用該功能的函數。當函數調用次數超過設定閥值久拋出異常。只是這里沒有對時間做限制。

4. 源碼分析

剛才分析了如何實現對函數調用次數的限制,對于一個請求來說可能會復雜一點,下面就看看 DRF 如何實現的:

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()# 根據設置時間的限制改變請求次數的緩存while self.history and self.history[-1] <= self.now - self.duration: self.history.pop()# 核心邏輯就是這里判斷請求次數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: # 考慮到用戶沒有認證的情況 與 AnonRateThrottle 中 key 一致 ident = self.get_ident(request)# 根據設置的范圍構建緩存的 keyreturn self.cache_format % { ’scope’: self.scope, ’ident’: ident}

綜上所述:

核心的判斷邏輯依舊是緩存中獲取每個用戶調用次數,根據范圍與時間判斷是否超過設置定的閥值。 不同類型的限流,在緩存 key 的設計上會有區別,默認的 key 為請求中REMOTE_ADDR。 5. 其它注意事項 因為這里的實現用到緩存,所以需要注意在多實例部署的情況下需要配置統一的緩存服務(默認的緩存為 Django 基于內存實現的)。 緩存服務的重啟可能會導致已有的計數清零,如果有較強的業務邏輯需要,還請自己實現限流的邏輯。 如果是自定義的用戶表,需要重寫緩存中 get_cache_key 的邏輯。 如果需要統計分析用戶被限流情況也是需要重新設計限流的邏輯。 限流的邏輯在生產環境中慎用,因為會限制用戶使用產品,對用戶不夠友好。參考資料

DRF 限流Django 緩存

以上就是Django REST framework 限流功能的使用的詳細內容,更多關于Django REST framework 限流功能的資料請關注好吧啦網其它相關文章!

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久伊人| 国产劲爆久久| 99精品视频在线| 亚洲国内精品| 快播电影网址老女人久久| 久久国产电影| 男女精品网站| 欧美三区不卡| 精品视频国产| 欧美日韩一区二区三区视频播放| 九九久久婷婷| 综合国产视频| 日本精品另类| 国产福利片在线观看| 午夜电影亚洲| 日韩中出av| 国产一区二区三区不卡视频网站 | 视频一区二区三区入口| 亚洲婷婷丁香| 久久久91麻豆精品国产一区| 私拍精品福利视频在线一区| 国产精品7m凸凹视频分类| 视频一区二区欧美| 久久不卡国产精品一区二区| 色婷婷精品视频| 婷婷精品在线观看| 成人国产精选| 亚州欧美在线| 日韩欧美精品| 91麻豆精品| 亚洲福利一区| 欧美国产专区| 99在线|亚洲一区二区| 在线视频精品| 精品国产一区二区三区性色av| 国精品一区二区| 日韩黄色免费网站| 亚洲天堂资源| 日韩精品1区2区3区| 久久毛片亚洲| 日韩精品亚洲aⅴ在线影院| 国产精品久久久久蜜臀| 视频在线观看91| 日韩国产欧美一区二区| 日韩国产在线观看| 免费黄色成人| 成人在线免费观看网站| 日韩综合一区二区| 欧美日韩国产免费观看| 国产一区二区三区国产精品| 日韩三区四区| 成人精品天堂一区二区三区| 日韩av不卡一区二区| 91精品一区国产高清在线gif| 欧美伊人影院| 精品久久久网| 国产日韩欧美一区| 在线视频亚洲欧美中文| 欧洲av一区二区| 国产精品.xx视频.xxtv| 国产亚洲精品v| 午夜av成人| 麻豆视频一区| 国产图片一区| 亚洲综合福利| 老鸭窝毛片一区二区三区| 国产高潮在线| 久久免费福利| 欧美在线观看天堂一区二区三区| 好看的亚洲午夜视频在线| 成人片免费看| 日韩88av| 精品一区二区三区的国产在线观看| 亚洲欧美网站在线观看| 中文精品在线| 一本一道久久a久久精品蜜桃| 日本一区二区免费高清| 久久不见久久见免费视频7| 日韩精品视频在线看| 免费美女久久99| 麻豆亚洲精品| 怡红院精品视频在线观看极品| 欧美日韩视频免费观看| 日本黄色精品| 国产激情在线播放| 激情中国色综合| 国产精品午夜一区二区三区| 日本三级亚洲精品| 日韩美女精品| 日韩激情av在线| 欧美日韩午夜电影网| 欧美综合社区国产| 国产亚洲人成a在线v网站| 日韩精品视频在线看| 88久久精品| 国产精品资源| 国产精品亚洲成在人线| 牛牛精品成人免费视频| 鲁大师精品99久久久| 久久精品国产成人一区二区三区| 老牛国内精品亚洲成av人片| 成人国产精品久久| 久久国产欧美| 99在线精品免费视频九九视| 中文无码日韩欧| 日本成人手机在线| 欧美片第1页综合| 久久伊人久久| 久久精品国产99久久| 99国产精品视频免费观看一公开| 亚洲伊人精品酒店| 91午夜精品| 久久精品九色| 视频一区中文| 亚洲精品极品| 国产欧美午夜| 岛国av免费在线观看| 欧美福利专区| 亚洲毛片在线免费| 国产极品嫩模在线观看91精品| 日韩av有码| 蜜桃tv一区二区三区| 综合激情五月婷婷| 精品三区视频| 久久九九电影| 综合欧美精品| 欧美激情精品| 不卡在线一区| 日韩影片在线观看| 久久精品五月| 国产亚洲一区在线| 国产人成精品一区二区三| 97精品一区二区| 在线精品视频在线观看高清| 欧美日韩91| 久久香蕉国产| 欧美日韩中出| 欧美福利一区| 国产精品亚洲片在线播放| 私拍精品福利视频在线一区| 中文字幕成人| 福利片在线一区二区| 蘑菇福利视频一区播放| 精品一区av| 蜜桃久久久久久| 欧美韩日一区| 日韩一区二区三区四区五区| 在线一区av| 91亚洲精品视频在线观看| 日韩不卡在线| 国产九九精品| 久久亚洲国产精品一区二区| 老司机免费视频一区二区| 亚洲欧美日本日韩| 成人在线视频区| 日韩黄色av| 婷婷综合激情| 国产精品s色| 免费在线观看视频一区| 青青青免费在线视频| 日韩精品一区二区三区中文 | 天堂久久一区| 精品在线91| 韩国久久久久久| 国产日韩中文在线中文字幕| 模特精品在线| 欧美~级网站不卡| 精品视频自拍| 日韩综合一区二区| 亚洲在线一区| 久久精品成人| 97精品视频在线看| 国产精品日韩精品在线播放| 亚洲欧洲国产精品一区| 亚洲香蕉网站| 国产中文在线播放| 久久免费精品| 国产欧美综合一区二区三区| 中文字幕一区二区三区日韩精品| 999精品在线| 福利精品在线| 精品一区二区三区四区五区| 日韩欧美中文字幕在线视频| 欧美国产91| 欧美日韩色图| 999久久久亚洲| 日韩欧美另类一区二区| 精品国产一区二| 精品一区二区三区中文字幕| 国产激情久久| 国产精品一区二区免费福利视频| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲激情另类| 欧美精品一区二区久久| 欧洲在线一区| 国产欧洲在线| 欧洲av不卡| 黄色aa久久| 91亚洲自偷观看高清| 国产一二在线播放|