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)

內容解密:

  1. 匯入必要的模組:首先,我們從 fastapi 匯入 FastAPIAPIRouterFastAPI 是主要的應使用案例項,而 APIRouter 用於定義和組織路由。
  2. 建立 FastAPI 應使用案例項:使用 FastAPI() 建立一個應使用案例項。
  3. 定義路由:使用 @router.get("/items/") 定義了一個 GET 請求的路由,當存取 /items/ 路徑時,會呼叫 read_items 函式。
  4. 將路由註冊到應用:使用 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

內容解密:

  1. 定義 Pydantic 模型:使用 BaseModel 定義一個名為 Item 的模型,該模型具有 namepriceis_offer 三個屬性。
  2. 在路由中使用模型:在 create_item 函式中,引數 item 的型別被註解為 Item,表示該函式期望接收一個符合 Item 模型的 JSON 物件作為請求體。
  3. 自動驗證: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

內容解密:

  1. 匯入 SQLModel:從 sqlmodel 匯入 SQLModelField,用於定義資料函式庫模型。
  2. 定義資料模型:定義了一個名為 Event 的 SQLModel,具有 idtitledescription 三個欄位。
  3. 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

內容解密:

  1. 建立資料函式庫引擎:使用 create_engine 建立一個連線到 SQLite 資料函式庫的引擎。
  2. 定義建立事件的函式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 分支的基本流程,從主分支建立新分支,進行開發或錯誤修復後再合併回主分支。

內容解密:

  1. 建立新分支:使用 git checkout -b 命令從現有分支建立新分支。
  2. 開發與錯誤修復:在新分支上進行功能開發或錯誤修復。
  3. 合併回主分支:完成開發或修復後,將新分支合併回主分支。
  4. 更新主分支:確保主分支包含最新的功能和修復。

現在我們已經瞭解了 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 命令。執行該命令會立即離開隔離環境,並移除字首。

內容解密:

  1. source venv/bin/activate:啟用虛擬環境的命令,讓 shell 使用虛擬環境的直譯器和套件。
  2. 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

上述命令主要用於佈署。

內容解密:

  1. pip install fastapi:使用 pip 安裝 FastAPI 套件的命令。
  2. pip uninstall fastapi:解除安裝 FastAPI 套件的命令。
  3. pip freeze > requirements.txt:將目前已安裝的套件整理到 requirements.txt 檔案中的命令。
  4. pip install -r requirements.txt:從 requirements.txt 檔案安裝套件的命令。