Python中FastAPI项目使用 Annotated的参数设计
在FastAPI中,你可以使用PEP 593中的Annotated类型来添加元数据到类型提示中。这个功能非常有用,因为它允许你在类型提示中添加更多的上下文信息,例如描述、默认值或其他自定义元数据。
FastAPI支持Annotated类型,这使得你可以为路径操作函数的参数提供额外的元数据,例如依赖项、查询参数的描述、别名等。
FastAPI介绍
FastAPI 是一个用于构建 API 的现代、快速(高性能)web 框架,基于 Python 类型提示。它的主要特点包括自动生成 OpenAPI 和 JSON Schema 文档、快速代码编写、简洁的代码结构、高效的性能等。FastAPI 使用 Starlette 作为 Web 框架的核心,并使用 Pydantic 进行数据验证。
FastAPI 的主要特点
快速:
- FastAPI 的性能非常接近于 NodeJS 和 Go 等速度较快的语言,并且比其他基于 Python 的框架如 Flask 和 Django 快得多。
简洁:
- 通过类型提示和依赖注入,代码简洁易读。
- 开发者可以更少的代码实现更多的功能。
自动文档生成:
- FastAPI 自动生成符合 OpenAPI 规范的文档,这些文档可以通过内置的 Swagger UI 和 ReDoc UI 查看。
- 自动生成 JSON Schema。
数据验证:
- 基于 Pydantic,FastAPI 提供了强大的数据验证功能。
- 支持复杂的数据验证和数据解析。
类型提示:
- 充分利用 Python 3.6+ 的类型提示,帮助开发者编写和维护代码。
依赖注入:
- FastAPI 提供了一个简单但功能强大的依赖注入系统,可以方便地管理依赖项。
FastAPI 还支持以下功能:
- 文件上传
- 安全性(OAuth2、JWT 等)
- 后台任务
- 流媒体响应
- GraphQL
- SQL(通过 SQLAlchemy 等)
- 数据库事务
- 后台任务
安装 FastAPI 和 Uvicorn
pip install fastapi
pip install "uvicorn[standard]"
FastAPI 是一个非常现代化和高效的框架,非常适合用于构建高性能的 API。其自动文档生成、数据验证和依赖注入等特性,使得开发者能够更快、更安全地编写代码,并提供出色的用户体验。
1、Query参数-查询参数
Query参数是指我们在URL中带有的查询参数如url/items?q=123&b=234 的类型格式。
假设我们要创建一个API,其中的查询参数需要带有描述和默认值:
from fastapi import FastAPI, Query
from typing import Annotated app = FastAPI() @app.get("/items/")
async def read_items(
q: Annotated[str, Query(description="Query string", min_length=3, max_length=50)] = "default"
):
return {"q": q}
在这个例子中:
- 我们导入了FastAPI和
Query类,以及Annotated类型。 - 我们创建了一个FastAPI应用实例。
- 我们定义了一个路径操作函数
read_items,它有一个查询参数q。 - 我们使用
Annotated类型为查询参数q添加了元数据,这些元数据包括描述、最小长度和最大长度等。 Annotated的第一个参数是类型提示,第二个参数是与此类型相关的元数据。
Annotated类型允许你将额外的元数据与类型提示关联,这在创建API时特别有用,因为它可以帮助生成更丰富的API文档并确保参数验证。
下面是一个更复杂的例子,展示了如何使用Annotated类型与依赖项结合:
from fastapi import Depends def common_parameters(
q: Annotated[str, Query(description="Query string", min_length=3, max_length=50)] = "default"
):
return {"q": q} @app.get("/items/")
async def read_items(params: Annotated[dict, Depends(common_parameters)]):
return params
在这个例子中:
- 我们定义了一个依赖函数
common_parameters,它返回一个包含查询参数q的字典。 - 我们使用
Annotated类型和Depends将这个依赖项注入到路径操作函数read_items中。 read_items函数返回了从依赖函数中获取的参数字典。
这种方法不仅简化了路径操作函数的参数定义,还使得代码更具可读性和可维护性。
2、Path参数-路径参数
路径参数通常用于从 URL 路径中提取信息。例如,如果你有一个获取用户信息的路径 /users/{user_id},你可以这样定义路径参数:
from fastapi import FastAPI
from fastapi.params import Path
from typing import Annotated app = FastAPI() @app.get("/users/{user_id}")
async def read_user(user_id: Annotated[int, Path(..., title="The ID of the user to get")]):
return {"user_id": user_id}
在这个示例中,Annotated[int, Path(..., title="The ID of the user to get")] 表示 user_id 是一个整数,并且它是从路径中提取的参数。此外,我们还为这个参数添加了一个标题,用于生成 API 文档。
3、Body参数-请求体参数
求体参数用于处理复杂的数据结构,例如 JSON 请求体。你可以使用 Pydantic 模型来定义请求体的结构,并使用 Annotated 来进一步注解这些参数。例如:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Annotated app = FastAPI() class User(BaseModel):
name: str
age: int @app.post("/users/")
async def create_user(user: Annotated[User, Body(..., title="The user to create")]):
return {"user": user}
在这个示例中,Annotated[User, Body(..., title="The user to create")] 表示 user 参数是一个 User 模型实例,并且它来自请求体。我们同样为这个参数添加了一个标题。
有时候我们可以结合路径参数和请求体参数进行使用,如下例子:
from fastapi import FastAPI, Path, Body
from pydantic import BaseModel
from typing import Annotated app = FastAPI() class User(BaseModel):
name: str
age: int @app.put("/users/{user_id}")
async def update_user(
user_id: Annotated[int, Path(..., title="The ID of the user to update")],
user: Annotated[User, Body(..., title="The new user data")]
):
return {"user_id": user_id, "user": user}
在这个综合示例中,路径参数 user_id 和请求体参数 user 都使用了 Annotated 进行注解,以明确它们的来源和意图,同时为生成的 API 文档提供了更多的上下文信息。
复杂的请求体通常包括嵌套的结构,可以使用 Pydantic 模型来定义。例如:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Annotated app = FastAPI() class Address(BaseModel):
street: str
city: str
state: str
zip: str class User(BaseModel):
name: str
age: int
addresses: List[Address] @app.post("/users/")
async def create_user(user: Annotated[User, Body(..., title="The user to create")]):
return {"user": user}
在这个例子中,User 模型包含一个嵌套的 Address 列表,这样你就可以在请求体中处理复杂的嵌套数据结构。
一个结合路径参数、查询参数和请求体参数的复杂示例:
from fastapi import FastAPI, Path, Query, Body
from pydantic import BaseModel
from typing import Annotated app = FastAPI() class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None @app.put("/items/{item_id}")
async def update_item(
item_id: Annotated[int, Path(..., title="The ID of the item to update")],
q: Annotated[str | None, Query(None, max_length=50, title="Query string")],
item: Annotated[Item, Body(..., title="The item to update")]
):
result = {"item_id": item_id, "item": item}
if q:
result.update({"q": q})
return result
在这个综合示例中,我们使用了路径参数 item_id、查询参数 q 和请求体参数 item,并通过 Annotated 对这些参数进行注解,明确它们的来源和约束。
应用上面的处理方案,我们在项目中应用FastApi构建文档如下所示。

Python中FastAPI项目使用 Annotated的参数设计的更多相关文章
- Python中sort、sorted的cmp参数废弃之后使用cmp_to_key实现类似功能
Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...
- [Python]在python中调用shell脚本,并传入参数-02python操作shell实例
首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数 test_shell ...
- Python中sort、sorted的cmp参数废弃之后使用__lt__支持复杂比较的方法
Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...
- Python中使用PyCharm为函数及参数增加注释
在函数名中键入数遍光标,左上角亮起小灯泡,点击小灯泡 选中第二行内容 在"""后添加函数注释,以及参数注释 然后再引用函数时,选中函数,Ctrl q 即可显示函数以及参 ...
- python中requests库get方法带参数请求
起因是想爬五等分的花嫁的漫画.这是其中的一个坑 先上代码 data={ 'cid':567464, , 'key':'', 'language':1, 'gtk':6, '_cid':567464, ...
- python 中函数的参数
一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...
- python 中*args 和 **kwargs
简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...
- Python 中的设计模式详解之:策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...
- python中的*args和**kw
学习python装饰器decorator的时候遇到*args和**kw两种函数值传递. 在python中定义函数,可以使用一般参数.默认参数.非关键字参数和关键字参数. 一般参数和默认参数在前面的学习 ...
- 简单介绍下python中函数的基础语法
python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...
随机推荐
- 日常Bug排查-MVCC和for update混用导致读数据不一致
日常Bug排查-MVCC和for update混用导致读数据不一致 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 又是喜闻 ...
- mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.
在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...
- JVM面试篇(下)
垃圾收集器 简述 Java 垃圾回收机制 在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行 ...
- 表格补充 表单补充 BFC
表格标签补充" A,数据行分组 <thead></thead>表头 <tbody></tbody>表体 <tfoot></t ...
- sse 与 编译器自动优化
direct x 形式的矩阵和向量计算代码在编译的时候是自动汇编为 sse汇编的 何时使用手写sse 指令呢,当你的应用程序需要写一些物理运算时候 可以使用自己编写的sse计算函数来为 3维运算加速 ...
- Truncate的使用详解
删除表中数据的方法有 delete 和 truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作:TRUNCATE TABLE 与没有 WHERE 子句的 DE ...
- 彻底解决C盘不够用的问题(Windows 10)- 常规方法——清垃圾、转虚拟内存、挪大文件
1.清垃圾 2.转虚拟内存 3.挪大文件
- debian使用桌面管理器管理多个桌面系统
环境:debian12.x 前言:我安装了debian12版本的操作系统在虚拟机中,在安装的时候选择的是KDE桌面,便于以后日常使用linux操作系统 在安装KDE桌面后,会自动安装一个sddm,sd ...
- WPF Canvas在Image 图像上绘图,自适应缩放.
效果如图 实现了绘图,自适应缩放 核心代码如下 <Window.InputBindings> <KeyBinding Key="Z" Modifiers=&quo ...
- R 语言入门学习笔记:软件安装踩坑记录——删除所有包以及彻底解决库包被安装到 C 盘用户目录下的问题,以及一些其他需要注意的点
目录 R 语言入门学习笔记:软件安装踩坑记录--删除所有包以及彻底解决库包被安装到 C 盘用户目录下的问题,以及一些其他需要注意的点 软件版本及环境 遇到的问题描述 问题的分析和探究 最终的解决方案 ...