安裝 FastAPI
pip install fastapi # 將來需要將應用程式部署到生產環境可以安裝 uvicorn 作為伺服器 pip install uvicorn
最簡單的程式碼栗子
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"}
執行 uvicorn 命令,啟動伺服器
進到 py 檔案所屬目錄的命令列
uvicorn main:app --reload
- main:main.py 檔案(一個 Python「模組」)
- app:在 main.py 檔案中通過 app = FastAPI() 建立的物件
- --reload:讓伺服器在更新程式碼後自動重新啟動,僅在開發時使用該選項
我這裡截圖的名字換了哈
瀏覽器訪問
http://127.0.0.1:8000
檢視互動式 API 文件
http://127.0.0.1:8000/docs
檢視可選的 API 文件
http://127.0.0.1:8000/redoc
OpenAPI
FastAPi 使用 API 的 OpenAPI 標準為所有 API 生成 schema
schema
- 是對事物的一種定義或描述
- 它並非具體的實現程式碼,而只是抽象的描述
- 後面會詳說
API Schema
- OpenAPI 是一種規定如何定義 API Schema 的規範
- 定義的 OpenAPI Schema 將包括 API 路徑,以及它們可能使用的引數等等
- 比如:這個 API 的作用是什麼,需要必傳哪些引數,請求方法是什麼
Data Schema
- 指的是某些資料比如 JSON 的結構
- 它可以表示 JSON 的屬性及其具有的資料型別
- 比如:某個屬性的資料型別是什麼,有沒有預設值,是不是必填,作用是什麼
JSON Schema
- OpenAPI 會為 API 定義 API Schema,一般會包括 API 傳送和接收的資料的定義,比如:傳送的資料的型別、是否必填
- 這些定義會以 JSON資料格式展示出來,所以都會稱為 JSON Schema
檢視 openapi.json
原始的 OpenAPI Schema,其實它只是一個自動生成的包含了所有 API 描述的 JSON 資料結構
http://127.0.0.1:8000/openapi.json
拆分程式碼詳解
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"}
將上面最簡單的栗子程式碼進行拆開詳解
第一步:匯入 FastAPI
from fastapi import FastAPI
- FastAPI 是一個為 API 提供了所有功能的 Python 類,必寫就對了
- FastAPI 是直接從 Starlette 繼承的類,可以通過 FastAPI 使用所有的 Starlette 的功能
第二步:建立一個 FastAPI 例項
app = FastAPI()
- app 就是 FastAPI 類的一個例項物件啦
- 重點:app 將是建立所有 API 的主要互動物件
- 要點:uvicorn 執行命令時也會用到 app
uvicorn main:app --reload
app 變數名換一下呢?
from fastapi import FastAPI my_awesome_api = FastAPI() @my_awesome_api.get("/") async def root(): return {"message": "Hello World"}
那麼用 uvicorn 執行命令時也需要換
uvicorn main:my_awesome_api --reload
第三步:建立一個路徑操作
路徑
- 指的是 URL 中從第一個
/
起的後半部分,即常說的 path - 比如:https://example.com/items/foo 的路徑就是/items/foo
- 路徑也稱為:端點、路由
操作
就是 HTTP 請求方法
-
POST
-
GET
-
PUT
-
DELETE
-
OPTIONS
-
HEAD
-
PATCH
- TRACE
在 HTTP 協議中,可以使用以上的其中一種(或多種)「方法」與每個路徑進行通訊
遵守 RESTFul 風格的話
通常使用:
- POST:建立資料
- GET:讀取資料
- PUT:更新資料
- DELETE:刪除資料
定義一個路徑操作裝飾器
@app.get("/")
有兩點含義
- 請求路徑為 /
- 使用 get 請求
其他請求方法的裝飾器
- @app.post()
- @app.put()
- @app.delete()
- @app.options()
- @app.head()
- @app.patch()
- @app.trace()
第四步:定義路徑操作函式
async def root():
- 這就是一個普通的 Python 函式
- 每當 FastAPI 接收一個使用
GET
方法訪問路徑為 / 的請求時這個函式會被呼叫 - 在這個例子中,它是一個 async 函式(非同步處理函式,後面會細說)
# 也可以不加 async,就是個常規函式 def root():
第五步:函式返回內容
return {"message": "Hello World"}
- 可以返回一個 dict、list,也可以是 str、int 單個值
- 還可以返回 Pydantic 模型(後面詳解)
- 還可以是其他會自動轉換為 JSON 的物件和模型(包括 ORM 物件等)
FastAPI 入門總結
編寫一個最簡單的 FastAPI 應用程式五部曲
- 匯入 FastAPI
- 建立一個 app 例項
- 編寫一個路徑操作裝飾器,如 @app.get("/")
- 編寫一個路徑操作函式,如 def root(): ...
- 執行開發伺服器,如 uvicorn main:app --reload