ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FastAPI(7)- get 请求 - 详解 Path

2021-09-18 12:05:37  阅读:317  来源: 互联网

标签:get FastAPI 校验 item 参数 Path Optional id


前言

 

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 类

 

标签:get,FastAPI,校验,item,参数,Path,Optional,id
来源: https://www.cnblogs.com/poloyy/p/15308131.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有