arbitrary_types_allowed: 允许模型接受任意类型的字段,而不仅限于标准的 Pydantic 类型。...alias_generator: 生成别名的函数,用于字段名称,通常用于生成符合特定API规范的别名。...allow_population_by_field_name: 允许通过字段名称而不是别名来填充模型数据。...use_enum_values: 当设置为 True 时,枚举字段将输出枚举成员的值而不是枚举成员本身。...通常,查询参数是扁平的键值对,而不是复杂的、嵌套的 JSON 对象。这意味着直接将一个嵌套的 Pydantic 模型用作查询参数并不直接支持。
表单参数 learn from https://fastapi.tiangolo.com/zh/tutorial/response-model/ 1. response_model 响应模型 不是 路径参数...208) async def read_item(item_id: str): return items[item_id] 关于 HTTP 状态码 在 HTTP 协议中,你将发送 3 位数的数字状态码作为响应的一部分...100 及以上状态码用于「消息」响应。你很少直接使用它们。具有这些状态代码的响应不能带有响应体。 200 及以上状态码用于「成功」响应。这些是你最常使用的。...一个特殊的例子是 204,「无内容」。此响应在没有内容返回给客户端时使用,因此该响应不能包含响应体。 300 及以上状态码用于「重定向」。...表单参数 接收的不是 JSON,而是表单字段时,要使用 Form from fastapi import FastAPI, Form app = FastAPI() @app.post("/login
item-query=foobaritems中的item-query不是Python变量命名,那么可以设置别名: from typing import Optional from fastapi import...=UserOut) async def create_user(user: UserIn): return user 函数返回值是UserIn模型的对象user,而response_model的值为...UserOut(UserOut相比于UserIn来说,没有password),那么FastAPI的响应,就是用UserOut对UserIn进行了过滤,返回的是没有password的UserOut。...响应模型可以返回默认值: from typing import List, Union from fastapi import FastAPI from pydantic import BaseModel...] response_model_exclude_unset=True不返回未显式设置的字段,response_model_exclude_defaults不返回带默认值的字段,response_model_exclude_none
前言 许多情况下,需要向客户端返回一些特定的错误,比如 客户端没有足够的权限进行该操作 客户端无权访问该资源 客户端尝试访问的项目不存在 HTTPException 介绍 要将带有错误的 HTTP 响应...,应该 raise 它,而不是 return 它 查看一下 HTTPException 源码 status_code:响应状态吗 detail:报错信息 headers:响应头 简单的栗子 当 item_id...重写默认异常处理程序 FastAPI 有一些默认的异常处理程序 比如:当引发 HTTPException 并且请求包含无效数据时,异常处理程序负责返回默认的 JSON 响应 可以使用自己的异常处理程序覆盖...body 属性 RequestValidationError 包含它收到的带有无效数据的正文,可以在开发应用程序时使用它来记录主体并调试它,将其返回给用户 数据验证失败的请求结果 看一眼 RequestValidationError...的子类 当使用了 response_model,如果响应数据校验失败,就会抛出 ValidationError 客户端并不会直接收到 ValidationError,而是会收到 500,并报 Internal
前言 前面文章写的这么多路径函数最终 return 的都是自定义结构的字典 FastAPI 提供了 response_model 参数,声明 return 响应体的模型 什么是路径操作、路径函数 # 路径操作...Pydantic Model FastAPI 通过 response_model 会做 将输出数据转换为 Model 中声明的类型 验证数据 在 OpenAPI 给 Response 添加 JSON...因为路径函数的返回值并不是固定的,可能是 dict、数据库对象,或其他模型 但是使用响应模型可以对响应数据进行字段限制和序列化 区分请求模型和响应模型的栗子 需求 假设一个注册功能 输入账号、密码、昵称...、邮箱,注册成功后返回个人信息 正常情况下不应该返回密码,所以请求体和响应体肯定是不一样的 实际代码 from typing import Optional from fastapi import FastAPI...password FastAPI 通过 Pydantic 过滤掉所有未在响应模型中声明的数据 正确传参的请求结果 查看 Swagger API 文档 来看看路径操作有什么关于响应模型的参数 response_model_exclude_unset
: {"item_id":11} 注意函数接收(并返回)的值为 11,是一个 Python int 值,而不是字符串 "11"。...2.3路径参数高级用法 2.3.1 Pydantic 模型(请求体)作为路径参数 在 FastAPI 中,使用 Pydantic 模型作为路径参数的优势主要体现在以下几个方面: 类型转换和验证:通过使用...Pydantic 模型作为路径参数,你可以指定参数的类型,并利用 Pydantic 的验证规则来确保传入的参数值符合预期的格式和约束。...这样,如果需要更改参数的类型或验证规则,你只需要修改模型的定义,而不必在多个地方修改代码。 更清晰的代码结构:通过使用 Pydantic 模型作为路径参数,可以使代码结构更清晰和可读。...) 2.3.3 路径参数申明元数据 在 FastAPI 中,路径参数的元数据用于提供关于该参数的额外信息,例如描述、示例值、别名等。
)序列化 JSON 响应 文档自动生成:Swagger UI 和 Redoc 文档会自动显示正确的响应模型,包括字段描述和别名 请求:curl -X 'POST' 'http://127.0.0.1...=True,那么无论路由级别的设置如何,这个字段都不会被包括在任何响应中 FastAPI 的 response_model_include 和 response_model_exclude: 这些设置在路由级别...) Response 对象将优先,这是因为 Response 对象被视为最终响应,FastAPI 不会对其内容进行进一步的处理或修改 这种方法特别适用于以下场景: 自定义响应:当你需要完全控制返回的...和直接返回 Response 对象(如 JSONResponse) Response 对象将优先,这是因为 Response 对象被视为最终响应,FastAPI 不会对其内容进行进一步的处理或修改...高度灵活:可以根据函数逻辑返回不同类型的响应,如重定向或 JSON 响应 明确控制:直接控制响应的具体类型和内容,适用于需要根据不同条件返回不同响应类型的场景 文档生成:自动生成的
需求 注册功能 请求输入密码 响应不需要输出密码 数据库存储加密后的密码 实际代码 #!...import FastAPI from typing import Optional from pydantic import BaseModel, EmailStr app = FastAPI()...因为代码重复增加了错误、安全问题、代码同步问题(当在一个地方更新而不是在其他地方更新时)等的可能性 上面代码存在的问题 三个模型都共享大量数据 利用 Python 继承的思想进行改造 声明一个 UserBase...模型,作为其他模型的基础 然后创建该模型的子类来继承其属性(类型声明、验证等),所有数据转换、验证、文档等仍然能正常使用 这样,不同模型之间的差异(使用明文密码、使用哈希密码、不使用密码)也很容易识别出来...import FastAPI from typing import Optional from pydantic import BaseModel, EmailStr app = FastAPI()
,使用response_model 参数指明该路径的响应模型 其具有以下特点: 转换为类型声明的输出数据 响应数据的校验 在 OpenAPI 路径操作中,为响应添加 JSON Schema 生成 API...而且,response_model 接收的类型与声明 Pydantic 模型属性的类型,语法完全相同 使用响应模型 先来看下简单的用法,定义一个响应模型 User from pydantic import...response_model_include 如果只有一个 Pydantic 模型, 但是在不同的接口中,因为某些需求不同,返回的 body 又不一样。...[name_id] 可以看到, response_model_exclude_unset 参数为 True 的时候,未修改的默认参数不会返回 反之,给默认值字段赋予了新的内容,则新的值会包含在返回的响应中...[name_id] 返回结果如下: 虽然 FastAPI 能够识别出 description、tax 和 tags 的值与默认值相同,这些值也会显式设置(而不是取自默认值)
背景 创建 FastAPI 路径操作函数时,通常可以从中返回任何数据:字典、列表、Pydantic 模型、数据库模型等 默认情况下,FastAPI 会使用 jsonable_encoder 自动将该返回值转换为...将使用 JSONResponse 返回响应 但是可以直接从路径操作函数中返回自定义的 JSONResponse 返回响应数据的常见方式(基础版) https://www.cnblogs.com/poloyy.../p/15364635.html 最简单的栗子 路径操作函数返回一个 Pydantic Model #!...Model 类 但最终返回给客户端的是一个 JSON 数据 等价写法 @app.post("/item") async def get_item(item: Item): return item...__name__} ' TypeError: Object of type Item is not JSON serializable 类型错误:项目类型的对象不是 JSON 可序列化的 因为它无法转换为
这次我们来看下响应模型。我们之前看的都是请求模型,请求参数,这次呢,我们看下响应相关的。 正文 我们可以在我们不同的请求路径的返回参数使用响应模型。我们看一个简单的demo。...=One) def create_item(item: One): return item 我们可以看下,接口的正常返回 response_model是「装饰器」方法(get...它接收的类型与你将为 Pydantic 模型属性所声明的类型相同,因此它可以是一个 Pydantic 模型,但也可以是一个由 Pydantic 模型组成的 list,例如 List[Item]。...FastAPI 将使用此 response_model 来: 将输出数据转换为其声明的类型。 校验数据。 在 OpenAPI 的路径操作中为响应添加一个 JSON Schema。...我们在接口的请求中,如果不传递,我不想要返回带默认值的, 我们看下代码如何实现的 from typing import Optional from fastapi
,而且 Swagger API 并不会显示 GET 请求的请求体 不使用 Pydantic的栗子 from fastapi import FastAPI import uvicorn app = FastAPI...JSON 字符串转换为 dict 这种场景下,虽然查询参数叫 item,但请求体的字段名可以随意取,字段数量也可以任意个 错误传参的请求结果 选了 text 之后,因为不是 JSON 字符串,FastAPI...JSON 字符串 将字段值转换相应的类型(若有需要) 验证数据,如果验证失败,会返回一个清晰的错误,准确指出错误数据的位置和信息 item 会接收到完整的请求体数据,拥有所有属性及其类型,IDE 也会给予对应的智能提示...查看 Swagger API 文档 Schema 部分 model 的 JSON Schema 会成为 Swagger APi 文档的一部分 示例值部分 IDE 智能提示 因为知道 name 属性的类型是...可以识别出它们中的每一个,并从正确的位置获取到数据 实际代码 from typing import Optional from fastapi import FastAPI from pydantic
还具有后台任务功能,您可以使用它来定义返回响应后要运行的后台任务。...我们把密码 passwords 作为一个键而不是 password 传递进去。Pydantic 模型会自动告诉用户,password 字段是缺失的。...然后通过 response_model 参数将响应模型传递给装饰器。 现在,如果我们将请求本身作为响应返回,Pydantic 将省略 password ,因为我们定义的响应模型不包含密码字段。...上述中间件计算处理请求所花费的时间。视图函数处理请求后,计算总处理时间并将其作为响应头返回。...如果不是,它会拒绝请求,并将错误响应发送回调用者。
@my_app.get("/") 告诉 FastAPI 在它下方的函数负责处理如下访问请求: 请求路径为 / 使用 get 操作 函数可以返回一个 dict、list,像 str、int 一样的单个值,...还可以返回 Pydantic 模型 1.1 小结 导入 FastAPI 创建一个 app 实例 编写一个路径操作装饰器(如 @app.get("/")) 编写一个路径操作函数(如上面的 def root...your_enum_member.value 来获取实际的值 2.3 包含路径的路径参数 参数 { } 内 参数名:path :前后均没有空格,不加 :path 无法识别 带有/ 的路径参数...请求体 请求体是客户端发送给 API 的数据 响应体是 API 发送给客户端的数据 使用 Pydantic 模型来声明请求体 from typing import Optional from Pinyin2Hanzi...import Item from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name
pydantic import BaseModel import uvicorn app = FastAPI() class Item(BaseModel): name: str...typing import Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI()...("/items/{item_id}") async def update_item(item_id: int, item: Item, # 指定第一个 Model...类型 user: User): # 指定第二个 Model 类型 results = { "item_id": item_id,...Body,因为这 item、user 两个参数都指定了 Pydantic 模型 FastAPi 将使用参数名作为 Request Body 中的键(字段名称) 期望得到的 Request Body {
(item_id): return {"item_id": item_id} 路径参数 item_id 的值将作为参数 item_id 传递给你的函数。...数据转换 如果你运行示例并打开浏览器访问 http://127.0.0.1:8000/items/3,将得到如下响应: {"item_id":3} 小笔记:注意函数接收(并返回)的值为 3,是一个 Python...int 值,而不是字符串 "3"。..."foo",它不是一个 int。...(ModelName)创建一个带有类型标注的路径参数: async def get_model(model_name: ModelName): 因为已经指定了路径参数的可用值,所以交互式文档可以恰当地展示它们
一、引言 对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。...对应的值作为api_key。...代码如下 from fastapi import FastAPI, HTTPException, Depends, Header from pydantic import BaseModel # 创建...这样,你就可以在路由处理函数中使用 api_key 参数,而不需要担心鉴权逻辑。FastAPI 会自动处理鉴权,并确保只有通过鉴权的请求才能访问到你的 API。...Header 函数的参数 alias 用于指定请求头中的字段名。
的缺点(客观) 缺点 描述 生态比 Django 小 ORM / Admin 不如 Django 完整 Pydantic 学习成本 初学者需要适应 Model 模式 高度依赖类型提示 代码量相比 Flask...如何使用 Pydantic Model? 1....Body 参数使用 Pydantic Model from pydantic import BaseModel class User(BaseModel): name: str age:...支持的 HTTP 请求方式 除了 GET、POST,还支持: 方法 用法 PUT 更新资源 DELETE 删除资源 PATCH 局部更新 OPTIONS 预检请求 HEAD 返回响应头 示例: @app.delete...是现代 Python 服务端最佳实践 FastAPI 的优势不是某一项功能,而是: 类型提示优先 自动文档 原生异步 依赖注入 强数据校验 工程化优秀 结合 Uvicorn + Pydantic +
实际代码 默认情况下,路径操作函数可以返回 Python 数据类型、Pydantic Model,FastAPI 会自动将它们转换为和 JSON 兼容的数据 #!...import FastAPI, Response from fastapi.responses import JSONResponse from pydantic import BaseModel...Model @app.post("/ret_pydantic") def ret_pydantic(item: Item): return item # 5.返回 json 字符串 @app.get...字符串 字典 列表 Pydantic Model JSON 字符串 返回字符串的请求结果 返回字典的请求结果 返回列表的请求结果 返回 Pydantic Model 的请求结果 返回 JSON...字符串的请求结果 重点 这只是最基础简单的五种方式 其实 FastAPI 还提供许多返回响应数据的方式,后面的文章会一一详解
{"item":"apple","q":"delicious"} 这太好了,我们已经创建了API有两个终点: http://127.0.0.1:8000/不接收任何参数,它只是返回一个JSON响应。...好的,到目前为止还不错,我们现在将使用pydantic库来创建数据接口schema,它的主要作用是做类型强制检查,有点类似DRF的序列化器。...,并且将类型作为参数传递为此类=Column question_text = Column(String) 而Pydantic风格声明使用: 和小写的str。...question_text: str Pyndatic 模型/模组将映射到传入数据(POST、PUT 中的请求数据)和从 API 返回的响应数据。...= Depends(get_db)): return crud.get_all_questions(db=db) 注意在,返回对象列表,而不仅仅是一个对象,所以我们应该让我们的框架知道。