第一部分:FastAPI 的使用(開發環境)
1. 安裝
首先,你需要安裝 FastAPI 和一個 ASGI 服務器,最常用的是 Uvicorn。
pip install "fastapi[standard]"
這個命令會安裝 FastAPI 以及所有推薦的依賴,包括 Uvicorn(用于服務器)、Pydantic(用于數據模型)等。
2. 創建一個簡單的應用
創建一個名為 main.py
的文件:
# main.py
from fastapi import FastAPI# 創建 FastAPI 應用實例
app = FastAPI()# 定義根路徑的 GET 請求處理程序
@app.get("/")
async def read_root():return {"message": "Hello, World!"}# 定義一個帶路徑參數的 GET 請求處理程序
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}
3. 運行開發服務器
使用 Uvicorn 在本地運行你的應用:
uvicorn main:app --reload
main:app
:main
是你的模塊文件名(不含.py
),app
是你在代碼中創建的FastAPI()
實例的名稱。--reload
: 讓服務器在代碼更改后自動重啟。僅在開發時使用此選項。
輸出會顯示服務器運行地址,通常是 http://127.0.0.1:8000
。
4. 交互式 API 文檔
FastAPI 最強大的特性之一就是自動生成交互式 API 文檔。啟動服務器后,你可以訪問:
- Swagger UI 文檔:
http://127.0.0.1:8000/docs
- 這是一個交互式界面,你可以直接看到所有端點,并嘗試調用它們。
- ReDoc 文檔:
http://127.0.0.1:8000/redoc
- 這是一個更漂亮的、基于靜態頁面的文檔。
5. 測試 API
你可以使用 curl
、httpie 或任何 API 客戶端(如 Postman, Insomnia)來測試你的 API。
# 測試根路徑
curl http://localhost:8000# 測試帶參數的路徑
curl "http://localhost:8000/items/5?q=somequery"
第二部分:FastAPI 的部署(生產環境)
重要提示:千萬不要在生產環境中使用 --reload
選項。
生產環境部署有多種方式,以下是幾種最常見和推薦的方法。
方式 1: 使用 Uvicorn 直接運行(簡單部署)
對于小型應用或初期部署,你可以直接運行 Uvicorn,但需要調整一些參數以獲得更好的性能。
uvicorn main:app --host 0.0.0.0 --port 80 --workers 4
--host 0.0.0.0
: 讓服務器監聽所有公共 IP,而不僅僅是本地回環地址 (127.0.0.1
)。--port 80
: 使用標準的 HTTP 端口 80。--workers 4
: 啟動多個工作進程(worker processes)。數量通常設置為CPU 核心數 * 2 + 1
。這利用了多進程模式,大大提高了并發能力。
優點:簡單快捷。
缺點:缺乏高級功能,如 graceful shutdown、更復雜的負載均衡等。通常用于過渡或簡單場景。
方式 2: 使用 Gunicorn 作為進程管理器(推薦)
Uvicorn 提供了一個 Worker 類,可以與 Gunicorn 這樣的成熟進程管理器配合使用。Gunicorn 負責管理多個 Uvicorn 工作進程,提供了更強大的生產環境特性。
首先,安裝 Gunicorn 和 Uvicorn:
pip install "uvicorn[standard]" gunicorn
然后使用 Gunicorn 來啟動你的應用:
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
main:app
: 和之前一樣。-w 4
,--workers 4
: 設置工作進程的數量。-k uvicorn.workers.UvicornWorker
,--worker-class uvicorn.workers.UvicornWorker
: 指定使用 Uvicorn 的工作器類。-b 0.0.0.0:8000
,--bind 0.0.0.0:8000
: 綁定地址和端口。
這是部署 FastAPI/Starlette 應用的非常流行和穩健的方式。
方式 3: 使用 Docker 容器化部署(現代、標準的方式)
容器化部署提供了環境一致性、易于擴展和管理的巨大優勢。
-
創建
Dockerfile
在你的項目根目錄下創建一個名為
Dockerfile
的文件(沒有擴展名)。# 使用官方 Python 基礎鏡像 FROM python:3.9-slim# 設置工作目錄 WORKDIR /app# 復制依賴文件并安裝 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt# 復制應用代碼 COPY . .# 暴露端口 EXPOSE 80# 運行應用 # 方式 1: 直接使用 Uvicorn (適用于容器內部署) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]# 方式 2: 使用 Gunicorn (更推薦用于生產) # CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:80"]
-
創建
.dockerignore
(可選但推薦)__pycache__ *.pyc .env .git
-
構建和運行 Docker 鏡像
# 構建鏡像 docker build -t my-fastapi-app .# 運行容器 docker run -d -p 80:80 --name my-app my-fastapi-app
現在你的應用就在 Docker 容器中運行了,可以通過宿主機的 80 端口訪問。
你可以輕松地將這個 Docker 鏡像部署到任何支持容器的平臺,如:
- Kubernetes
- Docker Compose (用于本地或單機部署)
- Amazon ECS
- Google Cloud Run
- Azure Container Instances
方式 4: 使用其他 ASGI 服務器
除了 Uvicorn,你還可以選擇其他 ASGI 服務器,例如:
- Hypercorn: 一個靈感來源于 Gunicorn 的 ASGI 服務器,也支持 HTTP/2。
pip install hypercorn hypercorn main:app --bind 0.0.0.0:8000
第三部分:生產環境額外考慮事項
-
環境變量配置:使用
pydantic.BaseSettings
(例如pydantic-settings
庫)或python-decouple
來管理敏感信息(如數據庫密碼、API 密鑰),不要將它們硬編碼在代碼中。 -
反向代理:在生產環境中,通常會在 FastAPI 應用前面放置一個反向代理服務器,如 Nginx 或 Traefik。它們可以處理:
- 靜態文件:高效地提供圖片、CSS、JS 等文件,減輕 FastAPI 的負擔。
- SSL 終止:處理 HTTPS 加密和解密。
- 負載均衡:將流量分發到后端的多個應用實例。
- GZip 壓縮等。
-
監控和日志:確保正確配置日志記錄。Uvicorn 和 Gunicorn 都有日志選項。考慮集成像 Prometheus 和 Grafana 這樣的監控工具,FastAPI 有很好的 Prometheus 集成庫(如
fastapi-prometheus-grafana
)。
總結
環境 | 推薦方式 | 命令示例 |
---|---|---|
開發 | Uvicorn + --reload | uvicorn main:app --reload |
生產(簡單) | Uvicorn 多 Worker | uvicorn main:app --host 0.0.0.0 --port 80 --workers 4 |
生產(推薦) | Gunicorn + Uvicorn Worker | gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker ... |
生產(現代) | Docker + (Uvicorn/Gunicorn) | docker build ... |
對于新項目,強烈推薦從 Docker化 并結合 Gunicorn + Uvicorn Worker 的方式開始,這為未來的擴展和部署提供了最大的靈活性。