在現代 Web 開發中,選擇合適的雲端平台佈署應用程式至關重要。本文將引導您將 FastAPI 應用程式佈署到 GCP 和 Deta Cloud,兩種各有特色的雲端平台。GCP 提供完整的雲端服務,而 Deta Cloud 則以其免費方案和簡化的佈署流程吸引開發者。兩種平台的佈署流程略有不同,但都相對簡潔,方便快速上線應用程式。

透過本文,您將學會如何設定必要的環境,包含建立 GCP 專案、使用 Cloud Shell 操作,以及使用 Deta CLI 進行佈署。同時,您也將瞭解 app.yaml 的設定細節以及如何在 GCP 和 Deta Cloud 上管理您的 FastAPI 應用程式。

將FastAPI應用佈署到Google Cloud Platform(GCP)

步驟一:準備GitHub倉函式庫

首先,將FastAPI應用程式碼放入GitHub倉函式庫中,並確保包含requirements.txt檔案。這一步驟與佈署到Render時相同。

步驟二:建立app.yaml檔案

GCP需要一個名為app.yaml的文字檔案來組態應用設定。該檔案採用YAML格式,一種人類可讀的資料序列化語言。將以下指令碼儲存為app.yaml並放入GitHub倉函式庫:

runtime: python37
entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

內容解密:

  • runtime: python37:指定執行環境為Python 3.7。
  • entrypoint:定義應用的入口點,使用gunicorn作為WSGI HTTP伺服器,並指定使用uvicorn.workers.UvicornWorker來執行FastAPI應用。

步驟三:註冊並登入Google Cloud

前往https://console.cloud.google.com/註冊並登入Google Cloud賬戶。雖然Google Cloud提供免費試用,但仍需提供賬單資訊。

步驟四:建立新專案

登入後,存取https://console.cloud.google.com/cloud-resource-manager建立新專案。選擇專案名稱和專案ID。

圖示1:GCP新建專案

此圖示展示了在GCP中建立新專案的介面。

圖表翻譯: 此圖表顯示了在Google Cloud Platform中建立新專案的步驟,包括選擇專案名稱和專案ID。

步驟五:開啟Cloud Shell並克隆GitHub倉函式庫

點選Google Cloud控制檯右側的Cloud Shell按鈕,開啟Cloud Shell。然後,克隆包含應用程式碼、requirements.txtapp.yaml檔案的GitHub倉函式庫。

git clone https://github.com/lathkar/fastapi.git

步驟六:在Cloud Shell中執行應用

在Cloud Shell中執行以下命令,建立虛擬環境、安裝依賴函式庫並執行應用:

cd fastapi
virtualenv venv
source env/bin/activate
pip install -r requirements.txt
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

內容解密:

  • cd fastapi:進入克隆的倉函式庫目錄。
  • virtualenv venv:建立虛擬環境。
  • source env/bin/activate:啟用虛擬環境。
  • pip install -r requirements.txt:根據requirements.txt安裝依賴函式庫。
  • gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app:使用gunicorn執行FastAPI應用。

步驟七:佈署應用到GCP

執行以下命令來佈署應用:

gcloud config set project VALUE
gcloud app create
gcloud app deploy

內容解密:

  • gcloud config set project VALUE:設定GCP專案ID。
  • gcloud app create:建立App Engine應用。
  • gcloud app deploy:佈署應用到GCP。

圖示2:佈署確認介面

佈署過程中,GCP會顯示目標URL並請求確認。

圖表翻譯: 此圖表展示了佈署確認介面,包括目標URL和服務詳情。

Deta Cloud:一種免費的雲端託管服務

Deta Cloud是另一種雲端託管服務,特別值得注意的是,它目前提供免費託管服務。Deta提供了多種產品,包括Deta Base(一種NoSQL資料函式庫)、Deta Micros(微服務)和Deta Drive(檔案託管服務)。

Deta Micros的特點:

  • 支援Node JS和Python應用。
  • 簡化的佈署流程,透過Deta CLI實作。

使用Deta Cloud佈署FastAPI應用:

  1. 在Deta平台註冊並驗證信箱。
  2. 安裝Deta CLI。
  3. 使用Deta CLI登入並建立新的微服務。
deta login
deta new fastapi-app --python

內容解密:

  • deta login:登入到Deta賬戶。
  • deta new fastapi-app --python:建立一個新的Python微服務。

透過上述步驟,可以成功將FastAPI應用佈署到GCP和Deta Cloud,為開發者提供了多種雲端託管選擇。每種方案都有其特點和優勢,開發者可根據實際需求選擇合適的平台。

佈署FastAPI應用程式的不同方法

在前面的章節中,我們已經瞭解瞭如何使用FastAPI構建高效能的Web應用程式。在本章中,我們將重點介紹如何將這些應用程式佈署到不同的平台上。

佈署到Deta Cloud

Deta Cloud是一個無伺服器的雲端平台,可以讓您輕鬆佈署FastAPI應用程式。以下是佈署的步驟:

  1. 建立Deta帳戶:首先,您需要在Deta官網上建立一個帳戶。
  2. 安裝Deta CLI:安裝Deta的命令列工具(CLI),以便於佈署和管理您的應用程式。
  3. 生成存取令牌:在Deta儀錶板中,生成一個存取令牌(Access Token),並將其匯出為環境變數ACCESS_TOKEN
  4. 佈署應用程式:使用Deta CLI將您的FastAPI應用程式佈署到Deta Cloud。
deta login
deta new
  1. 驗證佈署:佈署完成後,您可以在Deta儀錶板中檢視您的應用程式詳情。

內容解密:

  • deta login命令用於登入到您的Deta帳戶。
  • deta new命令用於建立一個新的Deta專案並佈署您的應用程式。
  • 存取令牌(Access Token)用於驗證您的CLI請求,從而無需每次都登入。

其他雲端平台

除了Deta Cloud,您還可以將FastAPI應用程式佈署到其他雲端平台,如Render、GCP等。這些平台的佈署過程大同小異,通常涉及建立帳戶、設定環境、佈署應用程式等步驟。

索引

在本文的最後,我們提供了詳細的索引,以幫助您快速找到所需的內容。索引涵蓋了從API檔案、非同步處理到依賴項管理等各種主題。

主要術語

  • API檔案:自動生成的檔案,用於描述您的API介面。
  • 非同步處理:FastAPI支援非同步處理,可以提高應用程式的效能。
  • 依賴項管理:FastAPI提供了依賴項管理機制,可以簡化程式碼並提高可維護性。

內容解密:

  • 自動生成的API檔案使開發人員能夠輕鬆瞭解如何與您的API互動。
  • 非同步處理允許應用程式在等待某些操作完成時繼續執行其他任務,從而提高整體效能。
  • 依賴項管理機制使得管理複雜的依賴關係變得更加容易,有助於保持程式碼的整潔和可維護性。

技術細節

在本文中,我們探討了FastAPI的各種技術細節,包括非同步/等待機制、ASGI、資料函式庫操作等。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
async def create_item(item: Item):
    return item

內容解密:

  • FastAPI是主要的應用程式類別,用於建立FastAPI例項。
  • BaseModel用於定義資料模型,如Item類別。
  • async def用於定義非同步函式,如create_item
  • @app.post裝飾器用於將函式繫結到特定的HTTP方法(在本例中為POST)和路徑(/items/)。

透過這些技術細節,您可以更好地理解FastAPI的工作原理,並有效地使用它來構建高效能的Web應用程式。

FastAPI 深度解析與實務應用

前言

FastAPI 是一個現代化的、快速(高效能)的 Web 框架,用於使用 Python 3.7+ 構建 API。它根據標準的 Python 型別提示,使用 Starlette 作為 Web 框架,Pydantic 進行資料驗證。FastAPI 的設計目標是提供一個簡單、快速、可靠的 API 開發體驗。

FastAPI 的核心特性

  1. 高效能:FastAPI 是目前最快的 Python Web 框架之一,其效能可與 NodeJS 和 Go 相媲美。
  2. 自動互動式檔案:FastAPI 自動為 API 生成互動式檔案,支援 Swagger UI 和 Redoc。
  3. 資料驗證:利用 Pydantic,FastAPI 可以自動驗證請求資料,確保資料的正確性和一致性。
  4. 非同步支援:FastAPI 支援非同步程式設計,使得開發者可以編寫高效的非同步程式碼。
  5. 依賴注入系統:FastAPI 提供了一個強大的依賴注入系統,用於管理應用程式的依賴關係。

FastAPI 的基本使用

安裝 FastAPI

首先,我們需要安裝 FastAPI 及其依賴項。可以使用 pip 命令進行安裝:

pip install fastapi uvicorn

“Hello World” 示例

接下來,讓我們建立一個簡單的 “Hello World” 應用程式:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

執行該應用程式:

uvicorn main:app --reload

現在,開啟瀏覽器並存取 http://127.0.0.1:8000/,您將看到傳回的 JSON 資料 {"Hello": "World"}

路徑操作

路徑引數

路徑引數是 URL 路徑的一部分,可以用於捕捉 URL 中的變數。例如:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

在上述示例中,item_id 是一個路徑引數,它被捕捉並轉換為整數型別。

查詢引數

查詢引數是 URL 中 ? 後面的鍵值對。例如:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

在上述示例中,skiplimit 是查詢引數,它們具有預設值。

請求體

使用 Pydantic 模型定義請求體

Pydantic 模型可以用於定義請求體的結構。例如:

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.post("/items/")
def create_item(item: Item):
    return item

在上述示例中,Item 是一個 Pydantic 模型,用於定義請求體的結構。

資料函式庫整合

使用 SQLAlchemy 運算元據函式庫

SQLAlchemy 是一個流行的 Python SQL 工具包和物件關係對映(ORM)函式庫。FastAPI 可以與 SQLAlchemy 一起使用來運算元據函式庫。例如:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True)
    name = Column(String, index=True)
    price = Column(Integer)

Base.metadata.create_all(bind=engine)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/items/")
def read_items(db: Session = Depends(get_db)):
    return db.query(Item).all()

在上述示例中,我們使用 SQLAlchemy 定義了一個 Item 模型,並使用依賴注入系統取得資料函式庫會話。

身份驗證與授權

使用 OAuth2PasswordBearer 進行身份驗證

OAuth2PasswordBearer 是 FastAPI 提供的一個用於處理 OAuth2 密碼流的工具。例如:

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    # 處理 token 以取得當前使用者
    if token != "fake-token":
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return token

@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
    return {"username": current_user}

在上述示例中,我們定義了一個 get_current_user 函式,用於根據 token 取得當前使用者。

內容解密:

上述結論部分總結了FastAPI的主要特點和優勢,包括其高效能、自動檔案生成、資料驗證和非同步支援等功能。並指出透過本文的介紹,讀者應該能夠更好地理解和使用FastAPI進行Web開發。

圖表翻譯:

此圖示展示了FastAPI的架構圖,包括其主要元件和相互之間的關係。

  1. 核心元件:FastAPI核心元件包括路由系統、請求處理和回應生成等。
  2. 依賴注入系統:依賴注入系統負責管理應用程式的依賴關係,使得程式碼更加模組化和可測試。
  3. 資料驗證:Pydantic負責資料驗證,確保請求資料的正確性和一致性。
  4. 非同步支援:FastAPI支援非同步程式設計,提高了應用程式的效能和回應速度。
  graph LR;
    A[FastAPI] --> B[路由系統];
    A --> C[請求處理];
    A --> D[回應生成];
    A --> E[依賴注入系統];
    E --> F[Pydantic];
    F --> G[資料驗證];
    A --> H[非同步支援];

圖表翻譯: 此圖表展示了FastAPI的核心架構,包括路由系統、請求處理、回應生成、依賴注入系統以及非同步支援等關鍵元件。其中,Pydantic負責資料驗證,確保了請求資料的正確性。整個架構設計旨在提供高效、可靠且易於維護的Web開發體驗。