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)