Route路由, 是一種對映關係!路由是把客戶端請求的url路徑與檢視函式進行繫結對映的一種關係。
• 路徑 :是 /
• 請求方法:是 get
• 函式 :是位於「裝飾器」下方的函式(位於 @app.get("/") 下方)
# 路徑操作裝飾器引數 # tags 文件標題
1 from fastapi import FastAPI 2 import uvicorn 3 from apps.app01.urls import shop 4 from apps.app02.urls import user 5 app = FastAPI() 6 1 7 2 8 3 9 4 10 5 11 6 12 # 路由分發include_router 13 app.include_router(shop, prefix="/shop", tags=["購物中心介面"]) 14 app.include_router(user, prefix="/user", tags=["使用者中心介面"])
# summary 文件總結 # description 文件描述 # response_description 響應詳情內容 # deprecated 介面文件是否廢棄 @app.post("/items", tags=["這是items測試介面"], summary="this is items測試 summary", description="this is items測試 description...", response_description="this is items測試 response_description", deprecated=False) def test(): return {"items": "items資料"}
1、路由分發
在main.py中的app作為主路由
from fastapi import FastAPI import uvicorn from apps.app01.urls import shop from apps.app02.urls import user app = FastAPI() 1 2 3 4 5 6 # 路由分發include_router app.include_router(shop, prefix="/shop", tags=["購物中心介面"]) app.include_router(user, prefix="/user", tags=["使用者中心介面"])
其他的子路由:
from fastapi import APIRouter shop = APIRouter() @shop.get("/food") def shop_food(): return {"shop": "food"} @shop.get("/bed") def shop_bed(): return {"shop": "bed"}
2、路由引數
請求引數,透過路由路徑攜帶的方式;我們稱之為路由傳參。引數也叫: 路由引數。你可以使用與
Python 格式化字串相同的語法來宣告路徑"引數"或"變數":
@app.get("/items/{item_id}") def read_item(item_id): return {"item_id": item_id}
路徑引數 item_id 的值將作為引數 item_id 傳遞給你的函式。所以,如果你執行示例並訪問
[http://127.0.0.1:8000/items/foo],將會看到如下響應:
{"item_id":"foo"}
1、定義引數的型別
你可以使用標準的 Python 型別標註為函式中的路徑引數宣告型別。
@app.get("/items/{item_id}") def read_item(item_id: int): return {"item_id": item_id}
在這個例子中, item_id 被宣告為 int 型別。FastAPI 透過上面的型別宣告提供了對請求的自
動"解析"。
同時還提供資料校驗功能:
如果你透過瀏覽器訪問 [http://127.0.0.1:8000/items/foo],你會看到一個清晰可讀的 HTTP 錯誤:
{ "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] }
因為路徑引數 item_id 傳入的值為 "foo" ,它不是一個 int 。
你可以使用同樣的型別宣告來宣告 str 、float 、bool 以及許多其他的複合資料型別。
2、路由匹配的順序
由於路由匹配操作是按順序依次執行的,你需要確保路徑 /users/me 宣告在路徑
/users/{user_id} 之前:
@app.get("/users/me") def read_user_me(): return {"user_id": "the current user"} @app.get("/users/{user_id}") def read_user(user_id: str): return {"user_id": user_id}
否則, /users/{user_id} 的路徑還將與 /users/me 相匹配,"認為"自己正在接收一個值為
"me" 的 user_id 引數。
3、預設值引數
如果你有一個接收路徑引數的路徑操作,但你希望預先設定可能的有效引數值,則可以使用標準的
Python Enum 型別。
Python中的列舉資料型別:是指列出有窮集合中的所有元素,即一一列舉的意思。在Python中,列舉
可以視為是一種資料型別,當一個變數的取值只有幾種有限的情況時,我們可以將其宣告為列舉類
型
from enum import Enum from fastapi import FastAPI class ModelName(str, Enum): alexnet = "alexnet" resnet = "resnet" lenet = "lenet" app = FastAPI() @app.get("/models/{model_name}") async def get_model(model_name: ModelName): if model_name is ModelName.alexnet: return {"model_name": model_name, "message": "Deep Learning FTW!"} if model_name.value == "lenet": return {"model_name": model_name, "message": "LeCNN all the images"} return {"model_name": model_name, "message": "Have some residuals"}