范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

pythonFastapi依赖项操作

  简单絮叨一些
  前面一篇文章唠了异常处理和路径操作配置,今天主要唠下依赖项
  Fastapi  中提供了依赖注入系统,怎么理解呢?
  其实就是本来我是要接收很多参数来构造对象,现在我只接收一个已经实例化的对象。
  网上很多的抽象解读,感觉看多了,都emo  了,虽说上述总结的一句话比较狭义,但是并没有偏多少,主旨是存在的。
  依赖注入常用于以下场景:共享业务逻辑(复用相同的代码逻辑)共享数据库连接实现安全、验证、角色权限等……
  上述场景均可以使用依赖注入,将代码重复最小化。
  依赖项
  初识依赖项
  依赖项的使用必须要导入Depends  ,它是Fastapi  提供的专门处理依赖的import uvicorn from typing import Optional from fastapi import FastAPI from fastapi import Depends  app = FastAPI()   def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 10):     return {"q": q, "skip": skip, "limit": limit}   @app.get("/items/") def read_items(commons: dict = Depends(common_parameters)):     return commons   @app.get("/users/") def read_user(commons: dict = Depends(common_parameters)):     return commons   if __name__ == "__main__":     uvicorn.run(app="dependency_main:app", reload=True, debug=True)
  注释信息:  from fastapi import Depends  导入依赖项commons: dict = Depends(common_parameters)  声明依赖项
  注意点:  Depends  中的参数必须是可调用对象,比如函数等。
  子依赖项
  Fastapi  支持创建含子依赖项的依赖项,并且,可以按需声明任意深度的子依赖项嵌套层级。import uvicorn from typing import Optional from fastapi import FastAPI from fastapi import Depends from fastapi import Cookie  app = FastAPI()   def parent_parameters(q: Optional[str] = None):     return q   def child_parameters(q: str = Depends(parent_parameters), last_query: Optional[str] = Cookie(None)):     if not q:         return last_query     return q   @app.get("/default/") def read_default(query_or_default: str = Depends(child_parameters)):     return {"q_or_cookie": query_or_default}   @app.get("/default_more/") def read_default_more(query_or_default: str = Depends(child_parameters, use_cache=False)):     return {"q_or_cookie": query_or_default}   if __name__ == "__main__":     uvicorn.run(app="dependency_main:app", reload=True, debug=True)
  注释信息:  parent_parameters  函数就是返回一个q  child_parameters  函数是根据q  是否传参数,然后返回对应信息query_or_default: str = Depends(child_parameters)  声明依赖项use_cache=False  如果不想使用「缓存」值,而是为需要在同一请求的每一步操作(多次)中都实际调用依赖项,可以把 Depends   的参数 use_cache   的值设置为 False
  注意点:  含子依赖项的会先处理第一层,然后再处理第二层,因为第二层依赖第一层,比如:上述例子在请求接口时会先处理parent_parameters  函数,然后再处理child_parameters  函数,因为child_parameters  需要parent_parameters  函数的返回值。
  类作为依赖项*
  类作为依赖项,其实就是函数作为依赖项的升级版,那这里的类因为注入依赖系统的存在,是不需要进行实例化对象的,只需
  要把类名传入,Fastapi  会自动分析是不是可调用的参数,如果是可调用的 则以与路径操作函数的参数相同的方式处理它们。import uvicorn from typing import Optional from fastapi import FastAPI from fastapi import Depends from fastapi import Cookie  app = FastAPI()   fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]   class CommonParameters:      def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):         self.q = q         self.skip = skip         self.limit = limit   @app.get("/object/") def read_object(commons: CommonParameters = Depends(CommonParameters)):     response = {}     if commons.q:         response.update({"q": commons.q})         response.update({"name": "lifeng"})     items = fake_items_db[commons.skip: commons.skip + commons.limit]     response.update({"items": items})     return response
  注释信息:  CommonParameters  是定义的类,并定义了一些属性(如:self.q = q  等)commons: CommonParameters = Depends(CommonParameters)  证明依赖项,只传类名即可if commons.q:  是判断q  是否传参response.update({"q": commons.q})  是把q  更新至response  字典中fake_items_db[commons.skip: commons.skip + commons.limit]  是切片取值后赋值给items  response.update({"items": items})  是把items  更新至response  字典中
  注意点:  commons: CommonParameters = Depends(CommonParameters)  也可以写成commons = Depends(CommonParameters)  或者写成commons: CommonParameters = Depends()
  路径操作装饰器依赖项
  1 - 在路径操作装饰器中添加 dependencies   参数
  有时,我们并不需要在路径操作函数中使用依赖项的返回值。或者说,有些依赖项不返回值。那就可以在路径操作装饰器中添加一个由 dependencies   组成的 list  。
  2 - 依赖项错误和返回值
  依赖项也可以在路径定义需求项(比如请求头),也可以抛出异常或者return  返回值(无论路径装饰器依赖项是否返回值,路径操作都不会使用这些值。)import uvicorn from fastapi import FastAPI from fastapi import Depends from fastapi import Header from fastapi import HTTPException  app = FastAPI()   def verify_token(x_token: str = Header(...)):     if x_token != "li_feng_token":         raise HTTPException(status_code=400, detail="x_token 未定义!")   def verify_key(x_key: str = Header(...)):     if x_key != "li_feng_key":         raise HTTPException(status_code=400, detail="x_key 未定义!")     return x_key   @app.get("/handle_path/", dependencies=[Depends(verify_token), Depends(verify_key)]) def read_handle_path():     return [         {"item": "Foo"},         {"item": "Bar"}     ]   if __name__ == "__main__":     uvicorn.run(app="dependency_main:app", reload=True, debug=True)
  全局依赖项
  有时,我们要为整个应用添加依赖项。那就得把依赖项添加至整个 FastAPI   应用。这些依赖项可以用于应用中的所有路径操作。import uvicorn from fastapi import Header from fastapi import FastAPI from fastapi import Depends from fastapi import HTTPException   def verify_token(x_token: str = Header(...)):     if x_token != "li_feng_token":         raise HTTPException(status_code=400, detail="x_token 未定义!")   def verify_key(x_key: str = Header(...)):     if x_key != "li_feng_key":         raise HTTPException(status_code=400, detail="x_key 未定义!")     return x_key   app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])   @app.get("/items_global/") def read_items_global():     return [{"item": "Portal Gun"}, {"item": "Plumbus"}]   @app.get("/users_global/") def read_users_global():     return [{"username": "Rick"}, {"username": "Morty"}]   if __name__ == "__main__":     uvicorn.run(app="dependencies_global_main:app", reload=True, debug=True)
  注释信息:  app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])  设置全局依赖项
  今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!
  未完成,待续……
  一直在努力,希望你也是!
  微信搜索公众号:就用python

准备好了吗?!618预售开始啦5月24日晚上8点,618正式开启预售。和去年相比,今年618的战线拉得又长了一些。往年的促销活动时间一般是5月底或6月初,今年的预售活动提前了整整三周以上。而且,今年一些电商平台甘肃山地马拉松事故该反思什么?5月22日,甘肃白银山地马拉松百公里越野赛遭遇极端天气,造成21人不幸遇难。目前甘肃马拉松善后处理节奏正在推进,那么事故赔偿方案出来了吗?遇难者家属具体获赔多少钱?跟小编一起去看看网红殷世航被封禁630年,狗血剧终于下线殷世航被平台封了23万天,大约合630年,比孙悟空被压五指山还多130年?话说回来,是否还有人问殷世航是谁?为何被平台封杀630年?网红殷世航,借着前女友何婧婧与现女友套路璐的情感IPFSFIL未来价值,FIL能否到10000美元?不积跬步,无以至千里不积小流,无以成江河2017年接触区块链数字货币至今,整个加密数字货币总市值从不到200亿美元到如今的2万多亿美元,短短4年间,倍增100多倍。从少量码农的爱好拍摄日偏食精彩瞬间,vivoX30Pro60倍变焦拍摄竟如此强力2019年12月26日,一场日环食奇观现身天宇,各网友纷纷掏出手机相机记录这一美妙的瞬间,而持有vivoX30Pro60变焦拍照高科技的网友也按耐不住操作一波,效果堪比相机,对于v如何应对云复工,异地组网很简单虽然还处在非常时期,但是公司已经按照相关规定复工,对于不能拒绝的复工请求,身为办公室一族比别人多了一分优势,可以申请家庭办公,实在不行8小时之内完成不了的工作想方设法在家办公那也是骁龙865UFS3。1LPDDR5,iQOO3堪称今年旗舰机模范继微博大V数码闲聊站在网上曝光了iQOO3的谍照以后,人们便对这部即将推出的旗舰机十分地关注。虽然此前大V数码闲聊站并没有明确地透露新机的型号,但是聪明的网友都猜测到这部拥有着挖孔集成5G芯片全焦段拍摄,新晋旗舰vivoX30Pro简单上手体验每一款新机的发布,或多或少都会影响到手机行业的走向,旗舰机型更是如此。而要说在2019年最具手机行业影响力的旗舰新机,我想于近期刚刚发布的vivoX30Pro绝对是榜上有名。作为一安利一下,美好发生,自带桌面支架的充电宝是怎样解放你双手的移动充电宝说他是智能手机重要伴侣,没有之一,也不为过。无论是居家还是出行,充电宝是给手机续航最方便的工具。特别是出游,如果忘记携带充电宝你会重新购买一个为手机续航作担保,不会将就省为何东京奥运会仍要如期举办?这些数字给出答案奥运会一直是与数字分不开的。毕竟,如果没有秒米和磅,其座右铭更快更高更强又有什么意义?有多快算快?有多高算高?有多强算强?然而,一年多来,主导关于东京奥运会讨论的是一组不同的数字不失孤原型寻亲成功,刘德华送祝福2015年上映的电影失孤将打拐话题带入我们的视线。故事取材于郭刚堂真实的寻子故事,戏中刘德华饰演的雷泽宽正是以他为原型,为了寻找被拐的儿子,踏上了长达十五年的寻子之路。7月12日,
性价比干翻小米!骁龙870LCD护眼屏仅1799元,为何销量很一般?你问的是iqooneo5活腻版?唉,发布会后感觉要凉,结果赶紧又降了两百,就是不知道这下活腻没有?真希望它能干翻redmi,这样大家就可以买到更加便宜的红米手机了,可惜iqoo不给mate408256和FindX3Pro12256怎么选?其实你都已经偏向OPPOFindX3Pro了,所以就安安心心的去选择OPPOFindX3Pro吧。华为Mate40目前依旧比较紧俏,抢购是必然的,线下购买的话,遇到加钱或者捆绑销售尼康D610或者尼康D750好用吗?尼康D750,基本上可以满足日常拍摄的所有要求。没用过610,无法比较我出门就用尼康D750。24120镜头。一般玩,没有拍不了的。有人说暗光拍不了。其实既然知道暗光差,那就不拍不哪些家电下单的时候肉疼,用了之后却觉得很值,幸福感爆表?碧云泉N9净水器,买时价格1万5千多,当时觉得很贵,这个价格是普通的净水器23倍,销售说口碑很好,水质也很好,最主要的它不浪费水资源,我头脑一热,就买下了。用了一段时间后觉得这个机鸿蒙有没有可能出PC操作系统?鸿蒙万物互联,电脑也是万物之一!必须PC也能用。真把鸿蒙想成了能包打天下的法宝了吗?还是认为华为的法力无边,想干什么都能成功?鸿蒙现在做手机操作系统能最后成功的可能性都非常渺茫,居谷歌除名华为不让用安卓?别搞笑了,鸿蒙系统不香吗?市场上智能手机虽然品牌庞杂,大多可以归类为产品即苹果和安卓阵营,整体市场占有率无限接近100,不过这种现象很快迎来改变,全球第三大智能手机操作系统鸿蒙OS即将粉墨登场。日前举办的谷案例分析,食品企如何做品牌与互联网?在北大EDP课堂里,有这么一个学生,是做食品的。他希望做品牌,做互联网转型。传统的食品企业,如何依靠品牌和互联网取得快速发展。这个食品公司各种食品,还有,为大公司做配套食品,属于食拼多多东西为何那么便宜?内行人揭开谜底,难怪能在淘宝口中抢肉作为一种新型购物方式,近十几年我国电商行业一直都在迅猛发展,甚至挤压了实体店的发展空间。相比于传统的购物模式,电商有很多的优点,而且也比较符合当下年轻人忙碌的生活节奏。在空闲时间里午报微软CEO回应调查盖茨出轨员工比特币一天跌去4000美元微软CEO回应调查盖茨出轨员工5月21日,微软CEO萨蒂亚纳德拉就比尔盖茨出轨调查发声,此前微软一名工程师揭露公司创始人盖茨与其在2000年多次发生性关系,2019年微软董事会对此(社会)三部门推进IPv6规模部署和应用新华社北京4月25日电(记者王思北)中央网信办国家发展改革委工业和信息化部日前联合印发深入推进IPv6规模部署和应用2022年工作安排,要求突出创新赋能,激发主体活力,打通关键环节这就是为什么德国被评为对加密货币最友好的国家德国在Coincub的2022年第一季度对加密货币最友好的国家排名中位居榜首。欧洲国家允许其长期国内储蓄行业对加密资产投资,这得益于其长期资本对加密货币收益的零税收政策支持。另外比