Sync fastapi docs from eba8942c on 2026-04-11
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
## FastAPI Cloud { #fastapi-cloud }
|
||||
|
||||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** 由 **FastAPI** 的同一位作者與團隊打造。
|
||||
**[FastAPI Cloud](https://fastapicloud.com)** 由 **FastAPI** 的同一位作者與團隊打造。
|
||||
|
||||
它讓你以最少的投入,簡化 **建置**、**部署** 與 **存取** API 的流程。
|
||||
|
||||
@@ -16,9 +16,9 @@ FastAPI Cloud 是 *FastAPI and friends* 開源專案的主要贊助與資金提
|
||||
|
||||
## 雲端供應商 - 贊助商 { #cloud-providers-sponsors }
|
||||
|
||||
其他一些雲端供應商也會 ✨ [**贊助 FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨。🙇
|
||||
其他一些雲端供應商也會 ✨ [**贊助 FastAPI**](../help-fastapi.md#sponsor-the-author) ✨。🙇
|
||||
|
||||
你也可以參考他們的指南並試用其服務:
|
||||
|
||||
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a>
|
||||
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a>
|
||||
* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
|
||||
* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
## 安全性 - HTTPS { #security-https }
|
||||
|
||||
在[前一章關於 HTTPS](https.md){.internal-link target=_blank} 中,我們學到 HTTPS 如何為你的 API 提供加密。
|
||||
在[前一章關於 HTTPS](https.md) 中,我們學到 HTTPS 如何為你的 API 提供加密。
|
||||
|
||||
我們也看到,HTTPS 通常由應用伺服器外部的元件提供,即 TLS Termination Proxy。
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
|
||||
### 工作行程與連接埠 { #worker-processes-and-ports }
|
||||
|
||||
還記得文件中[關於 HTTPS](https.md){.internal-link target=_blank} 的說明嗎:在一台伺服器上,一組 IP 與連接埠的組合只能由「一個行程」監聽?
|
||||
還記得文件中[關於 HTTPS](https.md) 的說明嗎:在一台伺服器上,一組 IP 與連接埠的組合只能由「一個行程」監聽?
|
||||
|
||||
這裡同樣適用。
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
|
||||
先別擔心這裡提到的「容器」、Docker 或 Kubernetes 如果現在還不太懂。
|
||||
|
||||
我會在未來的章節進一步說明容器映像、Docker、Kubernetes 等等:[容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank}。
|
||||
我會在未來的章節進一步說明容器映像、Docker、Kubernetes 等等:[容器中的 FastAPI - Docker](docker.md)。
|
||||
|
||||
///
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
|
||||
/// tip
|
||||
|
||||
我會在未來關於容器的章節提供更具體的範例:[容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank}。
|
||||
我會在未來關於容器的章節提供更具體的範例:[容器中的 FastAPI - Docker](docker.md)。
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 在容器中使用 FastAPI - Docker { #fastapi-in-containers-docker }
|
||||
|
||||
部署 FastAPI 應用時,一個常見做法是建置一個「Linux 容器映像(container image)」。通常使用 <a href="https://www.docker.com/" class="external-link" target="_blank">Docker</a> 來完成。之後你可以用多種方式部署該容器映像。
|
||||
部署 FastAPI 應用時,一個常見做法是建置一個「Linux 容器映像(container image)」。通常使用 [Docker](https://www.docker.com/) 來完成。之後你可以用多種方式部署該容器映像。
|
||||
|
||||
使用 Linux 容器有多種優點,包括安全性、可重現性、簡單性等。
|
||||
|
||||
@@ -60,16 +60,16 @@ Linux 容器使用與主機(機器、虛擬機、雲端伺服器等)相同
|
||||
|
||||
Docker 是用來建立與管理容器映像與容器的主要工具之一。
|
||||
|
||||
也有一個公開的 <a href="https://hub.docker.com/" class="external-link" target="_blank">Docker Hub</a>,內含許多工具、環境、資料庫與應用的預先製作「官方映像」。
|
||||
也有一個公開的 [Docker Hub](https://hub.docker.com/),內含許多工具、環境、資料庫與應用的預先製作「官方映像」。
|
||||
|
||||
例如,有官方的 <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">Python 映像</a>。
|
||||
例如,有官方的 [Python 映像](https://hub.docker.com/_/python)。
|
||||
|
||||
也有許多其他針對不同用途的映像,例如資料庫:
|
||||
|
||||
* <a href="https://hub.docker.com/_/postgres" class="external-link" target="_blank">PostgreSQL</a>
|
||||
* <a href="https://hub.docker.com/_/mysql" class="external-link" target="_blank">MySQL</a>
|
||||
* <a href="https://hub.docker.com/_/mongo" class="external-link" target="_blank">MongoDB</a>
|
||||
* <a href="https://hub.docker.com/_/redis" class="external-link" target="_blank">Redis</a> 等。
|
||||
* [PostgreSQL](https://hub.docker.com/_/postgres)
|
||||
* [MySQL](https://hub.docker.com/_/mysql)
|
||||
* [MongoDB](https://hub.docker.com/_/mongo)
|
||||
* [Redis](https://hub.docker.com/_/redis) 等。
|
||||
|
||||
使用預製的容器映像很容易「組合」並使用不同工具。例如,嘗試一個新資料庫。多數情況下,你可以使用官方映像,並僅用環境變數加以設定。
|
||||
|
||||
@@ -111,7 +111,7 @@ Docker 是用來建立與管理容器映像與容器的主要工具之一。
|
||||
|
||||
最常見的方式是準備一個 `requirements.txt` 檔案,逐行列出套件名稱與版本。
|
||||
|
||||
當然,你會用與在 [關於 FastAPI 版本](versions.md){.internal-link target=_blank} 中讀到的相同概念,來設定版本範圍。
|
||||
當然,你會用與在 [關於 FastAPI 版本](versions.md) 中讀到的相同概念,來設定版本範圍。
|
||||
|
||||
例如,你的 `requirements.txt` 可能像這樣:
|
||||
|
||||
@@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
|
||||
|
||||
#### 使用 `CMD` 的 Exec 形式 { #use-cmd-exec-form }
|
||||
|
||||
Docker 的 <a href="https://docs.docker.com/reference/dockerfile/#cmd" class="external-link" target="_blank">`CMD`</a> 指令可以有兩種寫法:
|
||||
Docker 的 [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) 指令可以有兩種寫法:
|
||||
|
||||
✅ Exec 形式:
|
||||
|
||||
@@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
|
||||
CMD fastapi run app/main.py --port 80
|
||||
```
|
||||
|
||||
務必總是使用 exec 形式,以確保 FastAPI 能夠優雅地關閉,並觸發 [lifespan events](../advanced/events.md){.internal-link target=_blank}。
|
||||
務必總是使用 exec 形式,以確保 FastAPI 能夠優雅地關閉,並觸發 [lifespan events](../advanced/events.md)。
|
||||
|
||||
你可以在 <a href="https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class="external-link" target="_blank">Docker 關於 shell 與 exec 形式的文件</a>閱讀更多。
|
||||
你可以在 [Docker 關於 shell 與 exec 形式的文件](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form) 閱讀更多。
|
||||
|
||||
使用 `docker compose` 時這會特別明顯。技術細節請見這段 Docker Compose 常見問題:<a href="https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class="external-link" target="_blank">為什麼我的服務要花 10 秒才重新建立或停止?</a>
|
||||
使用 `docker compose` 時這會特別明顯。技術細節請見這段 Docker Compose 常見問題:[為什麼我的服務要花 10 秒才重新建立或停止?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop)
|
||||
|
||||
#### 目錄結構 { #directory-structure }
|
||||
|
||||
@@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
|
||||
|
||||
## 檢查 { #check-it }
|
||||
|
||||
你應該可以透過 Docker 容器的網址檢查,例如:<a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> 或 <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a>(或等效的、使用你的 Docker 主機)。
|
||||
你應該可以透過 Docker 容器的網址檢查,例如:[http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) 或 [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery)(或等效的、使用你的 Docker 主機)。
|
||||
|
||||
你會看到類似這樣:
|
||||
|
||||
@@ -362,17 +362,17 @@ $ docker run -d --name mycontainer -p 80:80 myimage
|
||||
|
||||
## 互動式 API 文件 { #interactive-api-docs }
|
||||
|
||||
現在你可以前往 <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> 或 <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a>(或等效的、使用你的 Docker 主機)。
|
||||
現在你可以前往 [http://192.168.99.100/docs](http://192.168.99.100/docs) 或 [http://127.0.0.1/docs](http://127.0.0.1/docs)(或等效的、使用你的 Docker 主機)。
|
||||
|
||||
你會看到自動產生的互動式 API 文件(由 <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> 提供):
|
||||
你會看到自動產生的互動式 API 文件(由 [Swagger UI](https://github.com/swagger-api/swagger-ui) 提供):
|
||||
|
||||

|
||||
|
||||
## 替代的 API 文件 { #alternative-api-docs }
|
||||
|
||||
你也可以前往 <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> 或 <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a>(或等效的、使用你的 Docker 主機)。
|
||||
你也可以前往 [http://192.168.99.100/redoc](http://192.168.99.100/redoc) 或 [http://127.0.0.1/redoc](http://127.0.0.1/redoc)(或等效的、使用你的 Docker 主機)。
|
||||
|
||||
你會看到另一種自動產生的文件(由 <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> 提供):
|
||||
你會看到另一種自動產生的文件(由 [ReDoc](https://github.com/Rebilly/ReDoc) 提供):
|
||||
|
||||

|
||||
|
||||
@@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
|
||||
|
||||
## 部署概念 { #deployment-concepts }
|
||||
|
||||
我們用容器的角度再談一次部分相同的[部署概念](concepts.md){.internal-link target=_blank}。
|
||||
我們用容器的角度再談一次部分相同的[部署概念](concepts.md)。
|
||||
|
||||
容器主要是簡化應用「建置與部署」流程的工具,但它們不強制特定的方式來處理這些「部署概念」,而是有多種策略可選。
|
||||
|
||||
@@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
|
||||
|
||||
若僅聚焦於 FastAPI 應用的「容器映像」(以及稍後的執行中「容器」),HTTPS 通常會由另一個工具在「外部」處理。
|
||||
|
||||
它可以是另一個容器,例如使用 <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>,來處理「HTTPS」以及「自動」取得「憑證」。
|
||||
它可以是另一個容器,例如使用 [Traefik](https://traefik.io/),來處理「HTTPS」以及「自動」取得「憑證」。
|
||||
|
||||
/// tip | 提示
|
||||
|
||||
@@ -454,7 +454,7 @@ Traefik 與 Docker、Kubernetes 等整合良好,因此為你的容器設定與
|
||||
|
||||
## 複本 - 行程數量 { #replication-number-of-processes }
|
||||
|
||||
如果你在有 Kubernetes、Docker Swarm Mode、Nomad,或其他類似的分散式容器管理系統的「叢集」上運作,那你大概會希望在「叢集層級」處理「複本」,而不是在每個容器內使用「行程管理器」(例如帶有 workers 的 Uvicorn)。
|
||||
如果你在有 Kubernetes、Docker Swarm Mode、Nomad,或其他類似的分散式容器管理系統的「<dfn title="一組配置為連接並共同運作的機器">叢集</dfn>」上運作,那你大概會希望在「叢集層級」處理「複本」,而不是在每個容器內使用「行程管理器」(例如帶有 workers 的 Uvicorn)。
|
||||
|
||||
像 Kubernetes 這類的分散式容器管理系統,通常內建處理「容器複本」以及支援進入請求的「負載平衡」的能力——全部都在「叢集層級」。
|
||||
|
||||
@@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
|
||||
|
||||
/// info | 資訊
|
||||
|
||||
如果你使用 Kubernetes,這大概會是一個 <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>。
|
||||
如果你使用 Kubernetes,這大概會是一個 [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
|
||||
|
||||
///
|
||||
|
||||
@@ -570,7 +570,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
|
||||
|
||||
### 基底 Docker 映像 { #base-docker-image }
|
||||
|
||||
曾經有一個官方的 FastAPI Docker 映像:<a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>。但現在已被棄用。⛔️
|
||||
曾經有一個官方的 FastAPI Docker 映像:[tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker)。但現在已被棄用。⛔️
|
||||
|
||||
你大概「不應該」使用這個基底 Docker 映像(或其他類似的)。
|
||||
|
||||
@@ -600,7 +600,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
|
||||
|
||||
## 使用 `uv` 的 Docker 映像 { #docker-image-with-uv }
|
||||
|
||||
如果你使用 <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a> 來安裝與管理專案,你可以參考他們的 <a href="https://docs.astral.sh/uv/guides/integration/docker/" class="external-link" target="_blank">uv Docker 指南</a>。
|
||||
如果你使用 [uv](https://github.com/astral-sh/uv) 來安裝與管理專案,你可以參考他們的 [uv Docker 指南](https://docs.astral.sh/uv/guides/integration/docker/)。
|
||||
|
||||
## 總結 { #recap }
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# FastAPI Cloud { #fastapi-cloud }
|
||||
|
||||
你可以用「一行指令」把你的 FastAPI 應用程式部署到 <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>。如果你還沒加入,快去登記等候名單吧!🚀
|
||||
你可以用「一行指令」把你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com)。如果你還沒加入,快去登記等候名單吧!🚀
|
||||
|
||||
## 登入 { #login }
|
||||
|
||||
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
## 關於 FastAPI Cloud { #about-fastapi-cloud }
|
||||
|
||||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** 由 **FastAPI** 的作者與團隊打造。
|
||||
**[FastAPI Cloud](https://fastapicloud.com)** 由 **FastAPI** 的作者與團隊打造。
|
||||
|
||||
它以最少的心力,精簡化建立、部署與存取 API 的流程。
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
///
|
||||
|
||||
想從使用者角度學習 HTTPS 基礎,請參考 <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a>。
|
||||
想從使用者角度學習 HTTPS 基礎,請參考 [https://howhttps.works/](https://howhttps.works/)。
|
||||
|
||||
接著以開發者角度,談幾個關於 HTTPS 需要注意的重點:
|
||||
|
||||
@@ -28,13 +28,13 @@
|
||||
* **預設**情況下,這表示你每個 IP 位址**只能**使用**一張 HTTPS 憑證**。
|
||||
* 不論你的伺服器多強或你在上面跑的應用多小。
|
||||
* 不過,這是有**解法**的。
|
||||
* 在 **TLS** 協定(在 HTTP 之前於 TCP 層處理加密的協定)上有個**擴充**稱為 **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication - 伺服器名稱指示">SNI</abbr></a>**。
|
||||
* 在 **TLS** 協定(在 HTTP 之前於 TCP 層處理加密的協定)上有個**擴充**稱為 **[<abbr title="Server Name Indication - 伺服器名稱指示">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)**。
|
||||
* 這個 SNI 擴充讓單一伺服器(單一 IP 位址)可以擁有**多張 HTTPS 憑證**,並服務**多個 HTTPS 網域/應用**。
|
||||
* 要讓它運作,伺服器上必須有一個**單一**的元件(程式)在**公用 IP**上監聽,且持有伺服器上的**所有 HTTPS 憑證**。
|
||||
* 在取得安全連線**之後**,通訊協定**仍然是 HTTP**。
|
||||
* 雖然透過 **HTTP 協定**傳送,但內容是**加密**的。
|
||||
|
||||
常見做法是讓伺服器(機器、主機等)上跑**一個程式/HTTP 伺服器**來**管理所有 HTTPS 相關工作**:接收**加密的 HTTPS 請求**、將其**解密**成**純 HTTP 請求**轉交給同台伺服器上實際運行的 HTTP 應用(本例為 **FastAPI** 應用)、從應用取得 **HTTP 回應**、再用合適的 **HTTPS 憑證**將其**加密**並以 **HTTPS** 傳回給用戶端。這類伺服器常被稱為 **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS 終止代理 (TLS Termination Proxy)</a>**。
|
||||
常見做法是讓伺服器(機器、主機等)上跑**一個程式/HTTP 伺服器**來**管理所有 HTTPS 相關工作**:接收**加密的 HTTPS 請求**、將其**解密**成**純 HTTP 請求**轉交給同台伺服器上實際運行的 HTTP 應用(本例為 **FastAPI** 應用)、從應用取得 **HTTP 回應**、再用合適的 **HTTPS 憑證**將其**加密**並以 **HTTPS** 傳回給用戶端。這類伺服器常被稱為 **[TLS 終止代理](https://en.wikipedia.org/wiki/TLS_termination_proxy)**。
|
||||
|
||||
可作為 TLS 終止代理的選項包括:
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
取得這些憑證的流程過去相當繁瑣,需要許多手續,且憑證相當昂貴。
|
||||
|
||||
之後出現了 **<a href="https://letsencrypt.org/" class="external-link" target="_blank">Let's Encrypt</a>**。
|
||||
之後出現了 **[Let's Encrypt](https://letsencrypt.org/)**。
|
||||
|
||||
它是 Linux Foundation 的專案,能**免費**且自動化地提供 **HTTPS 憑證**。這些憑證採用標準的密碼學安全機制,且有效期較短(約 3 個月),因此因為壽命短,**安全性其實更好**。
|
||||
|
||||
@@ -200,9 +200,9 @@ TLS 終止代理接著會依照先前協商(起點是 `someapp.example.com`
|
||||
|
||||
這些代理標頭包括:
|
||||
|
||||
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
|
||||
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
|
||||
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
|
||||
* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
|
||||
* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
|
||||
* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
|
||||
|
||||
///
|
||||
|
||||
@@ -218,7 +218,7 @@ TLS 終止代理接著會依照先前協商(起點是 `someapp.example.com`
|
||||
|
||||
/// tip
|
||||
|
||||
你可以在文件 [在代理後方 - 啟用代理轉發標頭](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} 中了解更多。
|
||||
你可以在文件 [在代理後方 - 啟用代理轉發標頭](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) 中了解更多。
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
你可以使用一些工具自行**部署伺服器**,你也可以使用能為你完成部分工作的**雲端服務**,或其他可能的選項。
|
||||
|
||||
例如,我們(FastAPI 的團隊)打造了 <a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a>,讓將 FastAPI 應用程式部署到雲端變得盡可能流暢,並保持與使用 FastAPI 開發時相同的開發者體驗。
|
||||
例如,我們(FastAPI 的團隊)打造了 [**FastAPI Cloud**](https://fastapicloud.com),讓 FastAPI 應用程式部署到雲端變得盡可能流暢,並保持與使用 FastAPI 開發時相同的開發者體驗。
|
||||
|
||||
我將向你展示在部署 **FastAPI** 應用程式時你可能應該記住的一些主要概念(儘管其中大部分適用於任何其他類型的 Web 應用程式)。
|
||||
|
||||
|
||||
@@ -52,11 +52,11 @@ FastAPI 採用建立 Python 網頁框架與伺服器的標準 <abbr title="Async
|
||||
|
||||
有數個替代方案,包括:
|
||||
|
||||
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>:高效能 ASGI 伺服器。
|
||||
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>:支援 HTTP/2 與 Trio 等功能的 ASGI 伺服器。
|
||||
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>:為 Django Channels 打造的 ASGI 伺服器。
|
||||
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>:針對 Python 應用的 Rust HTTP 伺服器。
|
||||
* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>:NGINX Unit 是輕量且多功能的網頁應用執行環境。
|
||||
* [Uvicorn](https://www.uvicorn.dev/):高效能 ASGI 伺服器。
|
||||
* [Hypercorn](https://hypercorn.readthedocs.io/):支援 HTTP/2 與 Trio 等功能的 ASGI 伺服器。
|
||||
* [Daphne](https://github.com/django/daphne):為 Django Channels 打造的 ASGI 伺服器。
|
||||
* [Granian](https://github.com/emmett-framework/granian):針對 Python 應用的 Rust HTTP 伺服器。
|
||||
* [NGINX Unit](https://unit.nginx.org/howto/fastapi/):NGINX Unit 是輕量且多功能的網頁應用執行環境。
|
||||
|
||||
## 伺服器機器與伺服器程式 { #server-machine-and-server-program }
|
||||
|
||||
@@ -74,7 +74,7 @@ FastAPI 採用建立 Python 網頁框架與伺服器的標準 <abbr title="Async
|
||||
|
||||
但你也可以手動安裝 ASGI 伺服器。
|
||||
|
||||
請先建立並啟用一個 [虛擬環境](../virtual-environments.md){.internal-link target=_blank},接著再安裝伺服器程式。
|
||||
請先建立並啟用一個 [虛擬環境](../virtual-environments.md),接著再安裝伺服器程式。
|
||||
|
||||
例如,安裝 Uvicorn:
|
||||
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
|
||||
在部署應用時,你通常會希望有一些處理序的複製來善用多核心,並能處理更多請求。
|
||||
|
||||
如同前一章關於 [部署概念](concepts.md){.internal-link target=_blank} 所示,你可以採用多種策略。
|
||||
如同前一章關於 [部署概念](concepts.md) 所示,你可以採用多種策略。
|
||||
|
||||
這裡會示範如何使用 `fastapi` 指令或直接使用 `uvicorn` 指令,搭配 Uvicorn 的工作處理序(worker processes)。
|
||||
|
||||
/// info
|
||||
|
||||
如果你使用容器(例如 Docker 或 Kubernetes),我會在下一章說明更多:[容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank}。
|
||||
如果你使用容器(例如 Docker 或 Kubernetes),我會在下一章說明更多:[容器中的 FastAPI - Docker](docker.md)。
|
||||
|
||||
特別是,在 **Kubernetes** 上執行時,你多半會選擇不要使用 workers,而是每個容器只跑一個 **Uvicorn 單一處理序**。我會在該章節中進一步說明。
|
||||
|
||||
@@ -126,7 +126,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
|
||||
|
||||
## 容器與 Docker { #containers-and-docker }
|
||||
|
||||
在下一章 [容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank} 我會說明一些策略,幫你處理其他的**部署概念**。
|
||||
在下一章 [容器中的 FastAPI - Docker](docker.md) 我會說明一些策略,幫你處理其他的**部署概念**。
|
||||
|
||||
我會示範如何**從零建立你的映像檔**來執行單一 Uvicorn 處理序。這個流程相當簡單,而且在使用像 **Kubernetes** 這類分散式容器管理系統時,大多情況也會這麼做。
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
經常加入新功能、定期修復錯誤,程式碼也在持續改進。
|
||||
|
||||
這就是為什麼目前版本仍為 `0.x.x`,這表示每個版本都可能包含破壞性變更。這遵循 <a href="https://semver.org/" class="external-link" target="_blank">語意化版本(Semantic Versioning)</a> 的慣例。
|
||||
這就是為什麼目前版本仍為 `0.x.x`,這表示每個版本都可能包含破壞性變更。這遵循 [語意化版本(Semantic Versioning)](https://semver.org/) 的慣例。
|
||||
|
||||
你現在就可以用 **FastAPI** 建置生產環境的應用(而且你可能已經這麼做一段時間了),只要確保你使用的版本能與其餘程式碼正確相容。
|
||||
|
||||
@@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0
|
||||
|
||||
## 可用版本 { #available-versions }
|
||||
|
||||
你可以在 [發行說明](../release-notes.md){.internal-link target=_blank} 查看可用版本(例如用來確認目前最新版本)。
|
||||
你可以在 [發行說明](../release-notes.md) 查看可用版本(例如用來確認目前最新版本)。
|
||||
|
||||
## 關於版本 { #about-versions }
|
||||
|
||||
@@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0
|
||||
|
||||
你應該為你的應用撰寫測試。
|
||||
|
||||
在 **FastAPI** 中這很容易(感謝 Starlette),請參考文件:[測試](../tutorial/testing.md){.internal-link target=_blank}
|
||||
在 **FastAPI** 中這很容易(感謝 Starlette),請參考文件:[測試](../tutorial/testing.md)
|
||||
|
||||
有了測試之後,你就可以將 **FastAPI** 升級到較新的版本,並透過執行測試來確保所有程式碼都能正確運作。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user