FastAPI在定义处理请求的函数时,那些不属于动态路由里路径参数的其他函数参数,将被自动解析为query 部分的请求参数,解释有一点绕,通过实际例子来说明
from fastapi import FastAPI
from enum import Enum
app = FastAPI()
class BookType(str, Enum):
Novel = 'novel' # 小说
Economics = 'Economics' # 经济类
@app.get('/books/{book_type}')
def book_info(book_type: BookType, page: int = 0, limit: int = 10):
return {'msg': f'返回{book_type} 类型图书, 第{page}页, 每页{limit}条数据'}
函数book_info 里book_type 参数是和路径参数里的book_type相对应的,对它的类型标注是BookType,是一个枚举类,如果传入的图书类型不在枚举范围内,FastAPI会自动报错。
page与limit 都没有出现在路径参数里,因此他们会被自动的解析成query部分的查询参数,启动服务后,在浏览器里访问http://127.0.0.1:8000/books/novel?page=3&limit=10 ,得到的响应结果是
{"msg":"返回novel 类型图书, 第3页, 每页10条数据"}
如果在请求时没有传page和limit参数,则根据定义取默认值0。
定义查询参数时,如果定义其默认值,那么参数就是可选的,发送请求时可以不携带该参数,反之没有定义默认值,就必须在请求中携带参数,不然FastAPI会报错,将代码修改成如下的样子
@app.get('/books/{book_type}')
def user_info(book_type: BookType, page: int, limit: int):
return {'msg': f'返回{book_type} 类型图书, 第{page}页, 每页{limit}条数据'}
在浏览器里请求http://127.0.0.1:8000/books/novel, 请求中没有携带page和limit查询参数,得到的响应结果如下
{
"detail": [
{
"loc": [
"query",
"page"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"query",
"limit"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
QQ交流群: 211426309