电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Django REST framework 限流功能的使用

瀏覽:5日期: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
相關文章:
主站蜘蛛池模板: 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 合同书格式和范文_合同书样本模板_电子版合同,找范文吧 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 北京租车牌|京牌指标租赁|小客车指标出租 | 拖鞋定制厂家-品牌拖鞋代加工厂-振扬实业中国高端拖鞋大型制造商 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 |