在現代 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.txt
和app.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應用:
- 在Deta平台註冊並驗證信箱。
- 安裝Deta CLI。
- 使用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應用程式。以下是佈署的步驟:
- 建立Deta帳戶:首先,您需要在Deta官網上建立一個帳戶。
- 安裝Deta CLI:安裝Deta的命令列工具(CLI),以便於佈署和管理您的應用程式。
- 生成存取令牌:在Deta儀錶板中,生成一個存取令牌(Access Token),並將其匯出為環境變數
ACCESS_TOKEN
。 - 佈署應用程式:使用Deta CLI將您的FastAPI應用程式佈署到Deta Cloud。
deta login
deta new
- 驗證佈署:佈署完成後,您可以在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 的核心特性
- 高效能:FastAPI 是目前最快的 Python Web 框架之一,其效能可與 NodeJS 和 Go 相媲美。
- 自動互動式檔案:FastAPI 自動為 API 生成互動式檔案,支援 Swagger UI 和 Redoc。
- 資料驗證:利用 Pydantic,FastAPI 可以自動驗證請求資料,確保資料的正確性和一致性。
- 非同步支援:FastAPI 支援非同步程式設計,使得開發者可以編寫高效的非同步程式碼。
- 依賴注入系統: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}
在上述示例中,skip
和 limit
是查詢引數,它們具有預設值。
請求體
使用 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的架構圖,包括其主要元件和相互之間的關係。
- 核心元件:FastAPI核心元件包括路由系統、請求處理和回應生成等。
- 依賴注入系統:依賴注入系統負責管理應用程式的依賴關係,使得程式碼更加模組化和可測試。
- 資料驗證:Pydantic負責資料驗證,確保請求資料的正確性和一致性。
- 非同步支援:FastAPI支援非同步程式設計,提高了應用程式的效能和回應速度。
graph LR; A[FastAPI] --> B[路由系統]; A --> C[請求處理]; A --> D[回應生成]; A --> E[依賴注入系統]; E --> F[Pydantic]; F --> G[資料驗證]; A --> H[非同步支援];
圖表翻譯: 此圖表展示了FastAPI的核心架構,包括路由系統、請求處理、回應生成、依賴注入系統以及非同步支援等關鍵元件。其中,Pydantic負責資料驗證,確保了請求資料的正確性。整個架構設計旨在提供高效、可靠且易於維護的Web開發體驗。