FastApi-20-依赖注入

简介: FastApi-20-依赖注入

什么是依赖注入


依赖注入,顾名思义,其就是一种在当前代码逻辑中依赖其他代码的形式。被依赖的代码我们称其为依赖项。在 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 生成和检验,以及身份认证,我们在前面的 FastApi 教程中有详细的介绍。本文主要是对依赖注入的原理和使用场景进行介绍。

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

相关文章
|
IDE API 开发工具
FastAPI(30)- Classes as Dependencies 类依赖注入 (下)
FastAPI(30)- Classes as Dependencies 类依赖注入 (下)
144 0
FastAPI(30)- Classes as Dependencies 类依赖注入 (下)
|
IDE API 开发工具
FastAPI(30)- Classes as Dependencies 类依赖注入 (上)
FastAPI(30)- Classes as Dependencies 类依赖注入 (上)
257 0
FastAPI(30)- Classes as Dependencies 类依赖注入 (上)
|
NoSQL 关系型数据库 数据库连接
FastAPI(29)- Dependencies 依赖注入的初步使用
FastAPI(29)- Dependencies 依赖注入的初步使用
479 0
FastAPI(29)- Dependencies 依赖注入的初步使用
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
|
存储 测试技术 数据安全/隐私保护
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
|
测试技术 数据安全/隐私保护
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
|
NoSQL Redis 数据库
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞
FastAPI(八十)实战开发《在线课程学习系统》接口开发-- 课程列表
FastAPI(八十)实战开发《在线课程学习系统》接口开发-- 课程列表
FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程
FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程