fastapi-Depends

2023-11-07 16:12
文章标签 fastapi depends

本文主要是介绍fastapi-Depends,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FastAPI提供了简单易用,但功能强大的依赖注入系统。这个依赖系统设计的简单易用,可以让开发人员轻松地把组件集成至FastAPI

编程中的「依赖注入」是声明代码(本文中为路径操作函数 )运行所需的,或要使用的「依赖」的一种方式。然后,由系统(本文中为 FastAPI)负责执行任意需要的逻辑,为代码提供这些依赖(「注入」依赖项)。依赖注入常用于以下场景:

  • 共享业务逻辑(复用相同的代码逻辑)
  • 共享数据库连接
  • 实现安全、验证、角色权限
  • 等……

上述场景均可以使用依赖注入,将代码重复最小化

简单使用

要使用依赖项,我们就不得不使用到Depends函数,使用如下:

from typing import Dictfrom fastapi import FastAPI
from fastapi import Query
from fastapi import Dependsapp = FastAPI()async def paging_params(per_page: int = Query(description='数量'),page: int = Query(description='页码')) -> Dict[str, int]:return dict(per_page=per_page, page=page)@app.get("/teachers")
async def teacher_list(params: dict = Depends(paging_params)):return params@app.get("/students")
async def student_list(params: dict = Depends(paging_params)):return params

这样就避免了重复定义分页参数了,这样使得代码更加简洁!

在上面的例子中,我们是使用了一个函数作为依赖项。除此之外,我们可以使用一个类来作为依赖项,使用如下:

class PagingParams(object):def __init__(self, name: str = Query(description='名称')):self.name = name@app.get("/teachers")
async def teacher_list(params: PagingParams = Depends()):return {'name': params.name}

所以只要它是一个Callable对象,那么它就可以作为一个依赖项使用!

有时,我们并不需要使用到依赖项的返回值,或者说有些依赖项不返回值,但是我们仍需要它执行或解析该依赖项。对于这种情况下,不必声明在视图函数的参数时使用Depends,而是可以在路径操作装饰器中添加一个由dependencies组成的list。如下:

from fastapi import Headerasync def ip_allowed(x_forwarded_for: str = Header(description='ip地址')):if x_forwarded_for not in ['192.168.0.100']:raise ForbiddenError@app.get("/teachers", dependencies=[Depends(ip_allowed)])
async def teacher_list():return {'code': 1}

路径装饰器依赖项的执行或解析方式和普通依赖项一样,但就算这些依赖项会返回值,它们的值也不会传递给路径操作函数。

嵌套依赖

FastAPI支持创建含子依赖项的依赖项。并且,可以按需声明任意深度的子依赖项嵌套层级,FastAPI负责处理解析不同深度的子依赖项。使用如下:

async def paging_params(per_page: int = Query(description='数量'),page: int = Query(description='页码')) -> Dict[str, int]:return dict(per_page=per_page, page=page)async def api_list_params(search: str = Query(description='查询参数'),params: dict = Depends(paging_params)) -> Dict[str, int]:params['search'] = searchreturn params@app.get("/teachers")
async def teacher_list(params: dict = Depends(api_list_params)):return params

可以看到视图函数中的依赖项api_list_params,该函数又有依赖项paging_params,这就形成了一个嵌套依赖!

上面嵌套依赖的代码中,FastAPI必须先处理paging_params,以便在调用api_list_params时使用paging_params返回的结果!

全局依赖

有时,我们要为整个应用添加依赖项,那么我们又该如何实现呢?在上面已经讲到过路径装饰器的dependencies参数,而且我们知道FastAPIAPIRouter都是支持该参数的的,所以如果我们想要添加全局依赖,或者部分依赖的话,我们可以用到dependencies参数,如下:

from fastapi import Header
from fastapi import Depends
from fastapi import FastAPIfrom app.utils import black_listasync def ip_allowed(x_forwarded_for: str = Header(description='ip地址')):if x_forwarded_for in black_list:   # 在黑名单中的IP禁止访问raise ForbiddenErrorapp = FastAPI(dependencies=[Depends(ip_allowed)])@app.get("/teachers")
async def teacher_list():return {'code': 1}

同理,如果我们只想给一组API添加依赖,我们可以在APIRouter中使用dependencies参数!!!

Dependencies with yield

FastAPI支持在完成后执行一些额外步骤的依赖项。为此,我们应该使用yield而不是return,然后在后边编写额外的步骤。使用如下:

async def get_db():db = Session()try:yield dbfinally:db.close()

注意事项

如果在同一个视图函数中多次声明了同一个依赖项,或者说多个依赖项共用一个子依赖项,FastAPI在处理同一请求时,只调用一次该子依赖项。如下:

from uuid import uuid4async def get_uuid_strings() -> str:return uuid4().hex@app.get("/home")
async def home(q1: str = Depends(get_uuid_strings),q2: str = Depends(get_uuid_strings)):return {'q1': q1, 'q2': q2}

当我们请求时,会发现q1q2的值是一模一样的。这是因为FastAPI不会为同一个请求多次调用同一个依赖项,而是把依赖项的返回值进行缓存,并把它传递给同一请求中所有需要使用该返回值的依赖项!

在高级使用场景中,如果不想使用缓存,而是为需要在同一请求的每一步操作中都实际调用依赖项,可以把Depends的参数use_cache的值设置为False。如下:

@app.get("/home")
async def home(q1: str = Depends(get_uuid_strings, use_cache=False),q2: str = Depends(get_uuid_strings, use_cache=False)):return {'q1': q1, 'q2': q2}

如此,q1q2的值将会是两个不一样的值了!

这篇关于fastapi-Depends的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364775

相关文章

构建现代API:FastAPI中Query与Body参数的最佳搭配

在FastAPI中,Query 和 Body 是两种不同的依赖注入器,它们的应用场景取决于你的具体需求。以下是它们各自常见的使用场景: Query 参数 使用场景: 当你需要从URL中获取一些简单的参数时,例如过滤、排序、分页等。 当数据量不大,且可以作为URL的一部分安全传输时。当数据不需要复杂的结构时。 Body 参数 使用场景: 当你需要发送较为复杂的数据结构时,例如包含多个字段

用python fastapi写一个http接口,使ros2机器人开始slam toolbox建图

如果你想使用Python的FastAPI框架编写一个HTTP接口,以便通过接口启动ROS 2机器人的SLAM Toolbox建图,可以按照以下方式进行: 首先,确保你已经安装了fastapi和uvicorn库。你可以使用以下命令进行安装: pip install fastapi uvicorn 接下来,创建一个Python文件(例如app.py),并将以下代码添加到文件中: import

使用nssm将fastapi做成服务解决cmd使用命令启动卡顿问题

下载nssm 点击下载 我使用的是64位的操作系统所以选择64位win64 点击进去在地址栏里面输入cmd回车 输入 nssm.exe install "想要做成的服务名称" "python路径精确到python.exe" "程序路径要绝对路径" 然后就做出了服务并且启动 可以在服务管理控制台中(可以通过运行services.msc命令来打开)找到你的服务,并可以右键点击进行启动、停止

FastAPI 中间件与依赖注入:打造灵活的 API 架构

在 FastAPI 中,Depends 是一个非常重要的概念,它用于依赖注入。依赖注入是一种设计模式,允许你将组件(如函数、类或服务)之间的依赖关系明确地表达出来,而不是硬编码在组件内部。这使得代码更加模块化、可测试和易于维护。 什么是 Depends? Depends 通常用于以下场景: 参数注入:将参数注入到路由处理函数中。服务注入:将服务或工具类的实例注入到路由处理函数中。前置验证:在

dockerfile部署fastapi项目

dockerfile部署fastapi项目 1、Dockerfile # 使用Python官方镜像作为基础镜像FROM python:3.8-slim# 更新apt-get源并安装依赖# RUN apt-get update -y && apt-get install -y git# 设置环境变量ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFF

FastAPI 中的 Query:优化你的数据获取策略

在 FastAPI 中,Query 是一个依赖项类,用于处理来自 HTTP 请求的查询参数。查询参数是 URL 的一部分,通常用于 GET 请求,它们在 URL 的路径之后,以 ? 开头,参数之间用 & 分隔。例如:http://example.com/api/items?name=foo&age=42。 Query 的作用和用途: 类型声明:Query 允许你为查询参数声明一个预期的数据类

FastAPI Query 类详解:参数验证与高级用法

在 FastAPI 中,Query 类用于定义查询参数,并提供了多种参数来限制和描述这些参数。以下是一些常用的参数,它们可以用来限制和描述 Query 类的实例: default: 描述:设置参数的默认值。类型:任何类型。示例:default=None alias: 描述:为参数设置一个别名,这在 URL 中使用的名称与函数参数名称不一致时非常有用。类型:str示例:alias="my_al

FastAPI+Vue3零基础开发ERP系统项目实战课 20240831上课笔记 查询参数和分页实现

回顾 获取路径参数什么是路径参数?/user/{id}什么时候使用?需要传递参数怎么实现类型转换?声明参数的类型怎么捕获文件路径?{file_path:path} 什么是查询参数 查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,以 & 分隔。 http://127.0.0.1:8000/items/?skip=0&limit=10 上面的 skip=0&limit=10

FastAPI+Vue3零基础开发ERP系统项目实战课 20240831上课笔记 路径参数

遗留的问题 3、FastAPI4、MySQL85、SQLModel,和FastAPI框架是同一个作者,两者结合比较好用,但是学习成本较高,使用难度稍大6、Vue37、Tailwindcss8、Ant Design Vue,UI组件库9、数据同步:有一个API,这个API提供了一些数据,需要在ERP系统中进行展示。10、登录注册需要吗?需要11、第三方平台管理:对接哪些接口平台飞书,钉钉,聚水潭等

fastapi接口里日志重复写,用metaclass 单例模式解决了

遇到这个妖 我用fastapi写接口,打印日志用我自定义的日志类,但只要是fastapi 接口[即注解@app.get(‘/’) 或者 @app.post(‘/’) ] 之内打印的都是两遍,其他地方都是正常。这我很费解。说是我日志类的问题吧,我这类放其他地方都好使;说是fastapi的问题吧,人家日志格式跟我自定义的差别又很明显。 我自定义的logging类: import logging