pythonFastapi依赖项操作
简单絮叨一些
前面一篇文章唠了异常处理和路径操作配置,今天主要唠下依赖项
Fastapi中提供了依赖注入系统,怎么理解呢?
其实就是本来我是要接收很多参数来构造对象,现在我只接收一个已经实例化的对象。
网上很多的抽象解读,感觉看多了,都emo了,虽说上述总结的一句话比较狭义,但是并没有偏多少,主旨是存在的。
依赖注入常用于以下场景:共享业务逻辑(复用相同的代码逻辑)共享数据库连接实现安全、验证、角色权限等
上述场景均可以使用依赖注入,将代码重复最小化。
依赖项
初识依赖项
依赖项的使用必须要导入Depends,它是Fastapi提供的专门处理依赖的importuvicornfromtypingimportOptionalfromfastapiimportFastAPIfromfastapiimportDependsappFastAPI()defcommonparameters(q:Optional〔str〕None,skip:int0,limit:int10):return{q:q,skip:skip,limit:limit}app。get(items)defreaditems(commons:dictDepends(commonparameters)):returncommonsapp。get(users)defreaduser(commons:dictDepends(commonparameters)):returncommonsifnamemain:uvicorn。run(appdependencymain:app,reloadTrue,debugTrue)
注释信息:fromfastapiimportDepends导入依赖项commons:dictDepends(commonparameters)声明依赖项
注意点:Depends中的参数必须是可调用对象,比如函数等。
子依赖项
Fastapi支持创建含子依赖项的依赖项,并且,可以按需声明任意深度的子依赖项嵌套层级。importuvicornfromtypingimportOptionalfromfastapiimportFastAPIfromfastapiimportDependsfromfastapiimportCookieappFastAPI()defparentparameters(q:Optional〔str〕None):returnqdefchildparameters(q:strDepends(parentparameters),lastquery:Optional〔str〕Cookie(None)):ifnotq:returnlastqueryreturnqapp。get(default)defreaddefault(queryordefault:strDepends(childparameters)):return{qorcookie:queryordefault}app。get(defaultmore)defreaddefaultmore(queryordefault:strDepends(childparameters,usecacheFalse)):return{qorcookie:queryordefault}ifnamemain:uvicorn。run(appdependencymain:app,reloadTrue,debugTrue)
注释信息:parentparameters函数就是返回一个qchildparameters函数是根据q是否传参数,然后返回对应信息queryordefault:strDepends(childparameters)声明依赖项usecacheFalse如果不想使用缓存值,而是为需要在同一请求的每一步操作(多次)中都实际调用依赖项,可以把Depends的参数usecache的值设置为False
注意点:含子依赖项的会先处理第一层,然后再处理第二层,因为第二层依赖第一层,比如:上述例子在请求接口时会先处理parentparameters函数,然后再处理childparameters函数,因为childparameters需要parentparameters函数的返回值。
类作为依赖项
类作为依赖项,其实就是函数作为依赖项的升级版,那这里的类因为注入依赖系统的存在,是不需要进行实例化对象的,只需
要把类名传入,Fastapi会自动分析是不是可调用的参数,如果是可调用的则以与路径操作函数的参数相同的方式处理它们。importuvicornfromtypingimportOptionalfromfastapiimportFastAPIfromfastapiimportDependsfromfastapiimportCookieappFastAPI()fakeitemsdb〔{itemname:Foo},{itemname:Bar},{itemname:Baz}〕classCommonParameters:definit(self,q:Optional〔str〕None,skip:int0,limit:int100):self。qqself。skipskipself。limitlimitapp。get(object)defreadobject(commons:CommonParametersDepends(CommonParameters)):response{}ifcommons。q:response。update({q:commons。q})response。update({name:lifeng})itemsfakeitemsdb〔commons。skip:commons。skipcommons。limit〕response。update({items:items})returnresponse
注释信息:CommonParameters是定义的类,并定义了一些属性(如:self。qq等)commons:CommonParametersDepends(CommonParameters)证明依赖项,只传类名即可ifcommons。q:是判断q是否传参response。update({q:commons。q})是把q更新至response字典中fakeitemsdb〔commons。skip:commons。skipcommons。limit〕是切片取值后赋值给itemsresponse。update({items:items})是把items更新至response字典中
注意点:commons:CommonParametersDepends(CommonParameters)也可以写成commonsDepends(CommonParameters)或者写成commons:CommonParametersDepends()
路径操作装饰器依赖项
1在路径操作装饰器中添加dependencies参数
有时,我们并不需要在路径操作函数中使用依赖项的返回值。或者说,有些依赖项不返回值。那就可以在路径操作装饰器中添加一个由dependencies组成的list。
2依赖项错误和返回值
依赖项也可以在路径定义需求项(比如请求头),也可以抛出异常或者return返回值(无论路径装饰器依赖项是否返回值,路径操作都不会使用这些值。)importuvicornfromfastapiimportFastAPIfromfastapiimportDependsfromfastapiimportHeaderfromfastapiimportHTTPExceptionappFastAPI()defverifytoken(xtoken:strHeader(。。。)):ifxtoken!lifengtoken:raiseHTTPException(statuscode400,detailxtoken未定义!)defverifykey(xkey:strHeader(。。。)):ifxkey!lifengkey:raiseHTTPException(statuscode400,detailxkey未定义!)returnxkeyapp。get(handlepath,dependencies〔Depends(verifytoken),Depends(verifykey)〕)defreadhandlepath():return〔{item:Foo},{item:Bar}〕ifnamemain:uvicorn。run(appdependencymain:app,reloadTrue,debugTrue)
全局依赖项
有时,我们要为整个应用添加依赖项。那就得把依赖项添加至整个FastAPI应用。这些依赖项可以用于应用中的所有路径操作。importuvicornfromfastapiimportHeaderfromfastapiimportFastAPIfromfastapiimportDependsfromfastapiimportHTTPExceptiondefverifytoken(xtoken:strHeader(。。。)):ifxtoken!lifengtoken:raiseHTTPException(statuscode400,detailxtoken未定义!)defverifykey(xkey:strHeader(。。。)):ifxkey!lifengkey:raiseHTTPException(statuscode400,detailxkey未定义!)returnxkeyappFastAPI(dependencies〔Depends(verifytoken),Depends(verifykey)〕)app。get(itemsglobal)defreaditemsglobal():return〔{item:PortalGun},{item:Plumbus}〕app。get(usersglobal)defreadusersglobal():return〔{username:Rick},{username:Morty}〕ifnamemain:uvicorn。run(appdependenciesglobalmain:app,reloadTrue,debugTrue)
注释信息:appFastAPI(dependencies〔Depends(verifytoken),Depends(verifykey)〕)设置全局依赖项
今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键3连【点赞、收藏、分享】哟,谢谢!
未完成,待续
一直在努力,希望你也是!
微信搜索公众号:就用python
刘恺威女友身份曝光,与杨幂还是朋友,离过婚还有个孩子近日,有网友拍摄到刘恺威和女友一起游历径山寺。当天两个人穿着打扮十分的般配,简直就是情侣装的既视感。吸引不少人的围观。该女子身材高挑,并且颜值也是很不错,看上去十分年轻。……
传奇世界玩家的梦中套装蟠龙套大家好,在传奇世界当中有很多让人印象深刻的经典套装,今天咱们就来唠一下蟠龙套,一起往下看!蟠龙套究竟好不好,首先先不提他的属性,就看他全身的金光闪闪谁能拒绝金闪闪的蟠龙套呢?我……
一分钟资讯努比亚联想荣耀一加华为等,最新消息头条创作挑战赛哈喽,我是毛小毛。关注我,每日带你了解最新资讯!一分钟资讯第491篇,感谢你的阅读。努比亚Z50发布努比亚正式发布了新一代旗舰机努比亚Z50,不……
行脚记录仪打了谁的脸?《中国经济周刊》记者吕江涛广东潮州特斯拉失控致2死3伤事故虽然已经过去了半个月有余,但舆情仍在发酵。近日,很多特斯拉车主在短视频平台晒出给车辆安装行脚记录仪,用以记录每次……
中超争冠悬念再起,沧州阻击武汉三镇成功,山东泰山仅落后4分9月24日,中超第17轮多场比赛进行。武汉三镇3比4不敌沧州雄狮,遭遇赛季首败。而同时山东泰山4比0大胜深圳队,双方分差仅为4分,中超争冠悬念再起。武汉三镇vs沧州雄狮,……
高德地图在全国近360城上线绿灯导航,基于北斗系统定位能力IT之家12月29日消息,近日,高德地图宣布上线绿灯导航功能,可在用户驾车导航至某些红绿灯路段时,根据车辆当前实时位置、即将通过的红绿灯路口距离、车流量等综合信息,实时推荐建议……
Lsyt年度时尚报告来袭,MiuMiu成为最大赢家?随着2022正式进入尾声,又迎来一年一度时尚行业的自我总结。在对全球两亿用户的消费行为进行分析后,时尚搜索引擎Lyst于周二发布了2022年度时尚报告。今年,打败了Cha……
金风科技加快拥抱ESG助力实现双碳目标在双碳目标和高质量发展政策背景下,ESG(环境、社会和公司治理)正成为优秀企业的新标杆,成为全社会对企业价值新的评估标准。近日,金风科技副总裁兼董事会秘书马金儒分别受邀参加了中……
本周四冬至,冬季养生重在藏北京日报客户端记者汪丹《黄帝内经》提到圣人不治已病治未病,不治已乱治未乱。如果疾病已经生成再来吃药,动乱已经发生再去平定,就好像口渴了才去凿井,战斗已开始才去铸兵器,为时……
中消协双十一消费提示理性购买勿跟风一年一度的双十一购物节已拉开帷幕,不少消费者也已收到了第一波战利品。为保障消费者合法权益,让消费者放心消费,根据往年双十一期间投诉特点与难点,中消协提醒广大消费者,科学理性按需……
百元价格千元音质HiFi性价比之王,竹林鸟惊鸿2022耳机评前言竹林鸟这个品牌挺有意思的,出品的HiFi产品价格都不高,但在声音、配件、包装上一点也不因为低价而马虎,交付给用户的产品,从声音、配件、包装上都会给人带来一个感觉,这也……
广西灵川县将启动2022年广西汽车下乡惠民活动由广西壮族自治区商务厅主办,桂林市商务局、灵川县人民政府承办的2022年广西汽车下乡惠民活动桂林市灵川县汽车下乡惠百姓乡村振兴新生活汽车巡展将于11月11日11月13日在广西灵……