FastAPI 基础学习(五) 请求参数

作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

 

一、请求参数

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

如上述,如果函数里的参数不是路径参数的一部分,那么这样的参数就自动被解释为请求参数

 

请求参数就是URL中问号('?')后面以'&'间隔开的键值对,它们是URL的一部分,并且参数类型都是字符串类型。

http://127.0.0.1:8000/items/?skip=0&limit=10

在上面的这个URL中,请求参数分别是:

skip:值是0

limit:值是10

 

FastAPI中所有适用于路径参数的功能也同样适用于请求参数,例如:

  • 编辑器支持
  • 数据自动解析
  • 数据自动校验
  • 自动化文档

二、请求参数缺省值

请求参数在URL路径中并不是固定不变的,它们是可选的,并且也可以有缺省值。

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

在这个例子中,skip和limit都是有缺省值的。因此,下面URL的请求是等同的:

http://127.0.0.1:8000/items/

等同于

http://127.0.0.1:8000/items/?skip=0&limit=10

但如果你访问:

http://127.0.0.1:8000/items/?skip=20

那么实际的请求参数就是:

skip=20
limit=10

三、可选请求参数

我们可以声明请求参数是可选的,只要设置参数的缺省值为None

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

在这个例子中,参数q就是可选的,缺省为None。

同时在这个例子中,我们可以注意到,FastAPI可以非常智能的识别参数种类,这里参数item_id是一个路径参数,而参数q是一个请求参数。

四、多路径参数、多请求参数

你可以同时声明多个路径参数、多个请求参数,并且不用考虑声明顺序。FastAPI可以准确无误的识别参数类型。

from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
    user_id: int, item_id: str, q: str = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

五、必选请求参数

如果一个请求参数没有被设置任何缺省值(包括None),那么它就是必选的。

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item

如果我们没有携带请求参数needy,而是直接访问:

http://127.0.0.1:8000/items/foo-item

那么我们就会看到如下的错误信息:

{
    "detail": [
        {
            "loc": [
                "query",
                "needy"
            ],
            "msg": "field required",
            "type": "value_error.missing"
        }
    ]
}

 

当然了,我们也可以声明有的参数是必选的,有的参数是有缺省值的,而有的参数是完全可选的。

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str, skip: int = 0, limit: int = None):
    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
    return item

在这个例子中的请求参数中,needy是必选的,skip是有缺省值的,而limit是可选的。

 

posted on 2020-05-16 15:22  麦克煎蛋  阅读(6390)  评论(1编辑  收藏  举报