FastAPI开发文档教程-额外数据类型

admin 2026-01-10 10:52:22 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 额外数据类型
    • 其他数据类型
    • 例子
    1. FastAPI
    2. 学习
    3. 教程 - 用户指南

    额外数据类型

    到目前为止,您一直在使用常见的数据类型,如:

    • int
    • float
    • str
    • bool

    但是您也可以使用更复杂的数据类型。

    您仍然会拥有现在已经看到的相同的特性:

    • 很棒的编辑器支持。
    • 传入请求的数据转换。
    • 响应数据转换。
    • 数据验证。
    • 自动补全和文档。

    其他数据类型

    下面是一些你可以使用的其他数据类型:

    • UUID:
      • 一种标准的 “通用唯一标识符” ,在许多数据库和系统中用作ID。
      • 在请求和响应中将以 str 表示。
    • datetime.datetime:
      • 一个 Python datetime.datetime.
      • 在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15T15:53:00+05:00.
    • datetime.date:
      • Python datetime.date.
      • 在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15.
    • datetime.time:
      • 一个 Python datetime.time.
      • 在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 14:23:55.003.
    • datetime.timedelta:
      • 一个 Python datetime.timedelta.
      • 在请求和响应中将表示为 float 代表总秒数。
      • Pydantic 也允许将其表示为 “ISO 8601 时间差异编码”, 查看文档了解更多信息。
    • frozenset:
      • 在请求和响应中,作为 set 对待:
        • 在请求中,列表将被读取,消除重复,并将其转换为一个 set
        • 在响应中 set 将被转换为 list
        • 产生的模式将指定那些 set 的值是唯一的 (使用 JSON 模式的 uniqueItems)。
    • bytes:
      • 标准的 Python bytes
      • 在请求和响应中被当作 str 处理。
      • 生成的模式将指定这个 strbinary “格式”。
    • Decimal:
      • 标准的 Python Decimal
      • 在请求和响应中被当做 float 一样处理。
    • 您可以在这里检查所有有效的pydantic数据类型: Pydantic data types.

    例子

    下面是一个路径操作的示例,其中的参数使用了上面的一些类型。

    Python 3.10+Python 3.9+Python 3.8+Python 3.10+ non-AnnotatedPython 3.8+ non-Annotated

    1. from datetime import datetime, time, timedelta from typing import Annotated
    2. from uuid import UUID
    3. from fastapi import Body, FastAPI
    4. app = FastAPI()
    5. @app.put("/items/{item_id}")
    6. async def read_items(
    7. item_id: UUID, start_datetime: Annotated[datetime, Body()], end_datetime: Annotated[datetime, Body()], process_after: Annotated[timedelta, Body()], repeat_at: Annotated[time | None, Body()] = None, ):
    8. start_process = start_datetime + process_after
    9. duration = end_datetime - start_process
    10. return {
    11. "item_id": item_id,
    12. "start_datetime": start_datetime,
    13. "end_datetime": end_datetime,
    14. "process_after": process_after,
    15. "repeat_at": repeat_at,
    16. "start_process": start_process,
    17. "duration": duration,
    18. }`
    1. from datetime import datetime, time, timedelta from typing import Annotated, Union
    2. from uuid import UUID
    3. from fastapi import Body, FastAPI
    4. app = FastAPI()
    5. @app.put("/items/{item_id}")
    6. async def read_items(
    7. item_id: UUID, start_datetime: Annotated[datetime, Body()], end_datetime: Annotated[datetime, Body()], process_after: Annotated[timedelta, Body()], repeat_at: Annotated[Union[time, None], Body()] = None, ):
    8. start_process = start_datetime + process_after
    9. duration = end_datetime - start_process
    10. return {
    11. "item_id": item_id,
    12. "start_datetime": start_datetime,
    13. "end_datetime": end_datetime,
    14. "process_after": process_after,
    15. "repeat_at": repeat_at,
    16. "start_process": start_process,
    17. "duration": duration,
    18. }`
    1. from datetime import datetime, time, timedelta from typing import Union
    2. from uuid import UUID
    3. from fastapi import Body, FastAPI
    4. from typing_extensions import Annotated
    5. app = FastAPI()
    6. @app.put("/items/{item_id}")
    7. async def read_items(
    8. item_id: UUID, start_datetime: Annotated[datetime, Body()], end_datetime: Annotated[datetime, Body()], process_after: Annotated[timedelta, Body()], repeat_at: Annotated[Union[time, None], Body()] = None, ):
    9. start_process = start_datetime + process_after
    10. duration = end_datetime - start_process
    11. return {
    12. "item_id": item_id,
    13. "start_datetime": start_datetime,
    14. "end_datetime": end_datetime,
    15. "process_after": process_after,
    16. "repeat_at": repeat_at,
    17. "start_process": start_process,
    18. "duration": duration,
    19. }`

    Tip

    尽可能选择使用 Annotated 的版本。

    1. from datetime import datetime, time, timedelta from uuid import UUID
    2. from fastapi import Body, FastAPI
    3. app = FastAPI()
    4. @app.put("/items/{item_id}")
    5. async def read_items(
    6. item_id: UUID, start_datetime: datetime = Body(), end_datetime: datetime = Body(), process_after: timedelta = Body(), repeat_at: time | None = Body(default=None), ):
    7. start_process = start_datetime + process_after
    8. duration = end_datetime - start_process
    9. return {
    10. "item_id": item_id,
    11. "start_datetime": start_datetime,
    12. "end_datetime": end_datetime,
    13. "process_after": process_after,
    14. "repeat_at": repeat_at,
    15. "start_process": start_process,
    16. "duration": duration,
    17. }`

    Tip

    尽可能选择使用 Annotated 的版本。

    1. from datetime import datetime, time, timedelta from typing import Union from uuid import UUID
    2. from fastapi import Body, FastAPI
    3. app = FastAPI()
    4. @app.put("/items/{item_id}")
    5. async def read_items(
    6. item_id: UUID, start_datetime: datetime = Body(), end_datetime: datetime = Body(), process_after: timedelta = Body(), repeat_at: Union[time, None] = Body(default=None), ):
    7. start_process = start_datetime + process_after
    8. duration = end_datetime - start_process
    9. return {
    10. "item_id": item_id,
    11. "start_datetime": start_datetime,
    12. "end_datetime": end_datetime,
    13. "process_after": process_after,
    14. "repeat_at": repeat_at,
    15. "start_process": start_process,
    16. "duration": duration,
    17. }`

    注意,函数内的参数有原生的数据类型,你可以,例如,执行正常的日期操作,如:

    Python 3.10+Python 3.9+Python 3.8+Python 3.10+ non-AnnotatedPython 3.8+ non-Annotated

    1. from datetime import datetime, time, timedelta
    2. from typing import Annotated
    3. from uuid import UUID
    4. from fastapi import Body, FastAPI
    5. app = FastAPI()
    6. @app.put("/items/{item_id}")
    7. async def read_items(
    8. item_id: UUID,
    9. start_datetime: Annotated[datetime, Body()],
    10. end_datetime: Annotated[datetime, Body()],
    11. process_after: Annotated[timedelta, Body()],
    12. repeat_at: Annotated[time | None, Body()] = None,
    13. ):
    14. start_process = start_datetime + process_after duration = end_datetime - start_process return {
    15. "item_id": item_id,
    16. "start_datetime": start_datetime,
    17. "end_datetime": end_datetime,
    18. "process_after": process_after,
    19. "repeat_at": repeat_at,
    20. "start_process": start_process,
    21. "duration": duration,
    22. }`
    FastAPI开发文档教程-额外数据类型 编程

    FastAPI开发文档教程-额外数据类型

    额外数据类型其他数据类型例子 FastAPI学习教程 - 用户指南 额外数据类型到目前为止,您一直在使用常见的数据类型,如:intfloatstrbool 但是您也可以使用更复杂的数据类型。 您仍然会
    FastAPI开发文档教程-请求体-嵌套模型 编程

    FastAPI开发文档教程-请求体-嵌套模型

    List 字段具有子类型的 List 字段从 typing 导入 List声明具有子类型的 ListSet 类型嵌套模型定义子模型将子模型用作类型特殊的类型和校验带有一组子模型的属性深度嵌套模型纯列表
    FastAPI开发文档教程-路径参数和数值校验 编程

    FastAPI开发文档教程-路径参数和数值校验

    导入 Path声明元数据按需对参数排序按需对参数排序的技巧数值校验:大于等于数值校验:大于和小于等于数值校验:浮点数、大于和小于总结与使用 Query 为查询参数声明更多的校验和元数据的方式相同,你也
    评论:0   参与:  0