1. 什么是查询参数
在路径参数中提到了,url中用斜杠分隔开的参数是路径参数。
那么什么是查询参数呢?就是 '?xxx=xxx' 这样问号开头一个变量等于某个值的参数,称为查询参数。
比如我在写这篇文章时的url如下图所示,那么这里的'/mp_blog/creation/editor'就是查询参数, '?spm=12467984654' (随便打的数字) 就是路径参数。
声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数
查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,并以 & 符号分隔。
2. 如何使用查询参数
ok,知道路径参数是什么了。下面介绍一下路径参数的几种使用方式。分别是
- 默认查询参数
- 必须查询参数
- 可选查询参数
- 多个路径和查询参数
默认查询参数
import uvicorn
from fastapi import FastAPI
import asyncio
app = FastAPI()
fake_items_db = [{"item_name":"Foo"}, {"item_name": "Bar"}, {"item_name": "NiuBee"}, {"item_name": "NiuBee"}, {"item_name": "NiuBee"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10): # 默认 skip=0, limit=10
return fake_items_db[skip : skip + limit] # 参数若为默认值, 返回list从0 到 10范围的元素
if __name__ == '__main__':
config = uvicorn.Config(app, host='127.0.0.1', port=8000)
server = uvicorn.Server(config)
asyncio.run(server.serve())
必须查询参数
必须查询参数指在参数列表中不写默认值。如果希望这个参数是可选的,默认值设为None
import uvicorn
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
浏览器输入 http://127.0.0.1:8000/items/4?needy=yes, 返回 {"item_id":"4","needy":"yes"}
可选查询参数
默认值为None的参数
import uvicorn
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[str, None] = None): # q的str与None占同一个空间
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
浏览器输入 http://127.0.0.1:8000/items/4
会看到 {"item_id":"4"}
输入 http://127.0.0.1:8000/items/4?q=hello
会看到 {"item_id":"4","q":"hello"}
多个路径和查询参数
参数列表中可以有多个路径参数和查询参数,并且不用关注他们的顺序,FastAPI能够通过名称识别他们。
import uvicorn
from typing import Union
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: Union[str, None] = 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
浏览器输入 http://127.0.0.1:8000/users/3/items/4?q=foo&short=yes
会看到 {"item_id":"4","owner_id":3,"q":"foo"}
浏览器输入 http://127.0.0.1:8000/users/3/items/4?q=foo
会看到 {"item_id":"4","owner_id":3,"q":"foo","description":"This is an amazing item that has a long description"}