zoukankan      html  css  js  c++  java
  • 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 文档

  • 相关阅读:
    字集码(字符编码)
    图片轮播(可实现手动与自动的切换)
    Eclipse常用快捷键
    Java并发编程:Callable、Future和FutureTask
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
    java注解
    JVM加载class原理
    阿里中间件技术及双十一实践--软负载——分布式系统的引路人
    阿里中间件技术及双十一实践--中间件总体介绍
    Java的LockSupport.park()实现分析
  • 原文地址:https://www.cnblogs.com/poloyy/p/15316562.html
Copyright © 2011-2022 走看看