Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FastAPI后台开发基础(5):使用 Pydantic Model 定义参数类型

FastAPI后台开发基础(5):使用 Pydantic Model 定义参数类型

原创
作者头像
密码学人CipherHUB
修改于 2024-10-11 23:32:12
修改于 2024-10-11 23:32:12
51600
代码可运行
举报
文章被收录于专栏:编码视界编码视界
运行总次数:0
代码可运行

Pydantic Model类型

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Genders(str, Enum):
    Male = 'male'
    Female = 'female'


class ExtendItem(BaseModel):
    a: str = ''
    b: int = 0
    c: float = 0.1
    d: bool = False

    class Config:
        """
        在 Pydantic 模型中,Config 类用于配置模型的行为。你可以在这个类中设置多种属性来调整模型的解析、验证和序列化行为。以下是一些常用的 Config 类字段:
            title: 用于为模型提供一个标题,通常用于生成的文档或模式中。
            extra: 控制如何处理未在模型中声明的额外字段。可选值包括 ignore、allow、forbid。
            arbitrary_types_allowed: 允许模型接受任意类型的字段,而不仅限于标准的 Pydantic 类型。
            json_encoders: 为特定类型提供自定义的 JSON 编码器。
            alias_generator: 生成别名的函数,用于字段名称,通常用于生成符合特定API规范的别名。
            allow_population_by_field_name: 允许通过字段名称而不是别名来填充模型数据。
            min_anystr_length: 字符串和字节类型字段的最小长度。
            max_anystr_length: 字符串和字节类型字段的最大长度。
            min_number_size: 数字类型字段的最小值。
            max_number_size: 数字类型字段的最大值。
            validate_assignment: 设置为 True 时,将在字段值被赋予新值后触发验证。
            error_msg_templates: 自定义错误消息模板。
            orm_mode: 允许模型与 ORM 模型兼容,通过允许使用非字典对象进行模型初始化。
            use_enum_values: 当设置为 True 时,枚举字段将输出枚举成员的值而不是枚举成员本身。
            anystr_strip_whitespace: 自动去除任何字符串或字节字段周围的空白。
            schema_extra: 允许为 Pydantic 模型的 JSON Schema 添加额外的信息。
            json_loads 和 json_dumps: 自定义 JSON 加载和转储函数。
            keep_untouched: 保持某些类型在模型处理中不被修改,通常用于装饰器等高级用途。
        """
        extra = "allow"  # 允许额外字段

class Item1(BaseModel):
    name: str = 'Bob'
    description: str
    price: float
    tax: int
    tags: list[str] = []
    gender: Genders
    flags: Literal['test1', 'test2']

    class Config:
        title = 'Item1'
        extra = "allow"  # 允许额外字段

Model的使用

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
    test: Item1 = Item1(name = 'Boc',
                        description = 'test_desc',
                        price = 1.23,
                        tax = 123,
                        tags = ['tag_1', 'tag_2'],
                        gender = Genders.Male,
                        flags = 'test1',
                        extend = ExtendItem(a = 'a', b = 1, c = 0.1, d = True))

    # 将 json string 转化为 model 对象
    test = Item1.model_validate_json(test.model_dump_json(indent = 4))
    # 将model对象打印成 json string
    print(test.model_dump_json(indent = 4))

GET请求的查询参数使用 model 类

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
@app.get("/get_model")
async def get_model(items: Annotated[Item1, Query(description = 'GET 请求参数模型定义')]):
    """
    GET请求不支持参数的嵌套
    curl -X 'GET' \
      'http://127.0.0.1:18081/get_model?name=Bob&description=desc_test&price=1.23&tax=123&tags=tag_1&tags=tag_2&gender=male&flags=test1' \
      -H 'accept: application/json'
    """
    print(items)
    return {
        "method": "GET",
        "message": items
    }
GET Query 查询参数
GET Query 查询参数

注意:查询参数不能使用嵌套的 model 对象。

通常,查询参数是扁平的键值对,而不是复杂的、嵌套的 JSON 对象。这意味着直接将一个嵌套的 Pydantic 模型用作查询参数并不直接支持。

嵌套查询参数的方式

使用 JSON 字符串作为查询参数

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Item(BaseModel):
    name: str
    description: Optional[str] = None

@app.get("/items/")
async def read_items(json_str: str = Query(...)):
    try:
        item = parse_raw_as(Item, json_str)
        return {"name": item.name, "description": item.description}
    except Exception as e:
        return {"error": str(e)}

使用自定义依赖

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Item(BaseModel):
    name: str
    description: Optional[str] = None

def query_extractor(q: str = None):
    # 这里可以添加解析逻辑,例如解析 JSON 字符串或处理多个相关查询参数
    return Item(name=q, description="Sample")

@app.get("/items/")
async def read_items(item: Item = Depends(query_extractor)):
    return {"name": item.name, "description": item.description}

POST请求

嵌套的 model

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Item2(Item1):
    extend: Annotated[ExtendItem, Field(description = 'a nested json object')]

    class Config:
        title = 'Item2'
        extra = "forbid"  # 不允许额外字段

POST接口

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
@app.post("/post_model")
async def post_model(items: Annotated[Item2, Field(description = 'a nested parameter')]):
    """
    POST请求支持参数的嵌套
    curl -X POST "http://127.0.0.1:18081/post_model" \
     -H "Content-Type: application/json" \
     -d '{
            "name": "Boc",
            "description": "test_desc",
            "price": 1.23,
            "tax": 123,
            "tags": [
                "tag_1",
                "tag_2"
            ],
            "gender": "male",
            "flags": "test1",
            "extend": {
                "a": "a",
                "b": 1,
                "c": 0.1,
                "d": true
            }
         }'
    """
    print(items)
    return {
        "method": "POST",
        "message": items
    }
POST 请求参数
POST 请求参数

POST请求与路径参数、查询参数的混合

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
@app.post("/post_model2/{item_id}")
async def post_model2(items: Annotated[Item2, Field(description = 'a nested parameter')],
                      q: Annotated[str, Query(description = '查询参数')],
                      item_id: Annotated[int, Path(description = '路径参数')]):
    """
    POST请求与路径参数、查询参数的嵌套
    curl -X 'POST' \
     'http://127.0.0.1:18081/post_model2/1234?q=aaaaaaa' \
     -H 'accept: application/json' \
     -H 'Content-Type: application/json' \
     -d '{
     "name": "Bob",
     "description": "string",
     "price": 0,
     "tax": 0,
     "tags": [],
     "gender": "male",
     "flags": "test1",
     "extend": {
       "a": "",
       "b": 0,
       "c": 0.1,
       "d": false,
       "additionalProp1": {}
     }
   }'
    """
    print(items)
    return {
        "method": "POST",
        "message": items,
        'query': q,
        'path_item_id': item_id
    }
POST 参数、路径参数、查询参数混合使用
POST 参数、路径参数、查询参数混合使用

多个Body参数混用

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


class User(BaseModel):
    username: str
    full_name: str | None = None

@app.post("/items/{item_id}")
async def post_item(item_id: int, item: Item, user: User):
    """
        curl -X 'POST' \
          'http://127.0.0.1:18081/items/123' \
          -H 'accept: application/json' \
          -H 'Content-Type: application/json' \
          -d '{
          "item": {
            "name": "aaaa",
            "description": "aaaaa",
            "price": 0,
            "tax": 0
          },
          "user": {
            "username": "bbbb",
            "full_name": "cccc"
          }
        }'
    """
    results = {"item_id": item_id, "item": item, "user": user}
    return results

if __name__ == '__main__':
    uvicorn.run(app, host = '127.0.0.1', port = 18081)
多个 body 参数的请求
多个 body 参数的请求
响应
响应

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FastAPI官方教程太棒了(下)
status_code也可以是IntEnum,比如Python的http.HTTPStatus。
dongfanger
2022/11/21
2.7K0
FastAPI官方教程太棒了(下)
FastAPI官方教程太棒了(上)
在2020年的Python开发者调查结果中,有这样一段话:“FastAPI在此次调查迭代中首次被引为选项,表现为Python第三流行的Web框架。”
dongfanger
2022/06/30
4.3K0
FastAPI官方教程太棒了(上)
FastAPI(19)- Response Model 响应模型
Optional[Union[SetIntStr, DictIntStrAny]]
小菠萝测试笔记
2021/09/27
1.4K0
FastAPI后台开发基础(6):Body 参数的几种用法
密码学人CipherHUB
2024/10/12
2922
FastAPI后台开发基础(6):Body 参数的几种用法
FastAPI后台开发基础(14): 路径装饰器
密码学人CipherHUB
2024/11/15
1440
FastAPI后台开发基础(14): 路径装饰器
FastAPI 构建 API 高性能的 web 框架(二)
参考:https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/
悟乙己
2023/08/10
5300
FastAPI学习-7.POST请求body-多个参数
前言 既然我们已经知道了如何使用 Path 和 Query,下面让我们来了解一下请求体声明的更高级用法。 混合使用 Path、Query 和请求体参数 你可以随意地混合使用 Path、Query 和请求体参数声明,FastAPI 会知道该如何处理。 还可以通过将默认值设置为 None 来将请求体参数声明为可选参数: from typing import Optional from fastapi import FastAPI, Path from pydantic import BaseModel ap
上海-悠悠
2022/03/08
2.3K0
FastAPI--参数提交Request Body(3)
一般对于Request Body不会通过get提交,对于get提交的参数一般称为是查询参数。所以,如果是通过POTS,PUT等方式提交的参数信息,我们一般是放到Request Body来提交到我们的后端。
py3study
2020/06/23
2.8K0
FastAPI学习-9. Swagger文档输出请求示例example
前言 可以在 Swagger文档上看到请求示例example,使用Pydantic schema_extra属性来实现。 schema_extra 使用 Config 和 schema_extra 为Pydantic模型声明一个示例,如Pydantic 文档:定制 Schema 中所述: from typing import Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class
上海-悠悠
2022/03/08
4.5K0
【FastAPI】请求体
在 FastAPI 中,请求体(Request Body)是通过请求发送的数据,通常用于传递客户端提交的信息。FastAPI 使得处理请求体变得非常容易。
云帆沧海
2024/01/17
2090
【FastAPI】请求体
FastAPI学习-6.POST请求 JSON 格式 body
前言 post请求接收json格式请求body 创建数据模型 从 pydantic 中导入 BaseModel, 将你的数据模型声明为继承自 BaseModel 的类。 from typing import Optional from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: Optional[str] = None pri
上海-悠悠
2022/03/08
11.3K0
fastapi PUT更新数据 / PATCH部分更新
learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/
Michael阿明
2022/01/07
1.5K0
fastapi PUT更新数据 / PATCH部分更新
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
FastAPI 提供的 Query、Path等其他公共 Param 类和 Body 类,都是 Pydantic 的 FieldInfo 类的子类
小菠萝测试笔记
2021/09/27
3.2K0
FastAPI(10)- 详解 Body
当函数只有一个参数指定了 Pydantic Model 且没有其他 Body 参数时,传参的时候请求体可以不指定参数名
小菠萝测试笔记
2021/09/27
2.8K0
fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型
learn from https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/
Michael阿明
2022/01/07
2K0
fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型
FastAPI后台开发基础(13): 异常处理 Exception
通过raise HTTPException抛出一个异常,这个异常不仅设置了HTTP状态码为404,表示“未找到”,还详细描述了错误信息“Item not found”。此外,我们还在响应头中设置了自定义的my-header和Content-Type,后者指定了响应内容的类型和字符集。
密码学人CipherHUB
2024/11/01
2550
FastAPI后台开发基础(13): 异常处理 Exception
FastAPI(8)- 请求体 Request Body
选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示
小菠萝测试笔记
2021/09/27
4.2K0
FastAPI学习-8.POST请求body中添加Field
前言 与使用 Query、Path 和 Body 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。 Field 字段参数说明 关于 Field 字段参数说明 Field(None) 是可选字段,不传的时候值默认为None Field(…) 是设置必填项字段 title 自定义标题,如果没有默认就是字段属性的值 description 定义字段描述内容 from pydantic import BaseModel,
上海-悠悠
2022/03/08
1.1K0
FastAPI后台开发基础(4):FastAPI 官网文档错误、编码错误以及注意要点记录
使用 Query(xxxx) = ...的写法均会引起错误,此种写法来源于 FastAPI 官网的文档:
密码学人CipherHUB
2024/10/10
7244
FastAPI后台开发基础(4):FastAPI 官网文档错误、编码错误以及注意要点记录
FastAPI后台开发基础(7):常见字段类型
在 FastAPI 中,使用 Pydantic 模型来定义和验证数据是一种常见的做法。
密码学人CipherHUB
2024/10/12
1850
FastAPI后台开发基础(7):常见字段类型
推荐阅读
相关推荐
FastAPI官方教程太棒了(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验