这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
什么是依赖注入
依赖注入,顾名思义,其就是一种在当前代码逻辑中依赖其他代码的形式。被依赖的代码我们称其为依赖项。在 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教程中有详细的介绍。本文主要是对依赖注入的原理和使用场景进行介绍。
感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!