首页 > 其他分享 >FastAPI 依赖注入之类依赖:使用类声明依赖项并简化查询参数

FastAPI 依赖注入之类依赖:使用类声明依赖项并简化查询参数

时间:2025-01-19 09:32:40浏览次数:3  
标签:依赖 items commons 查询 skip FastAPI limit response CommonQueryParams

FastAPI 依赖注入之类依赖:使用类声明依赖项并简化查询参数

在 FastAPI 中,依赖注入(DI)不仅支持函数,还支持类作为依赖项,这使得代码更加模块化与易于维护。通过类依赖,开发者能够封装复杂的业务逻辑与参数验证,提高代码的可复用性与可读性。本文介绍了如何使用类来声明依赖项并应用于路径操作,展示了类依赖与函数依赖的差异以及如何使用 FastAPI 中的 Depends 来自动处理类实例的创建与注入,极大简化了查询参数的处理和验证过程。

文章目录

预备课FastAPI 依赖注入之函数依赖:高效管理路径操作的全局共享资源

以下示例中使用的 Python 版本为 Python 3.10.15FastAPI 版本为 0.115.4

一 示例代码

from fastapi import Depends, FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


class CommonQueryParams:
    def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit


@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

依赖项通常被声明为函数,但也可以是其他可调用对象。Python 中的 可调用对象 是指任何可以像函数一样执行的对象。运行代码文件 di02.py 来启动应用:

$ uvicorn di02:app --reload

SwaggerUI 中可以查看在线文档:http://127.0.0.1:8000/docs

二 类依赖和函数依赖

# 定义一个类,用于封装查询参数
class CommonQueryParams:
    def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit

# 定义一个异步函数,作为依赖项返回查询参数字典
async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100):
    """
    返回查询参数字典,用于处理请求中的查询参数。
    参数与 CommonQueryParams 类中的一致。
    """
    return {"q": q, "skip": skip, "limit": limit}

用于创建类实例的 __init__ 方法,其参数与之前的 common_parameters 函数相同,FastAPI 会处理这些参数,包括数据转换、验证,并在 OpenAPI 文档中生成相应的 schema。

三 使用类声明依赖项

@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip : commons.skip + commons.limit]
    response.update({"items": items})
    return response

FastAPI 调用 CommonQueryParams 类,创建该类的一个实例,并将其作为参数 commons 传递给路径操作函数

四 类依赖的多种写法

1 第一种

在这里插入图片描述

FastAPI 通过 Depends(CommonQueryParams) 知道需要调用 CommonQueryParams 类,并从中提取参数以创建一个实例。此时,FastAPI 会执行数据转换、验证,并将创建的实例作为参数传递给函数。如图所示:

  • 第一个 CommonQueryParams 仅为类型声明,对 FastAPI 并不产生特殊影响,它没有任何特殊的意义。
  • 第二个 CommonQueryParamsDepends 配合使用,才是 FastAPI 识别并处理依赖项的实际机制。
2 第二种
@app.get("/items02/")
async def read_items(commons=Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

声明类型是推荐的做法,因为这样编辑器就能识别 commons 参数的类型,进而提供代码补全、类型检查等帮助。

3 第三种
@app.get("/items02/")
async def read_items(commons: CommonQueryParams = Depends()):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

如果这种写法难以理解,那么可以忽略它。

五 完整代码示例

from fastapi import Depends, FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


class CommonQueryParams:
    def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit


@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response


@app.get("/items02/")
async def read_items(commons=Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response


@app.get("/items02/")
async def read_items(commons: CommonQueryParams = Depends()):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

六 源码地址

详情见:GitHub FastApiProj

七 参考

[1] FastAPI 文档

标签:依赖,items,commons,查询,skip,FastAPI,limit,response,CommonQueryParams
From: https://blog.csdn.net/u014394049/article/details/145121147

相关文章

  • python 的版本、依赖包、虚拟环境管理
    我并不是python开发者,但突然对这个话题感兴趣,所以就和AI聊了起来,以下是一些聊天笔记。注意,这里可能有部分内容是过时或者错误的,以官方文档或者实际效果为准。在电脑上安装python之后,就可以直接在控制台执行python脚本了。但此时有两个问题,1python的版本是固定的,如果......
  • 「NOIP2024」 树上查询
    update2024/12/28题目描述给定一棵树,每次询问区间\([l,r]\)的\[\max_{l\lel'\ler'\ler\landr'-l'+1\gek}\text{dep}_{\text{LCA*}(l',r')}\]引理证明先来证两个区间\(\text{LCA}\)的引理:对于\(\text{LCA}\{l,l+1,\dots......
  • winform使用依赖注入框架Autofac的一些记录
    由于winform的framework框架无法实现core那样的依赖注入,必须借助于依赖注入框架来实现。此次使用Autofac,由于DAL被BLL引用,而BLL又被主程序引用,所以在framework里要实现依赖注入,主程序必须引用DAL和BLL,才可以在主程序里面对DAL和BLL进行注册,这又违背了解耦的原则,所以只能在BLL和主......
  • Java使用sql查询mongodb
    概述MongoDB是一种NoSQL数据库,它使用文档存储数据,与传统的关系型数据库不同。尽管MongoDB不使用SQL进行查询,但有时在熟悉SQL语法的团队中,能够使用SQL查询MongoDB可以大大简化开发工作。本文将详细介绍如何在Java中使用SQL查询MongoDB。工具与依赖要实现这一......
  • SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路
    随着公司业务的增加,公司需要一个java+python人工智能相互配合架构,正常网站业务用java来做,而ai,例如电价预测等回归任务,以及大模型预测全网负荷,新能源出力等任务,使用python通过fastapi暴露接口来做,那么就需要springcloud架构注册发现。前端统一使用Vue进行效果的展示因此本......
  • C# Linq 多表查询
    在C#中处理数据时,语言集成查询(LINQ)是一个强大的工具,它允许我们以类似于数据库查询的方式查询集合。LINQ进行多表查询,包括内连接、组连接、左连接和交叉连接。基础数据模型首先定义几个基础的数据模型类://学生publicclassStudent{publicintStudentId......
  • Linux grep 技巧结合 awk 查询
    在Linux系统中,grep 和 awk 是两个强大的文本处理工具,常用于日志分析、数据提取和系统管理。grep 用于搜索文本模式,而 awk 用于基于模式进行复杂的文本处理和数据操作。将这两者结合起来使用,可以大大提高数据处理的效率和灵活性。本文将详细介绍如何将 grep 和 awk 结......
  • 网络协议的自主研发是指在没有依赖外部技术或标准的情况下,组织或企业自己设计和开发的
    网络协议的自主研发是指在没有依赖外部技术或标准的情况下,组织或企业自己设计和开发的网络协议。这样的协议通常针对特定的需求或场景进行优化,旨在提高效率、安全性、兼容性或满足其他特定功能要求。自主研发的网络协议可能涉及不同的层次,从物理层、数据链路层到应用层。自主研发......
  • 【SQL】查询前三名
    使用SQL查询根据学生成绩查询前三名学生的方式通常依赖于ORDERBY语句来排序学生成绩,并使用LIMIT限制返回结果的数量。假设你有一个学生表students,其中包含name(学生姓名)和score(学生成绩)字段,以下是一些常见的SQL查询方式。示例:根据学生成绩查询前三名学生假设学生......
  • MySql操作指南4--MySQL查询优化与性能调优
    性能优化是数据库开发的重要组成部分,合理优化SQL查询、索引设计以及程序逻辑能够大幅提升系统性能。本文将详细介绍SQL查询优化、Golang中的性能调优技术以及MySQL的索引与分区管理方法。1、SQL查询优化 查询计划的作用查询计划是数据库执行SQL语句的过程及其成......