什么是依赖注入
依赖注入,顾名思义,其就是一种在当前代码逻辑中依赖其他代码的形式。被依赖的代码我们称其为依赖项。在 FastApi
中,用 depends
来标识单个依赖项,用 dependencies
标识多个依赖项。
使用场景
- 业务逻辑复用
- 共享数据库连接
- 安全校验,身份认证,角色管理等
实践
起飞的飞机可以下降
飞机降落依赖飞机起飞。
from fastapi import Depends, FastAPI app = FastAPI() async def fly(): print("Airplane is up!") return True @app.get('/down') async def down(isFly=Depends(fly)): if isFly: print("Airplane can down!") return "Airplane can down!" else: print("Airplane can't down!") return "Airplane can't down!" 复制代码
访问:http://localhost:8765/down
网络异常,图片无法展示
|
没起飞的飞机不可下降
async def fly(): print("Airplane is down!") return False 复制代码
访问:http://localhost:8765/down
网络异常,图片无法展示
|
模拟身份认证
假设我们需要对接口进行鉴权,要求经过认证的身份才可以对接口进行访问。首先我们开发一个 token
生成的方法,然后开发一个校验 token
的方法,用户拿到 token
后,要在请求时在 Header
中携带这个 token
,我们利用校验 token
的方法即可实现验证。
代码
流程分析:①、
tk
方法生成token
。②、cktk
方法对传入的tokne
依据超时时间进行合法性检验。③、定义needLogin
又依赖法,将Header
中的access_token
传给cktk
进行检查。根据结果做出不同响应(即真/假,或者正常响应/抛出异常)。
from fastapi import status,Header,HTTPException import time # 定义生成token的接口 @app.get('/tk') async def tk(): return time.time() # 定义检查token合法性的方法 async def cktk(tk): tk=float(tk) ct = time.time() try: # 如果传入的token可以进行时间差计算,则继续 tmp = ct - tk if tmp<60: # 如果token和当前时间差在60s内,则认证通过 return True else: print("token has Expired!") # 如果时间差大于60s,则token过期 return False except Exception as e: # 如果不能进行计算,就直接抛异常 print(e) return False # 定义身份认证的依赖方法 async def needLogin(access_token:float=Header(...)): # 被依赖后,我们可以直接从请求对象的Header中拿到access_token if cktk(tk=access_token): # 对access_token进行合法性校验 return access_token # 检验通过则返回access_token else: # 负责抛出异常,提示403拒绝,认证失败 raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,detail='认证失败!') async def fly(): print("Airplane is down!") return False @app.get('/down') async def down(auth=Depends(needLogin),isFly=Depends(fly),): # 在视图中对needLogin进行依赖即可 print(auth) if isFly: print("Airplane can down!") return "Airplane can down!" else: print("Airplane can't down!") return "Airplane can't down!" if __name__ == "__main__": uvicorn.run(app='main:app',host='127.0.0.1',port=8765,reload=True) 复制代码
效果
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
为了能够让各位同学快速理解依赖注入,所以以上的身份认证方法是最简单的,请不要在实际开发中采用。对于
token
生成和检验,以及身份认证,我们在前面的FastApi
教程中有详细的介绍。本文主要是对依赖注入的原理和使用场景进行介绍。感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!