FastAPI 作為新興 Python 網頁框架,藉由非同步處理和型別提示,大幅提升了開發效率和應用程式效能。其與 Uvicorn 伺服器的協同運作,能有效處理大量並發請求,尤其適用於 I/O 密集型應用。自動生成的互動式 API 檔案,簡化了開發流程中的測試和檔案維護工作,更降低了團隊協作的溝通成本。
詳細內容與技術分析
FastAPI 的技術優勢
FastAPI 的設計充分利用了 Python 的現代化功能,如型別提示和非同步處理,使其在效能和開發效率上都具有顯著優勢。
型別提示與資料驗證:FastAPI 使用 Pydantic 進行資料驗證和解析,這不僅提高了資料處理的安全性,也使得開發者能夠更方便地定義和管理資料模型。
非同步處理:透過非同步處理,FastAPI 能夠高效地處理大量並發請求,特別是在涉及 I/O 操作(如資料函式庫查詢或外部 API 呼叫)的應用中,表現出色。
自動 API 檔案生成:FastAPI 能夠根據程式碼自動生成互動式的 API 檔案,這大大簡化了 API 的測試和檔案維護工作。
安裝與設定
在安裝 FastAPI 時,除了核心框架外,還需要安裝 Uvicorn 作為 ASGI 伺服器。Uvicorn 的高效能和對 HTTP/1.1 及 WebSocket 的良好支援,使其成為執行 FastAPI 應用的理想選擇。
隨著 Python 生態系統的不斷進化,FastAPI 有望進一步整合更多現代化技術,如更高效的非同步框架和更強大的資料驗證功能。同時,社群的成長和貢獻也將推動 FastAPI 在更多領域的應用和創新。
綜上所述,FastAPI 以其現代化的設計、卓越的效能和豐富的功能,已成為 Python 網頁開發領域的一款強大工具。無論是構建小型專案還是大型企業級應用,FastAPI 都能提供堅實的技術支援和廣闊的發展空間。
章節重點回顧
- FastAPI 簡介:一個現代化的 Python 網頁框架,利用型別提示和非同步處理提供高效能。
- 核心元件:Starlette 提供基礎網頁功能,Pydantic 負責資料驗證,Uvicorn 提供高效能 ASGI 支援。
- 安裝與設定:使用 PIP 安裝 FastAPI 和 Uvicorn,並瞭解相關組態。
- 範例應用:建立一個簡單的 “Hello World” 應用,演示基本用法。
- 技術優勢:高效的非同步處理、自動 API 檔案生成等。
- 未來發展:持續整合新技術,與社群共同推動創新。
透過本章內容,您應該對 FastAPI 有了全面的瞭解,並能夠開始構建自己的 FastAPI 應用。隨著進一步的學習和實踐,您將能夠充分發揮 FastAPI 的強大功能,構建出高效、安全、可擴充套件的網頁應用。
開始使用 FastAPI
在前一章中,我們已經為探索 FastAPI 網頁框架的強大功能奠定了基礎。我們現在對 FastAPI 中大量實作的型別提示和非同步處理機制有了足夠的瞭解。FastAPI 主要是一個用於開發網頁 API 的工具。因此,前一章也對 REST 架構的原理進行了簡要的討論。
本章將幫助您邁出建立 API 的第一步。我們還將學習 API 檔案和引數。
我們將討論以下主題:
- Hello World
- 互動式 API 檔案
- 路徑引數
- 查詢引數
- 引數驗證
Hello World
在前一章的結尾,您看到了一個小的 FastAPI 指令碼,它在瀏覽器中呈現 Hello World 訊息。讓我們重新審視那個指令碼,並詳細瞭解它是如何工作的。
傳統上,每當您學習一種新的程式語言或框架時,第一個編寫的程式就是顯示“Hello World”訊息的程式。目的是驗證相應的環境是否正確安裝。它還有助於理解應用程式的基本構建塊。
建立應用程式物件
首先,我們需要一個 ASGI 可呼叫物件來由伺服器執行。FastAPI 函式庫本身以 FastAPI 類別的物件形式提供可呼叫物件。因此,使用以下陳述式例項化物件(main.py 中的前兩行,請參閱清單 1-15):
from fastapi import FastAPI
app = FastAPI()
這個 app 物件是 ASGI 伺服器和客戶端之間的主要互動點,因為它負責將所有傳入請求路由到適當的處理程式並提供適當的回應。
路徑操作裝飾器
在傳統的網頁應用程式中,客戶端瀏覽器請求的 URL 指的是儲存在網頁伺服器上的伺服器端指令碼檔案。例如,看看 URL http://mysite.com/hello.php
,其中伺服器執行指令碼檔案並將其輸出作為對客戶端的回應。有時,一個或多個引數可能會作為查詢字串附加到 URL,並打算由指令碼處理 - 例如 http://mysite.com/hello.php?name=Rahul&marks=65
。
現代網頁應用程式框架使用根據路由的方法來形成 URL,而不是根據檔案的 URL。這對使用者來說更方便,也更容易。應用程式物件將預定義的 URL 模式對映到某個函式,其傳回值又成為伺服器的回應。
前面顯示的 URL 的根據路由的版本變為 http://mysite.com/Rahul/65
。URL 有三個不同的部分:協定(例如 http:// 或 https://),後面跟著 IP 位址或主機名。主機名後面的第一個 / 之後的 URL 剩餘部分稱為路徑或端點。
在前一章中,為了獲得 Hello World 訊息作為結果,我們使用了 http://localhost:8000/
作為 URL。由於第一個 / 之後沒有任何內容,因此它成為路徑或端點。
伺服器還需要知道客戶端用來傳送請求的 HTTP 方法(GET、POST、PUT 或 DELETE)。在 FastAPI 中,根據 OpenAPI 標準,這些方法稱為操作。因此,GET 操作檢索資源,POST 操作建立新資源,PUT 和 DELETE 操作分別修改和刪除資源。
FastAPI 類別定義了對應於前面提到的 HTTP 操作的路徑操作方法。它們是 @app.get()
、 @app.post()
、 @app.put()
和 @app.delete()
。這些方法需要一個強制性的路徑引數 - 例如 @app.get("/")
。@ 符號被字首以指示它們是裝飾器。
Python 中的函式可以接受另一個函式作為引數,就像它可以具有其他資料型別 - int、str、list 或另一個類別的物件一樣。同樣,在一個函式的定義內部,可以包裝另一個函式的定義。此外,函式的傳回值也可以是一個函式。
裝飾器接收另一個函式作為其引數,並透過對其行為進行某些修改來傳回它。
路徑操作函式
我們的 main.py 程式碼中的接下來三行如清單 2-1 所示。
@app.get("/")
async def index():
return {"message": "Hello World"}
內容解密:
此程式碼段的作用是每當應用程式物件發現客戶端使用 GET 請求請求了「/」路徑時,就應該呼叫下面定義的 index() 函式。換句話說,URL 路徑「/」被對映到 index() 函式,稱為路徑操作函式。它通常傳回一個 dict 物件。其 JSON 形式作為對客戶端的回應傳回。
Hello World 應用程式碼在此處複製以方便參考(清單 2-2)。
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return {"message": "Hello World"}
啟動 Uvicorn
如前所述,在本文中,我們將使用 Uvicorn 伺服器來執行 FastAPI 應用程式。它是 Python 的 ASGI 實作。
您可以透過使用 Uvicorn 函式庫的命令列介面或透過呼叫其 run() 函式以程式設計方式啟動 Uvicorn 伺服器。
要在命令列啟動伺服器,請在作業系統的命令終端機中輸入以下陳述式:
uvicorn main:app --reload
預設情況下,Uvicorn 伺服器使用 localhost(相當於 IP 位址 127.0.0.1),並在埠號 8000 上偵聽傳入請求。如果需要,可以更改這兩個引數。
要以程式設計方式呼叫伺服器,請在程式碼中匯入 uvicorn,並使用應用程式物件作為引數呼叫其 run() 函式。清單 2-3 中的程式碼呼叫了 run() 函式。
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return {"message": "Hello World"}
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
現在,您必須在命令終端機中執行上述程式,如下所示:
python main.py
無論哪種情況,清單 2-4 中的日誌都表明應用程式正在 localhost 的 8000 埠上執行。
詳細內容與技術分析
在本文中,我們將探討 FastAPI 的核心概念,包括其非同步處理能力、型別提示以及如何利用這些功能來建立高效且可擴充套件的 API。
非同步處理與效能最佳化
FastAPI 的非同步處理能力使其成為建立高效能 API 的理想選擇。透過使用 async
和 await
關鍵字,您可以編寫非阻塞程式碼,從而充分利用系統資源並提高整體效能。
型別提示與安全性
FastAPI 對型別提示的強大支援不僅提高了程式碼的可讀性和可維護性,還增強了安全性。透過明確指定預期資料型別,您可以減少執行階段錯誤並提高整體程式碼品質。
自動檔案生成
FastAPI 的另一個顯著特點是其自動檔案生成能力。透過利用 OpenAPI 和 JSON Schema,FastAPI 可以自動生成互動式 API 檔案,使開發人員能夠輕鬆測試和探索 API 端點。
在接下來的章節中,我們將繼續探索 FastAPI 的高階功能,包括如何處理路徑引數、查詢引數以及如何實作身份驗證和授權機制。透過結合實際範例和詳細解釋,您將能夠全面理解如何利用 FastAPI 建立複雜且功能豐富的 API。
使用 FastAPI 開發與佈署 Web 應用程式
FastAPI 是一種現代化的 Python 網路框架,專為建立高效能、易於使用的 API 而設計。本章節將介紹如何使用 FastAPI 建立一個簡單的 Web 應用程式,並探討其主要功能和特性。
啟動 Uvicorn 伺服器
在開始開發之前,需要先啟動 Uvicorn 伺服器。Uvicorn 是一個支援非同步請求處理的伺服器,能夠與 FastAPI 無縫整合。
uvicorn main:app --reload
內容解密:
uvicorn
是伺服器的名稱。main:app
表示在main.py
檔案中定義的app
物件。--reload
引數允許在程式碼變更時自動重新載入伺服器。
執行上述命令後,Uvicorn 將啟動並顯示相關的日誌資訊:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720] using WatchFiles
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
內容解密:
- 伺服器執行在
http://127.0.0.1:8000
,這是本機位址。 - 可以透過按
CTRL+C
終止伺服器。 Started reloader process
表示伺服器已啟動並監控檔案變更。Application startup complete
表示應用程式已成功啟動。
建立簡單的 FastAPI 應用程式
接下來,建立一個簡單的 FastAPI 應用程式。首先,建立一個名為 main.py
的檔案,並加入以下程式碼:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return {"message": "Hello World"}
內容解密:
from fastapi import FastAPI
:匯入 FastAPI 類別。app = FastAPI()
:建立一個 FastAPI 應用程式例項。@app.get("/")
:定義一個路由,當存取根 URL ("/"
) 時,將呼叫index
函式。async def index():
:定義一個非同步函式,傳回一個包含 “Hello World” 訊息的 JSON 物件。
對外可見的伺服器
預設情況下,FastAPI 應用程式僅在本機上可見。若要使其對外部裝置可見,需要將主機引數設為 0.0.0.0
。可以透過以下兩種方式實作:
在命令列中設定主機引數:
uvicorn main:app --host 0.0.0.0 --reload
在
main.py
中修改程式碼:import uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/") async def index(): return {"message": "Hello World"} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
內容解密:
- 將主機設為
0.0.0.0
,使應用程式對所有網路介面可見。 - 需要找到執行應用程式的機器的 IP 位址,才能從其他裝置存取。
在 Windows 系統中,可以使用 ipconfig
命令找到 IP 位址:
Wireless LAN adapter Wi-Fi:
Connection-specific DNS Suffix . : ib-wrb304n.setup.in
Link-local IPv6 Address . . . . . : fe80::dd10:6074:1eb3:a43a%77
IPv4 Address. . . . . . . . . . . : 192.168.1.211
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
內容解密:
IPv4 Address
是本機的 IP 位址,在此例中為192.168.1.211
。- 可以使用該 IP 位址從同一網路中的其他裝置存取應用程式。
自動生成 API 檔案
FastAPI 的一大特點是能夠自動生成互動式的 API 檔案。它內建了對 Swagger UI 和 Redoc 的支援。
Swagger UI
Swagger UI 提供了一個使用者友好的網頁介面,用於視覺化 API 檔案和探索端點。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return {"message": "Hello World"}
@app.get("/{name}/{id}")
async def user(name: str, id: int):
return {"name": name, "id": id}
內容解密:
- 新增了一個新的路徑操作
/ {name} / {id}
,它接收兩個路徑引數:name
和id
。 name: str
和id: int
指定了引數的資料型別。
啟動 Uvicorn 伺服器後,存取 http://localhost:8000/docs
可以看到 Swagger UI 自動生成的 API 檔案。
Redoc
Redoc 是另一個用於生成 API 檔案的開源工具,它同樣根據 OpenAPI 定義。
圖表翻譯:
此圖示顯示了 Swagger UI 和 Redoc 這兩個 API 檔案工具的主介面。