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是可选的。