Query Parameters
当声明的函数参数不是路径参数的一部分时,它们会被自动的解释为查询参数(可以直观的理解为 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]
在上述例子中,如果访问 http://127.0.0.1:8000/items/?skip=0&limit=10
,则查询参数为:
- skip:值为 0
- limit:值为 10
查询参数作为 URL 的一部分,默认是字符串类型,如果被声明为其他的 python 类型,例如在上面的例子中被声明为 int
,则会被自动转化成整数类型并进行类型检查
适用于路径参数的过程同样适用于查询参数:
- 编辑器支持
- 数据解析
- 数据验证
- 自动文档
Defaults
由于查询参数不是路径中固定的一部分,因此它们是可选的,并且可以有默认值
在上述例子中,访问 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
Optional parameters
同样的,可以通过将默认值指定为 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
是可选参数
Query parameter type conversion
同样可以声明 bool
类型,它们也会被自动转换
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
item = {"item_id": item_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
在这个例子中,访问如下网址及其大小写变体,都有 short=True
成立,相反的意思 则为 False
http://127.0.0.1:8000/items/foo?short=1
http://127.0.0.1:8000/items/foo?short=True
http://127.0.0.1:8000/items/foo?short=true
http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
注:相反的意思指的是单词的意思相反,如 0-1,true-false 等,访问其他不可解析的路径时会报错
Multiple path and query parameters
可以同时声明多个路径参数和查询参数,FastAPI 知道如何进行选择
由于 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
Required query parameters
当声明的非路径参数(目前只介绍了查询参数)有默认值时,它不是必须的
如果只想设置可选参数而不指定特定值,则可以设置默认值为 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
是类型为 str
的必须查询参数
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
在上面的例子中,查询参数有 3 个:
- needy:类型为
str
的必选参数 - skip:类型为
int
的可选参数,默认值为 0 - limit:类型为
int
的可选参数
注:可以同上一节一样使用枚举变量
Optional type declarations
注:高级用法
在 mypy
中,如果使用:
limit: int = None
可能会出现错误:
Incompatible types in assignment (expression has type "None", variable has type "int")
可以通过 Optional
告知 mypy
值可以为 None
,例如:
from typing import Optional
limit: Optional[int] = None
在路径声明中,可以这样写
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, limit: Optional[int] = None):
item = {"item_id": item_id, "limit": limit}
return item