第5节,FastAPI解析GET请求参数

1. 查询参数

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。

2. 可选与必须参数

定义查询参数时,如果定义其默认值,那么参数就是可选的,发送请求时可以不携带该参数,反之没有定义默认值,就必须在请求中携带参数,不然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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案