当前位置: 首页 > news >正文

FastAPI 第八课 -- 路径操作依赖项

目录

一. 前言

二. 依赖项(Dependencies)

2.1. 依赖注入

2.2. 依赖项的使用

三. 路径操作依赖项的基本使用

3.1. 预处理(Before)

3.2. 后处理(After)

四. 多个依赖项的组合

五. 异步依赖项


一. 前言

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

FastAPI 提供了路径操作依赖项(Path Operation Dependencies)的机制,允许你在路由处理函数执行之前或之后运行一些额外的逻辑。

依赖项就是一个函数,且可以使用与路径操作函数相同的参数。

路径操作依赖项提供了一种灵活的方式来组织代码、验证输入、进行身份验证等。

接下来我们会具体介绍 FastAPI 路径操作依赖项的相关知识点。

二. 依赖项(Dependencies)

依赖项是在路由操作函数执行前或后运行的可复用的函数或对象。

它们被用于执行一些通用的逻辑,如验证、身份验证、数据库连接等。在 FastAPI 中,依赖项通常用于两个方面:

  • 预处理(Before)依赖项: 在路由操作函数执行前运行,用于预处理输入数据,验证请求等。
  • 后处理(After)依赖项: 在路由操作函数执行后运行,用于执行一些后处理逻辑,如日志记录、清理等。

2.1. 依赖注入

依赖注入是将依赖项注入到路由操作函数中的过程。

在 FastAPI 中,通过在路由操作函数参数中声明依赖项来实现依赖注入。

FastAPI 将负责解析依赖项的参数,并确保在执行路由操作函数之前将其传递给函数。

2.2. 依赖项的使用

定义依赖项:

from fastapi import Depends, FastAPIapp = FastAPI()# 依赖项函数
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):return {"q": q, "skip": skip, "limit": limit}

在这个例子中,common_parameters 是一个依赖项函数,用于预处理查询参数。

在路由中使用依赖项:

from fastapi import Depends# 路由操作函数
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):return commons

在这个例子中,read_items 路由操作函数中的参数 commons 使用了 Depends(common_parameters),表示 common_parameters 是一个依赖项。FastAPI 将在执行路由操作函数之前运行 common_parameters 函数,并将其返回的结果传递给 read_items 函数。

三. 路径操作依赖项的基本使用

3.1. 预处理(Before)

以下实例中,common_parameters 是一个依赖项函数,它接受查询参数 q、skip 和 limit,并返回一个包含这些参数的字典。

在路由操作函数 read_items 中,通过传入 Depends(common_parameters),我们使用了这个依赖项函数,实现了在路由执行前预处理输入数据的功能。

from fastapi import Depends, FastAPI, HTTPExceptionapp = FastAPI()# 依赖项函数
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):return {"q": q, "skip": skip, "limit": limit}# 路由操作函数
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):return commons

3.2. 后处理(After)

以下例子中,after_request 是一个后处理函数,用于在路由执行后执行一些逻辑。

在路由操作函数 read_items_after 中,通过传入 Depends(after_request),我们使用了这个后处理依赖项,实现了在路由执行后进行额外操作的功能。

from fastapi import Depends, FastAPI, HTTPExceptionapp = FastAPI()# 依赖项函数
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):return {"q": q, "skip": skip, "limit": limit}# 路由操作函数
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):return commons# 后处理函数
async def after_request():# 这里可以执行一些后处理逻辑,比如记录日志pass# 后处理依赖项
@app.get("/items/", response_model=dict)
async def read_items_after(request: dict = Depends(after_request)):return {"message": "Items returned successfully"}

四. 多个依赖项的组合

以下例子中,common_parameters 和 verify_token 是两个不同的依赖项函数,verify_token 依赖于 common_parameters,这种组合依赖项的方式允许我们在路由执行前先验证一些参数,然后在进行身份验证。

from fastapi import Depends, FastAPI, HTTPExceptionapp = FastAPI()# 依赖项函数1
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):return {"q": q, "skip": skip, "limit": limit}# 依赖项函数2
def verify_token(token: str = Depends(common_parameters)):if token is None:raise HTTPException(status_code=400, detail="Token required")return token# 路由操作函数
@app.get("/items/")
async def read_items(token: dict = Depends(verify_token)):return token

五. 异步依赖项

依赖项函数和后处理函数可以是异步的,允许在它们内部执行异步操作。

以下例子中,get_token 是一个异步的依赖项函数,模拟了一个异步操作。

在路由操作函数 read_items 中,我们使用了这个异步依赖项函数。

from fastapi import Depends, FastAPI, HTTPException
from typing import Optional
import asyncioapp = FastAPI()# 异步依赖项函数
async def get_token():# 模拟异步操作await asyncio.sleep(2)return "fake-token"# 异步路由操作函数
@app.get("/items/")
async def read_items(token: Optional[str] = Depends(get_token)):return {"token": token}

通过使用路径操作依赖项,你可以在路由执行前或后执行额外的逻辑,从而实现更灵活、可组合的代码组织方式。

http://www.lryc.cn/news/449765.html

相关文章:

  • 大厂面试真题-说一下Mybatis的缓存
  • jQuery UI 工作原理
  • CS 工作笔记:SmartEdit 里创建的是 CMS Component
  • Java面试经验总结之SSM框架+springboot
  • Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包
  • 享元(轻量级)模式
  • 基于php的幸运舞蹈课程工作室管理系统
  • NLP任务的详细原理与步骤的详细讲解
  • Kotlin 处理字符串和正则表达式(二十一)
  • 一站式大语言模型API调用:快速上手教程
  • 【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】
  • 程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养
  • Linux之Docker虚拟化部署
  • 重构部队信息安全:部队涉密载体建设新策略
  • 使用Node.js的readline模块逐行读取并解析大文件
  • 浅谈软件安全开发的重要性及安全开发实践
  • 在 NodeJs 里面如何获取 APK 的名称和 icon
  • 基于VirtualBox和Ubuntu的虚拟环境搭建
  • 【PHP源码】匿名来信系统H5版本V1.0免费开源
  • Prompt技巧总结和示例分享
  • 大厂校招:海能达嵌入式面试题及参考答案
  • wrk(1) command
  • 【小程序 - 大智慧】Expareser 组件渲染框架
  • vue + echarts 快速入门
  • 服务器几核几G几M是什么意思?如何选择?
  • K8S服务发布
  • Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo
  • Html CSS 布局,位置处理 居中 对齐
  • Spring MVC系统学习(二)——Spring MVC的核心类和注解
  • conda虚拟环境安装包、依赖同一管理