FastAPI(16)- 额外的数据类型

常见的数据类型

  • 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 文档

 

posted @ 2021-09-25 10:07  小菠萝测试笔记  阅读(293)  评论(0编辑  收藏  举报