查看 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 类