常见的数据类型
- int
- float
- str
- bool
但 FastAPI 支持使用更复杂的数据类型
仍然能得到 FastAPI 的支持
- IDE 智能提示
- 请求数据的数据类型转换
- 响应数据的数据类型转换
- 数据验证
- 自动注释和文档
复杂的数据类型
UUID
- 常见的唯一标识符
- str 类型
datetime.datetime
- Python 的 datetime.datetime
- str 类型
- 栗子:2008-09-15T15:53:00+05:00
datetime.date
- Python 的 datetime.date
- str 类型
- 栗子:2008-09-15
datetime.time
- Python 的 datetime.time
- str 类型
- 栗子:15:53:00.003
datetime.timedelta
- Python 的 datetime.timedelta
- float 类型
- 表示秒数
frozenset
- set 类型
- 在请求中,将读取一个列表,消除重复项并将其转换为一个集合
- 在响应中,集合将被转换为列表
- 会在 Schema 中加一个标识 uniqueItems,表示 set 里面的值是唯一的
bytes
- Python 标准类型 bytes
- str 类型
- 生成 Schema 会指定它为一个带有二进制格式的 str
Decimal
- Python 标准类型十进制
- float 类型
重点
- FastAPI 不只是有以上的复杂数据类型,更多的数据类型可以看 Pydantic Types
- 只要 Pydantic 有的,FastAPI 都支持
复杂数据类型的栗子
#!usr/bin/env python # -*- coding:utf-8 _*- """ # author: 小菠萝测试笔记 # blog: https://www.cnblogs.com/poloyy/ # time: 2021/9/21 1:58 下午 # file: 14_extra.py """ import uuid from datetime import datetime, time, timedelta from decimal import Decimal from typing import Optional from uuid import UUID import uvicorn from fastapi import Body, FastAPI app = FastAPI() @app.put("/items/{item_id}") async def read_items( item_id: UUID, start_datetime: Optional[datetime] = Body(None), end_datetime: Optional[datetime] = Body(None), repeat_at: Optional[time] = Body(None), process_after: Optional[timedelta] = Body(None), address: Optional[frozenset] = Body(None), computer: Optional[bytes] = Body(None), age: Optional[Decimal] = Body(None), ): start_process = start_datetime + process_after duration = end_datetime - start_process return { "item_id": item_id, "start_datetime": start_datetime, "end_datetime": end_datetime, "repeat_at": repeat_at, "process_after": process_after, "start_process": start_process, "duration": duration, "address": address, "computer": computer, "age": age, } if __name__ == "__main__": print(uuid.uuid1()) uvicorn.run(app="14_extra:app", host="127.0.0.1", port=8080, reload=True, debug=True)
正确传参的请求结果
校验错误的请求结果
查看 Swagger API 文档