FastAPI 框架以其簡潔易用的特性,在 Python Web 開發領域備受關注。它不僅能快速建構高效能的 API,還支援自動化檔案生成和資料驗證等功能。本文將引導讀者逐步瞭解 FastAPI 的核心概念,包含路由設定、請求處理、資料函式庫互動,並示範如何建構一個簡單的 CRUD 應用程式。透過 Pydantic 模型的整合,FastAPI 可以輕鬆驗證請求體的資料結構,確保 API 的穩定性和安全性。此外,文章也說明如何使用 SQLModel 進行資料函式庫操作,實作資料的持久化。
使用 FastAPI 開發高效能 Python Web API
快速:高效建構強壯的 Web API
FastAPI 是一個現代化的 Python Web 框架,專為開發高效能且穩健的 Web API 而設計。它提供了極簡的程式碼結構,讓開發者能夠快速建立 API。本篇文章將介紹 FastAPI 的核心概念、基本用法,以及如何利用它來建立一個簡單的 CRUD(建立、讀取、更新、刪除)應用程式。
FastAPI 的基本架構
路由(Routing)
在 FastAPI 中,路由是指將特定的 URL 路徑對應到特定的處理函式。FastAPI 使用 APIRouter 類別來管理路由。
from fastapi import FastAPI, APIRouter
app = FastAPI()
router = APIRouter()
@router.get("/items/")
async def read_items():
return [{"item_id": 1, "name": "Item One"}]
app.include_router(router)
內容解密:
- 匯入必要的模組:首先,我們從
fastapi匯入FastAPI和APIRouter。FastAPI是主要的應使用案例項,而APIRouter用於定義和組織路由。 - 建立 FastAPI 應使用案例項:使用
FastAPI()建立一個應使用案例項。 - 定義路由:使用
@router.get("/items/")定義了一個 GET 請求的路由,當存取/items/路徑時,會呼叫read_items函式。 - 將路由註冊到應用:使用
app.include_router(router)將定義好的路由註冊到主應使用案例項中。
請求與回應處理
請求體(Request Body)驗證
FastAPI 使用 Pydantic 模型來驗證請求體。
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
async def create_item(item: Item):
return item
內容解密:
- 定義 Pydantic 模型:使用
BaseModel定義一個名為Item的模型,該模型具有name、price和is_offer三個屬性。 - 在路由中使用模型:在
create_item函式中,引數item的型別被註解為Item,表示該函式期望接收一個符合Item模型的 JSON 物件作為請求體。 - 自動驗證:FastAPI 自動驗證請求體是否符合
Item模型的定義,如果不符合,將傳回錯誤回應。
建構 CRUD 應用程式
CRUD 是建立、讀取、更新、刪除的縮寫,代表了資料函式庫操作的基本功能。下面是一個簡單的 CRUD 應用程式範例。
資料模型
from sqlmodel import SQLModel, Field
class Event(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
title: str
description: str
內容解密:
- 匯入 SQLModel:從
sqlmodel匯入SQLModel和Field,用於定義資料函式庫模型。 - 定義資料模型:定義了一個名為
Event的 SQLModel,具有id、title和description三個欄位。 id欄位設定:id欄位被設為主鍵,並且預設值為None,表示它將由資料函式庫自動生成。
資料函式庫操作
FastAPI 可以與多種資料函式庫搭配使用,包括關係型資料函式庫和 NoSQL 資料函式庫。下面展示如何使用 SQLModel 與資料函式庫互動。
from sqlmodel import Session, create_engine
engine = create_engine("sqlite:///example.db")
def create_event(event: Event):
with Session(engine) as session:
session.add(event)
session.commit()
session.refresh(event)
return event
內容解密:
- 建立資料函式庫引擎:使用
create_engine建立一個連線到 SQLite 資料函式庫的引擎。 - 定義建立事件的函式:
create_event函式接收一個Event物件,將其新增到資料函式庫會話中,然後提交變更並重新整理物件以取得其新的狀態。
FastAPI 技術:建構高效的 Python Web API
FastAPI 是一個快速且高效的 Python Web 框架,用於建構 API。本文將探討如何使用 FastAPI 框架開發應用程式,從基礎到進階,涵蓋路由系統、回應模型、錯誤處理和範本渲染等主題。
本文目標與讀者
本文主要針對對建構 Web API 感興趣的 Python 開發者。理想的讀者應具備 Python 程式語言的基礎知識。
本文涵蓋內容
- 第一章:FastAPI 入門 - 介紹 FastAPI 的基礎知識及本文使用的其他技術,並詳細說明如何設定開發環境。
- 第二章:FastAPI 中的路由 - 詳細討論使用 FastAPI 路由系統建立端點的過程,包括請求主體和路徑引數的驗證。
- 第三章:回應模型與錯誤處理 - 介紹 FastAPI 中的回應、回應模型、錯誤處理和狀態碼。
- 第四章:FastAPI 中的範本渲染 - 討論如何使用範本建立檢視並從 API 渲染回應。
- 第五章:結構化 FastAPI 應用程式 - 介紹如何結構化應用程式,並簡要介紹即將在後續章節中建立的應用程式。
- 第六章:連線資料函式庫 - 討論 SQL 和 NoSQL 資料函式庫,並示範如何將 FastAPI 應用程式連線到這兩種資料函式庫。
- 第七章:保護 FastAPI 應用程式 - 討論應用程式安全,包括授權和認證、實作認證和限制對應用程式端點的存取。
- 第八章:測試 FastAPI 應用程式 - 解釋測試的重要性以及如何測試 API 端點。
- 第九章:佈署 FastAPI 應用程式 - 討論佈署 FastAPI 應用程式的步驟。
使用本文的最佳方式
- 確保您的電腦上安裝了最新版本的 Python。
- 熟悉 Python 程式語言,以充分利用本文的內容。
下載範例程式碼
本文使用的慣例
- 程式碼在文中:表示文中出現的程式碼單詞、資料函式庫表名、資料夾名稱、檔案名稱、檔案副檔名、路徑名稱、虛擬 URL、使用者輸入和 Twitter 處理等。
- 程式碼區塊:以特定格式顯示,例如:
from fastapi import FastAPI
from routes.user import user_router
import uvicorn
- 當需要強調程式碼區塊中的特定部分時,相關行或專案會以粗體顯示,例如:
from pydantic import BaseModel
from typing import List
class Event(BaseModel):
id: int
title: str
image: str
description: str
tags: List[str]
location: str
- 命令列輸入或輸出以特定格式寫成,例如:
$ git add hello.txt
$ git commit -m "Initial commit"
聯絡我們
我們歡迎讀者的反饋。如果您對本文有任何疑問,請電子郵件至 customercare@packtpub.com,並在郵件主題中提及書名。
第一部分:FastAPI 簡介
完成本部分後,您將對 FastAPI 有深入的瞭解,包括路由、檔案處理、錯誤處理、建立回應模型和範本渲染。本部分首先介紹本文使用的技術,然後介紹 FastAPI 框架的基礎知識。
本部分包括以下章節:
- 第一章:FastAPI 入門
- 第二章:FastAPI 中的路由
- 第三章:回應模型與錯誤處理
- 第四章:FastAPI 中的範本渲染
使用 FastAPI 快速入門
FastAPI 是本文將要使用的 Python 網頁框架。它是一種快速、輕量級的現代化 API,與其他根據 Python 的網頁框架(如 Flask 和 Django)相比,具有更簡單的學習曲線。FastAPI 是一個相對較新的框架,但它擁有不斷壯大的社群。它被廣泛用於構建網頁 API 和佈署機器學習模型。
在第一章中,您將學習如何設定開發環境並構建第一個 FastAPI 應用程式。首先,您將學習 Git(版本控制系統)的基礎知識,以便在構建應用程式時能夠儲存、追蹤和檢索檔案變更。您還將學習如何使用 pip 處理 Python 中的套件,如何使用 Virtualenv 建立隔離的開發環境,以及 Docker 的基礎知識。最後,您將透過構建一個簡單的 Hello World 應用程式來瞭解 FastAPI 的基礎知識。
本章涵蓋以下主題:
- Git 基礎知識
- 使用 Virtualenv 建立隔離的開發環境
- 使用 pip 進行套件管理
- 設定和學習 Docker 的基礎知識
- 構建一個簡單的 FastAPI 應用程式
技術需求
Git 基礎知識
Git 是一個版本控制系統,使開發人員能夠記錄、追蹤和還原到檔案的早期版本。它是一個分散式和輕量級的工具,可以安裝在任何作業系統上。
您將學習如何使用 Git 進行記錄儲存。在應用程式的每一層被構建時,將會進行變更,重要的是要記錄這些變更。
安裝 Git
要安裝 Git,請存取下載頁面 https://git-scm.com/downloads,並選擇適合您當前作業系統的下載選項。您將被重新導向到一個說明頁面,指導如何在您的機器上安裝 Git。
值得注意的是,Git 有 CLI 和 GUI 應用程式。因此,您可以下載最適合您的版本。
Git 操作
如前所述,Git 可用於記錄、追蹤和還原到檔案的早期版本。但是,本文只會介紹 Git 的基本操作,並在本文中進行介紹。
為了使 Git 正常執行,存放檔案的資料夾必須被初始化。初始化資料夾使 Git 能夠追蹤內容,除非另有豁免。
要在專案中初始化新的 Git 儲存函式庫,您需要在終端機中執行以下命令:
$ git init
要啟用檔案追蹤,首先必須新增和提交檔案。Git 提交使您能夠在時間範圍內追蹤檔案變更;例如,一小時前提交的檔案和當前檔案版本。
什麼是提交?
提交是在特定時間對檔案或資料夾狀態的唯一捕捉,並由唯一程式碼標識。
既然我們知道什麼是提交,我們就可以繼續提交檔案,如下所示:
$ git add hello.txt
$ git commit -m "初始提交"
您可以在進行變更後透過執行以下命令來追蹤檔案狀態:
$ git status
您的終端機應該與以下內容相似:
圖 1.1 – Git 命令
要檢視對檔案所做的變更(可以是新增或減少檔案內容),請執行以下命令:
$ git diff
您的終端機應該與以下內容相似:
圖 1.2 – git diff 命令的輸出
在每個資料夾中包含一個 .gitignore 檔案是一個良好的實踐。.gitignore 檔案包含 Git 要忽略的檔案和資料夾名稱。這樣,您就可以新增和提交資料夾中的所有檔案,而不必擔心提交像 .env 這樣的檔案。
要包含 .gitignore 檔案,請在終端機中執行以下命令:
$ touch .gitignore
要豁免檔案被 Git 追蹤,請將其新增到 .gitignore 檔案中,如下所示:
$ echo ".env" >> .gitignore
.gitignore 檔案中常見的檔案包括以下內容:
- 環境檔案(*.env)
- Virtualenv 資料夾(env、venv)
- IDE 中繼資料資料夾(例如
.vscode和.idea)
Git 分支
分支是一項重要的功能,使開發人員能夠輕鬆地在不同的應用程式功能、錯誤等上單獨工作,然後再合併到主分支中。
分支系統在小型和大型應用程式中都被採用,並透過提取請求促進預覽和協作的文化。主要分支稱為主分支,它是建立其他分支的基礎。
要從現有分支建立新分支,請執行 git checkout -b newbranch 命令。讓我們透過執行以下命令建立一個新分支:
$ git checkout -b hello-python-branch
上述命令從現有分支建立一個新分支,然後將活動分支設定為新建立的分支。要切換回原始主分支,請執行 git checkout main 命令,如下所示:
$ git checkout main
重要注意事項:
執行 git checkout main 使 main 成為活動工作分支,而 git checkout -b newbranch 從當前工作分支建立一個新分支,並將新建立的分支設定為活動分支。
要了解更多,請參閱 Git 檔案:http://www.git-scm.com/doc。
既然我們已經瞭解了 Git 的基礎知識,我們現在可以繼續學習如何使用 virtualenv 建立隔離環境。#### 圖表說明:Git 分支流程圖
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title Git 分支
rectangle "建立" as node1
rectangle "開發" as node2
rectangle "合併" as node3
node1 --> node2
node2 --> node3
@enduml此圖示展示了 Git 分支的基本流程,從主分支建立新分支,進行開發或錯誤修復後再合併回主分支。
內容解密:
- 建立新分支:使用
git checkout -b命令從現有分支建立新分支。 - 開發與錯誤修復:在新分支上進行功能開發或錯誤修復。
- 合併回主分支:完成開發或修復後,將新分支合併回主分支。
- 更新主分支:確保主分支包含最新的功能和修復。
現在我們已經瞭解了 Git 的基本操作和分支管理,接下來將介紹如何使用 Virtualenv 建立隔離的開發環境。
使用 Virtualenv 建立隔離的開發環境
在 Python 中開發應用程式的傳統方法是將這些應用程式隔離在虛擬環境中。這樣做是為了避免全域安裝套件並減少應用程式開發過程中的衝突。
虛擬環境是一個隔離的環境,應用程式的相依套件安裝在其中,只能在該環境中存取。因此,應用程式只能存取該環境中的套件並與之互動。
建立虛擬環境
預設情況下,Python 3 的標準函式庫中安裝了 venv 模組。venv 模組負責建立虛擬環境。讓我們建立一個 todos 資料夾,並在其中建立一個虛擬環境,執行以下命令:
$ mkdir todos && cd todos
$ python3 -m venv venv
venv 模組接受一個引數,即虛擬環境要安裝到的資料夾名稱。在我們新建立的虛擬環境中,Python 直譯器的副本安裝在 lib 資料夾中,而啟用虛擬環境內互動的檔案儲存在 bin 資料夾中。
啟用和停用虛擬環境
要啟用虛擬環境,請執行以下命令:
$ source venv/bin/activate
上述命令指示 shell 預設使用虛擬環境的直譯器和套件。啟用虛擬環境後,venv 虛擬環境資料夾的字首會新增到提示符之前,如下所示:
啟用虛擬環境後,命令提示符會顯示虛擬環境的名稱。要停用虛擬環境,請在提示符中執行 deactivate 命令。執行該命令會立即離開隔離環境,並移除字首。
內容解密:
source venv/bin/activate:啟用虛擬環境的命令,讓 shell 使用虛擬環境的直譯器和套件。deactivate:停用虛擬環境的命令,離開隔離環境。
套件管理與 pip
FastAPI 應用程式由套件組成,因此將介紹套件管理實踐,例如為應用程式安裝、移除和更新套件。
pip 簡介
Pip 是 Python 的套件管理器,如同 JavaScript 的 yarn。它使您能夠自動化安裝 Python 套件的過程,無論是全域還是本地。
安裝 pip
Pip 在 Python 安裝過程中自動安裝。您可以透過在終端機中執行以下命令來驗證是否安裝了 pip:
$ python3 -m pip list
上述命令應傳回已安裝的套件列表。輸出應類別似於以下圖示:
基本命令
安裝 pip 後,讓我們學習其基本命令。要使用 pip 安裝 FastAPI 套件,請執行以下命令:
$ pip install fastapi
在 Mac 或 Linux 等 Unix 作業系統上,在某些情況下,需要在安裝全域套件時新增 sudo 關鍵字。
要解除安裝套件,請使用以下命令:
$ pip uninstall fastapi
要將專案中目前安裝的套件整理到檔案中,我們使用以下 freeze 命令:
$ pip freeze > requirements.txt
運算元告訴 bash 將命令的輸出儲存到 requirements.txt 檔案中。這意味著執行 pip freeze 會傳回目前已安裝的所有套件的輸出。
要從檔案(如 requirements.txt 檔案)安裝套件,請使用以下命令:
$ pip install -r requirements.txt
上述命令主要用於佈署。
內容解密:
pip install fastapi:使用 pip 安裝 FastAPI 套件的命令。pip uninstall fastapi:解除安裝 FastAPI 套件的命令。pip freeze > requirements.txt:將目前已安裝的套件整理到 requirements.txt 檔案中的命令。pip install -r requirements.txt:從 requirements.txt 檔案安裝套件的命令。