FastAPI的路由

yongheng999發表於2024-06-26

Route路由, 是一種對映關係!路由是把客戶端請求的url路徑與檢視函式進行繫結對映的一種關係。
• 路徑 :是 /
• 請求方法:是 get
• 函式 :是位於「裝飾器」下方的函式(位於 @app.get("/") 下方)

# 路徑操作裝飾器引數
# tags 文件標題
FastAPI的路由
 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=["使用者中心介面"])
View Code


# 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"}





相關文章