FastApi-20-依赖注入

1,074 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

什么是依赖注入

依赖注入,顾名思义,其就是一种在当前代码逻辑中依赖其他代码的形式。被依赖的代码我们称其为依赖项。在 FastApi 中,用 depends 来标识单个依赖项,用 dependencies 标识多个依赖项。

使用场景

  1. 业务逻辑复用
  2. 共享数据库连接
  3. 安全校验,身份认证,角色管理等

实践

起飞的飞机可以下降

飞机降落依赖飞机起飞。

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请求

带错误格式的token

带上刚刚获取的token

带上过期的token

为了能够让各位同学快速理解依赖注入,所以以上的身份认证方法是最简单的,请不要在实际开发中采用。对于 token 生成和检验,以及身份认证,我们在前面的 FastApi 教程中有详细的介绍。本文主要是对依赖注入的原理和使用场景进行介绍。

感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!