• FastAPI(7)- 详解 Path


    前言

    Path

    可以为路径参数添加额外的校验和元数据,跟 Query 的参数是一毛一样的

    元数据

    Path 也可以添加元数据相关信息,这些信息将包含在生成的 OpenAPI 中,并由文档用户界面和外部工具使用

    四种元数据参数 

    # 别名
    alias: Optional[str] = None
    
    # 标题
    title: Optional[str] = None
    
    # 描述
    description: Optional[str] = None
    
    # 是否弃用
    deprecated: Optional[bool] = None

    实际代码

    from fastapi import FastAPI, Path
    from typing import Optional
    import uvicorn
    
    app = FastAPI()
    
    
    # 元数据
    @app.get("/items/{item_id}")
    async def read_items(
            item_id: Optional[str] = Path(
                default=...,
                min_length=2,
                max_length=50,
                regex="^菠萝$",
                title="标题",
                description="很长很长的描述",
                deprecated=True,
            )
    ):
        return {"item_id": item_id}

    校验成功的请求结果

    校验失败的请求结果

    查看 Swagger API 文档

    重点

    • 路径参数始终是必需的,因为它必须是路径的一部分
    • 所以,Path 的 default 参数值必须设为 ... 

    元数据不应该使用 alias

    因为路径参数并不能通过 参数名=value 的形式来传值,所以没有办法通过 alias = value 的方式给别名传值,最终将会报错

    @app.get("/alias/{item_id}")
    async def read_items(
            item_id: Optional[str] = Path(
                default=...,
                alias="item_alias"
            )
    ):
        return {"item_id": item_id}

    请求结果

    查看 Swagger API 文档,并运行

    直接在 Swagger API 文档上尝试运行也会报错,所以路径参数不要用别名哦!

    函数参数排序问题

    Python 会将 item_id: int = Path(...) 识别为默认参数,而 q: str 是位置参数,而位置参数不能在默认参数后面,所以爆红了

    解决方案

    在 Python 3.8 新除了仅限关键字参数:https://www.cnblogs.com/poloyy/p/15106522.html

    @app.get("/item/{item_id}")
    async def read_items(
            *,
            item_id: int = Path(...),
            name: str):
        return {"item_id": item_id, "name": name}

    将 * 作为第一个参数,那么 * 后面的所有参数都会当做关键字参数处理,即使它们没有设置默认值(像 name)

    正常传参的请求结果

    数字类型校验

    Query 和 Path 都可以添加数字校验,Query 文章并没有讲解数字校验,所以这里重点讲下

    数字校验参数

    # 大于
    gt: Optional[float] = None
    
    # 大于等于
    ge: Optional[float] = None
    
    # 小于
    lt: Optional[float] = None
    
    # 小于等于
    le: Optional[float] = None

    实际代码

    @app.get("/number/{item_id}")
    async def read_items(
            *,
            item_id: int = Path(..., title="The IDsss", gt=10, le=20),
            name: str = None):
        return {"item_id": item_id, "name": name}

    校验成功的请求结果

    校验失败的请求结果

    Query 和 Path 综合使用

    @app.get("/path_query/{item_id}")
    async def read_items(
            *,
            item_id: int = Path(..., description="path", ge=1, lt=5, example=1),
            name: str,
            age: float = Query(..., description="query", gt=0.0, le=10)):
        return {"item_id": item_id, "age": age, "name": name}

    正确传参的请求结果

    注意

    数字校验也可以适用于 float 类型的值

    查看 Swagger API 文档

    这里的 item_id 还加了个 example 参数,就是个示例值,所以在接口文档中会显示 Example

    总结

    • Query、Path 和后面会讲到的 Form、Cookie...等等,都是公共 Param 类的子类,但实际开发中并不会直接使用 Param 类
    • 所有这些子类都共享相同的额外校验参数和元数据

    Query 类

    Path 类

    Param 类

  • 相关阅读:
    grafana邮箱配置
    grafana集群配置
    CentOS7 配置OOM监控报警
    Mycat使用配置实践
    CentOS7安装JAVA环境
    CentOS7安装MYCAT中间件
    CentOS7安装MySQL5.6
    Mockingbird
    堆的建立与功能实现
    Matlab解决线性规划问题
  • 原文地址:https://www.cnblogs.com/poloyy/p/15308131.html
Copyright © 2020-2023  润新知