FastAPI中請求URL傳參

yongheng999發表於2024-06-26

1、URL傳參
url請求引數是透過url請求地址攜帶的,例如,在以下 url 中:

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

這些請求引數是鍵值對的集合,這些鍵值對位於 URL 的 ? 之後,並以 & 符號分隔。
請求引數為:
• skip :對應的值為 0
• limit :對應的值為 10
當你為它們宣告瞭 Python 型別(在上面的示例中為 int )時,它們將轉換為該型別並針對該型別進
行校驗。

from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]

URL請求引數不是路徑的固定部分,因此它們可以是可選的,並且可以有預設值。
在上面的示例中,它們具有 skip=0 和 limit=10 的預設值。你可以將它們的預設值設定為
None 。

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, short: bool = Fals
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

Union型別是一種用於表示一個變數可以是多個不同型別之一的型別註解。它是typing模組中的一個
類,可以與其他型別一起使用,以指定一個變數可以接受的多個型別。
Union型別的語法為:Union[type1, type2, ...]
這裡的type1、type2等代表要包含在Union型別中的型別。
注意:當你想讓一個查詢引數成為必需的,不宣告任何預設值就可以:

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

在這個例子中,有3個查詢引數:

• needy ,一個必需的 str 型別引數。

• skip ,一個預設值為 0 的 int 型別引數,也是可選的。

• limit ,一個可選的 int 型別引數。

2、一個引數名,多個值

我們還可以使用 Query 去接收一組值。使用 List[str] 來接收一組值,裡面的str可以根據需求隨意調

換。

@app.get("/test5/")
async def read_items(q: Union[List[str], None] = None):
query_items = {"q": q}
return query_items

這是因為引數 q中以一個 Python list 的形式接收到查詢引數 q 的多個值。

3、引數校驗

Query是 FastAPI專門用來裝飾URL請求引數的類,也可以提供校驗。

1)預設值設定,和引數介面描述

@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, description="引數q
query_items = {"q": q}
return query_items

description是 Query中的一個欄位,用來描述該引數;

2)字串長度校驗

@app.get("/items2/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50, mi
query_items = {"q": q}
return query_items

注意:max_length和 min_length僅可用於 str 型別的引數。

3)正規表示式校驗

@app.get("/items3/")
async def read_items(
q: Union[str, None] = Query(default=None, regex="^laoxiao$")
):
query_items = {"q": q}
return query_items

也就是說該介面的查詢引數只能是" laoxiao",不然就會報錯,當然其他的正規表示式都是可以拿來用

的!

4)數值大小校驗

如果引數的型別是int,float就可以採用Query進行大小校驗,或者範圍校驗。

@app.get("/test4/")
async def read_items4(id: int = Query(description="id引數必須是0到1000之間", gt=0,
results = {"item_id": id}
if q:
results.update({"q": q})
return results

• gt:大於(greater than)

• ge:大於等於(greater than or equal)

• lt:小於(less than)

• le:小於等於(less than or equal)

相關文章