diff --git a/docs/zh-hant/docs/advanced/additional-status-codes.md b/docs/zh-hant/docs/advanced/additional-status-codes.md
index 450a4705aa..0e5941a8d6 100644
--- a/docs/zh-hant/docs/advanced/additional-status-codes.md
+++ b/docs/zh-hant/docs/advanced/additional-status-codes.md
@@ -26,7 +26,7 @@
///
-/// note | 注意
+/// note | 技術細節
你也可以使用 `from starlette.responses import JSONResponse`。
@@ -38,4 +38,4 @@
如果你直接回傳額外的狀態碼與回應,它們不會被包含進 OpenAPI 綱要(API 文件)中,因為 FastAPI 無法事先知道你會回傳什麼。
-但你可以在程式碼中補充文件,使用:[額外的回應](additional-responses.md){.internal-link target=_blank}。
+但你可以在程式碼中補充文件,使用:[額外的回應](additional-responses.md)。
diff --git a/docs/zh-hant/docs/advanced/generate-clients.md b/docs/zh-hant/docs/advanced/generate-clients.md
index 8d374566cd..c069a8034f 100644
--- a/docs/zh-hant/docs/advanced/generate-clients.md
+++ b/docs/zh-hant/docs/advanced/generate-clients.md
@@ -8,11 +8,11 @@
## 開源 SDK 產生器 { #open-source-sdk-generators }
-其中一個相當萬用的選擇是 OpenAPI Generator,它支援**多種程式語言**,並能從你的 OpenAPI 規格產生 SDK。
+其中一個相當萬用的選擇是 [OpenAPI Generator](https://openapi-generator.tech/),它支援**多種程式語言**,並能從你的 OpenAPI 規格產生 SDK。
-針對 **TypeScript 用戶端**,Hey API 是專門打造的解決方案,為 TypeScript 生態系提供最佳化的體驗。
+針對 **TypeScript 用戶端**,[Hey API](https://heyapi.dev/) 是專門打造的解決方案,為 TypeScript 生態系提供最佳化的體驗。
-你可以在 OpenAPI.Tools 找到更多 SDK 產生器。
+你可以在 [OpenAPI.Tools](https://openapi.tools/#sdk) 找到更多 SDK 產生器。
/// tip
@@ -24,15 +24,15 @@ FastAPI 會自動產生 **OpenAPI 3.1** 規格,因此你使用的任何工具
本節重點介紹由贊助 FastAPI 的公司提供的**創投支持**與**公司維運**的解決方案。這些產品在高品質的自動產生 SDK 之外,還提供**額外功能**與**整合**。
-透過 ✨ [**贊助 FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨,這些公司幫助確保框架與其**生態系**維持健康且**永續**。
+透過 ✨ [**贊助 FastAPI**](../help-fastapi.md#sponsor-the-author) ✨,這些公司幫助確保框架與其**生態系**維持健康且**永續**。
他們的贊助也展現對 FastAPI **社群**(你)的高度承諾,不僅關心提供**優良服務**,也支持 **FastAPI** 作為一個**穩健且蓬勃的框架**。🙇
例如,你可以嘗試:
-* Speakeasy
-* Stainless
-* liblab
+* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship)
+* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
+* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
其中有些方案也可能是開源或提供免費方案,讓你不需財務承諾就能試用。其他商業的 SDK 產生器也不少,你可以在網路上找到。🤓
@@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
這會在 `./src/client` 產生一個 TypeScript SDK。
-你可以在他們的網站了解如何安裝 `@hey-api/openapi-ts`,以及閱讀產生的輸出內容。
+你可以在他們的網站了解如何[安裝 `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started),以及閱讀[產生的輸出內容](https://heyapi.dev/openapi-ts/output)。
### 使用 SDK { #using-the-sdk }
@@ -121,7 +121,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
```
-……那是因為用戶端產生器對每個 *路徑操作* 都使用 OpenAPI 內部的**操作 ID(operation ID)**。
+...那是因為用戶端產生器對每個 *路徑操作* 都使用 OpenAPI 內部的**操作 ID(operation ID)**。
OpenAPI 要求每個操作 ID 在所有 *路徑操作* 之間必須唯一,因此 FastAPI 會用**函式名稱**、**路徑**與 **HTTP 方法/操作**來產生該操作 ID,如此便能確保操作 ID 的唯一性。
diff --git a/docs/zh-hant/docs/advanced/response-cookies.md b/docs/zh-hant/docs/advanced/response-cookies.md
index b7225d571c..2ba14c3f6f 100644
--- a/docs/zh-hant/docs/advanced/response-cookies.md
+++ b/docs/zh-hant/docs/advanced/response-cookies.md
@@ -20,7 +20,7 @@ FastAPI 會使用那個暫時的 `Response` 取出 Cookie(以及標頭與狀
當你在程式碼中直接回傳 `Response` 時,也可以建立 Cookie。
-要這麼做,你可以依照 [直接回傳 Response](response-directly.md){.internal-link target=_blank} 中的說明建立一個回應。
+要這麼做,你可以依照 [直接回傳 Response](response-directly.md) 中的說明建立一個回應。
接著在其中設定 Cookie,然後回傳它:
@@ -48,4 +48,4 @@ FastAPI 會使用那個暫時的 `Response` 取出 Cookie(以及標頭與狀
///
-想查看所有可用的參數與選項,請參閱 Starlette 文件。
+想查看所有可用的參數與選項,請參閱 [Starlette 文件](https://www.starlette.dev/responses/#set-cookie)。
diff --git a/docs/zh-hant/docs/advanced/response-directly.md b/docs/zh-hant/docs/advanced/response-directly.md
index 5603548934..16face2612 100644
--- a/docs/zh-hant/docs/advanced/response-directly.md
+++ b/docs/zh-hant/docs/advanced/response-directly.md
@@ -2,19 +2,23 @@
當你建立一個 **FastAPI** 的路徑操作 (path operation) 時,通常可以從中回傳任何資料:`dict`、`list`、Pydantic 模型、資料庫模型等。
-預設情況下,**FastAPI** 會使用在[JSON 相容編碼器](../tutorial/encoder.md){.internal-link target=_blank}中說明的 `jsonable_encoder`,自動將回傳值轉為 JSON。
+如果你宣告了 [回應模型](../tutorial/response-model.md),FastAPI 會用 Pydantic 將資料序列化為 JSON。
-然後在幕後,它會把這些與 JSON 相容的資料(例如 `dict`)放進 `JSONResponse`,用來把回應傳回給用戶端。
+如果你沒有宣告回應模型,FastAPI 會使用在[JSON 相容編碼器](../tutorial/encoder.md)中說明的 `jsonable_encoder`,並把它放進 `JSONResponse`。
但你也可以直接從路徑操作回傳 `JSONResponse`。
-例如,當你需要回傳自訂的 headers 或 cookies 時就很有用。
+/// tip
+
+通常使用 [回應模型](../tutorial/response-model.md) 會有更好的效能,因為那樣會在 Rust 端使用 Pydantic 來序列化資料,而不是直接回傳 `JSONResponse`。
+
+///
## 回傳 `Response` { #return-a-response }
其實,你可以回傳任何 `Response`,或其任何子類別。
-/// tip
+/// info
`JSONResponse` 本身就是 `Response` 的子類別。
@@ -26,6 +30,8 @@
這給了你很大的彈性。你可以回傳任何資料型別、覆寫任何資料宣告或驗證等。
+同時也帶來了很大的責任。你必須確保你回傳的資料是正確的、格式正確、可被序列化等。
+
## 在 `Response` 中使用 `jsonable_encoder` { #using-the-jsonable-encoder-in-a-response }
因為 **FastAPI** 不會對你回傳的 `Response` 做任何更動,你需要自行確保它的內容已經準備好。
@@ -50,16 +56,28 @@
現在來看看如何用它來回傳自訂回應。
-假設你想要回傳一個 XML 回應。
+假設你想要回傳一個 [XML](https://en.wikipedia.org/wiki/XML) 回應。
你可以把 XML 內容放進一個字串,把它放進 `Response`,然後回傳它:
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
+## 回應模型如何運作 { #how-a-response-model-works }
+
+當你在路徑操作中宣告 [回應模型 - 回傳型別](../tutorial/response-model.md) 時,**FastAPI** 會用 Pydantic 將資料序列化為 JSON。
+
+{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
+
+由於這會在 Rust 端發生,效能會比用一般的 Python 與 `JSONResponse` 類別來完成好得多。
+
+當使用 `response_model` 或回傳型別時,FastAPI 不會使用 `jsonable_encoder` 來轉換資料(那會較慢),也不會使用 `JSONResponse` 類別。
+
+相反地,它會取用用回應模型(或回傳型別)透過 Pydantic 產生的 JSON 位元組,並直接回傳具備正確 JSON 媒體型別(`application/json`)的 `Response`。
+
## 注意事項 { #notes }
當你直接回傳 `Response` 時,其資料不會自動被驗證、轉換(序列化)或文件化。
-但你仍然可以依照[在 OpenAPI 中的額外回應](additional-responses.md){.internal-link target=_blank}中的說明進行文件化。
+但你仍然可以依照[在 OpenAPI 中的額外回應](additional-responses.md)中的說明進行文件化。
在後續章節中,你會看到如何在仍保有自動資料轉換、文件化等的同時,使用/宣告這些自訂的 `Response`。
diff --git a/docs/zh-hant/docs/advanced/response-headers.md b/docs/zh-hant/docs/advanced/response-headers.md
index 6e32ca1b39..4f7494a8b3 100644
--- a/docs/zh-hant/docs/advanced/response-headers.md
+++ b/docs/zh-hant/docs/advanced/response-headers.md
@@ -20,7 +20,7 @@ FastAPI 會使用那個暫時性的回應來擷取標頭(還有 Cookie 與狀
當你直接回傳 `Response` 時,也能加入標頭。
-依照[直接回傳 Response](response-directly.md){.internal-link target=_blank}中的說明建立回應,並把標頭作為額外參數傳入:
+依照[直接回傳 Response](response-directly.md)中的說明建立回應,並把標頭作為額外參數傳入:
{* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *}
@@ -36,6 +36,6 @@ FastAPI 會使用那個暫時性的回應來擷取標頭(還有 Cookie 與狀
## 自訂標頭 { #custom-headers }
-請記住,專有的自訂標頭可以使用 `X-` 前綴來新增。
+請記住,專有的自訂標頭可以[使用 `X-` 前綴](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)來新增。
-但如果你有自訂標頭並希望瀏覽器端的客戶端能看見它們,你需要把這些標頭加入到 CORS 設定中(詳見 [CORS(跨來源資源共用)](../tutorial/cors.md){.internal-link target=_blank}),使用在Starlette 的 CORS 文件中記載的 `expose_headers` 參數。
+但如果你有自訂標頭並希望瀏覽器端的客戶端能看見它們,你需要把這些標頭加入到 CORS 設定中(詳見 [CORS(跨來源資源共用)](../tutorial/cors.md)),使用在[Starlette 的 CORS 文件](https://www.starlette.dev/middleware/#corsmiddleware)中記載的 `expose_headers` 參數。
diff --git a/docs/zh-hant/docs/advanced/security/http-basic-auth.md b/docs/zh-hant/docs/advanced/security/http-basic-auth.md
index ea3d528292..817cf166b9 100644
--- a/docs/zh-hant/docs/advanced/security/http-basic-auth.md
+++ b/docs/zh-hant/docs/advanced/security/http-basic-auth.md
@@ -32,7 +32,7 @@
使用一個依賴來檢查使用者名稱與密碼是否正確。
-為此,使用 Python 標準模組 `secrets` 來比對使用者名稱與密碼。
+為此,使用 Python 標準模組 [`secrets`](https://docs.python.org/3/library/secrets.html) 來比對使用者名稱與密碼。
`secrets.compare_digest()` 需要接收 `bytes`,或是只包含 ASCII 字元(英文字符)的 `str`。這表示它無法處理像 `á` 這樣的字元,例如 `Sebastián`。
diff --git a/docs/zh-hant/docs/advanced/security/index.md b/docs/zh-hant/docs/advanced/security/index.md
index 9a4cfbbfd6..ab8bcdcbad 100644
--- a/docs/zh-hant/docs/advanced/security/index.md
+++ b/docs/zh-hant/docs/advanced/security/index.md
@@ -6,7 +6,7 @@
/// tip
-以下各節不一定是「進階」內容。
+以下各節**不一定是「進階」**內容。
而且你的情境很可能可以在其中找到解決方案。
diff --git a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
index 029572d433..05088be7ed 100644
--- a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
+++ b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
@@ -60,7 +60,7 @@ OAuth2 規格將「scopes」定義為以空白分隔的一串字串列表。
## 全局概觀 { #global-view }
-先快速看看相對於主教學「使用密碼(與雜湊)、Bearer 與 JWT token 的 OAuth2」的差異([OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank})。現在加入了 OAuth2 scopes:
+先快速看看相對於主教學「使用密碼(與雜湊)、Bearer 與 JWT token 的 OAuth2」的差異([OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md))。現在加入了 OAuth2 scopes:
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
@@ -271,4 +271,4 @@ FastAPI 在 `fastapi.security.oauth2` 中提供了所有這些 OAuth2 驗證流
## 在裝飾器 `dependencies` 中使用 `Security` { #security-in-decorator-dependencies }
-就像你可以在裝飾器的 `dependencies` 參數中定義一個 `Depends` 的 `list` 一樣(詳見[路徑操作裝飾器中的相依性](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}),你也可以在那裡使用帶有 `scopes` 的 `Security`。
+就像你可以在裝飾器的 `dependencies` 參數中定義一個 `Depends` 的 `list` 一樣(詳見[路徑操作裝飾器中的相依性](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)),你也可以在那裡使用帶有 `scopes` 的 `Security`。
diff --git a/docs/zh-hant/docs/advanced/using-request-directly.md b/docs/zh-hant/docs/advanced/using-request-directly.md
index f1dae9bf29..2c355982de 100644
--- a/docs/zh-hant/docs/advanced/using-request-directly.md
+++ b/docs/zh-hant/docs/advanced/using-request-directly.md
@@ -15,7 +15,7 @@
## 關於 `Request` 物件的細節 { #details-about-the-request-object }
-由於 FastAPI 底層其實是 Starlette,再加上一層工具,因此在需要時你可以直接使用 Starlette 的 `Request` 物件。
+由於 FastAPI 底層其實是 Starlette,再加上一層工具,因此在需要時你可以直接使用 Starlette 的 [`Request`](https://www.starlette.dev/requests/) 物件。
同時也代表,如果你直接從 `Request` 物件取得資料(例如讀取 body),FastAPI 不會替它做驗證、轉換或文件化(透過 OpenAPI 為自動化的 API 介面產生文件)。
@@ -45,7 +45,7 @@
## `Request` 文件 { #request-documentation }
-你可以在 Starlette 官方文件站點中的 `Request` 物件 了解更多細節。
+你可以在 [Starlette 官方文件站點中的 `Request` 物件](https://www.starlette.dev/requests/) 了解更多細節。
/// note | 技術細節
diff --git a/docs/zh-hant/docs/deployment/cloud.md b/docs/zh-hant/docs/deployment/cloud.md
index fffb2fcfeb..86d216ca6f 100644
--- a/docs/zh-hant/docs/deployment/cloud.md
+++ b/docs/zh-hant/docs/deployment/cloud.md
@@ -6,7 +6,7 @@
## FastAPI Cloud { #fastapi-cloud }
-**FastAPI Cloud** 由 **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) ✨。🙇
你也可以參考他們的指南並試用其服務:
-* Render
-* Railway
+* [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)
diff --git a/docs/zh-hant/docs/deployment/concepts.md b/docs/zh-hant/docs/deployment/concepts.md
index 0cca31d260..0b8677bfd3 100644
--- a/docs/zh-hant/docs/deployment/concepts.md
+++ b/docs/zh-hant/docs/deployment/concepts.md
@@ -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)。
///
diff --git a/docs/zh-hant/docs/deployment/docker.md b/docs/zh-hant/docs/deployment/docker.md
index 87f4e6f9f0..03b9f2f76e 100644
--- a/docs/zh-hant/docs/deployment/docker.md
+++ b/docs/zh-hant/docs/deployment/docker.md
@@ -1,6 +1,6 @@
# 在容器中使用 FastAPI - Docker { #fastapi-in-containers-docker }
-部署 FastAPI 應用時,一個常見做法是建置一個「Linux 容器映像(container image)」。通常使用 Docker 來完成。之後你可以用多種方式部署該容器映像。
+部署 FastAPI 應用時,一個常見做法是建置一個「Linux 容器映像(container image)」。通常使用 [Docker](https://www.docker.com/) 來完成。之後你可以用多種方式部署該容器映像。
使用 Linux 容器有多種優點,包括安全性、可重現性、簡單性等。
@@ -60,16 +60,16 @@ Linux 容器使用與主機(機器、虛擬機、雲端伺服器等)相同
Docker 是用來建立與管理容器映像與容器的主要工具之一。
-也有一個公開的 Docker Hub,內含許多工具、環境、資料庫與應用的預先製作「官方映像」。
+也有一個公開的 [Docker Hub](https://hub.docker.com/),內含許多工具、環境、資料庫與應用的預先製作「官方映像」。
-例如,有官方的 Python 映像。
+例如,有官方的 [Python 映像](https://hub.docker.com/_/python)。
也有許多其他針對不同用途的映像,例如資料庫:
-* PostgreSQL
-* MySQL
-* MongoDB
-* Redis 等。
+* [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 的 `CMD` 指令可以有兩種寫法:
+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)。
-你可以在 Docker 關於 shell 與 exec 形式的文件閱讀更多。
+你可以在 [Docker 關於 shell 與 exec 形式的文件](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form) 閱讀更多。
-使用 `docker compose` 時這會特別明顯。技術細節請見這段 Docker Compose 常見問題:為什麼我的服務要花 10 秒才重新建立或停止?
+使用 `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 容器的網址檢查,例如:http://192.168.99.100/items/5?q=somequery 或 http://127.0.0.1/items/5?q=somequery(或等效的、使用你的 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 }
-現在你可以前往 http://192.168.99.100/docs 或 http://127.0.0.1/docs(或等效的、使用你的 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 文件(由 Swagger UI 提供):
+你會看到自動產生的互動式 API 文件(由 [Swagger UI](https://github.com/swagger-api/swagger-ui) 提供):

## 替代的 API 文件 { #alternative-api-docs }
-你也可以前往 http://192.168.99.100/redoc 或 http://127.0.0.1/redoc(或等效的、使用你的 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 主機)。
-你會看到另一種自動產生的文件(由 ReDoc 提供):
+你會看到另一種自動產生的文件(由 [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 通常會由另一個工具在「外部」處理。
-它可以是另一個容器,例如使用 Traefik,來處理「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,或其他類似的分散式容器管理系統的「叢集」上運作,那你大概會希望在「叢集層級」處理「複本」,而不是在每個容器內使用「行程管理器」(例如帶有 workers 的 Uvicorn)。
像 Kubernetes 這類的分散式容器管理系統,通常內建處理「容器複本」以及支援進入請求的「負載平衡」的能力——全部都在「叢集層級」。
@@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
/// info | 資訊
-如果你使用 Kubernetes,這大概會是一個 Init Container。
+如果你使用 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 映像:tiangolo/uvicorn-gunicorn-fastapi。但現在已被棄用。⛔️
+曾經有一個官方的 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 }
-如果你使用 uv 來安裝與管理專案,你可以參考他們的 uv Docker 指南。
+如果你使用 [uv](https://github.com/astral-sh/uv) 來安裝與管理專案,你可以參考他們的 [uv Docker 指南](https://docs.astral.sh/uv/guides/integration/docker/)。
## 總結 { #recap }
diff --git a/docs/zh-hant/docs/deployment/fastapicloud.md b/docs/zh-hant/docs/deployment/fastapicloud.md
index 5663590d14..4b6fb86b47 100644
--- a/docs/zh-hant/docs/deployment/fastapicloud.md
+++ b/docs/zh-hant/docs/deployment/fastapicloud.md
@@ -1,6 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-你可以用「一行指令」把你的 FastAPI 應用程式部署到 FastAPI Cloud。如果你還沒加入,快去登記等候名單吧!🚀
+你可以用「一行指令」把你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com)。如果你還沒加入,快去登記等候名單吧!🚀
## 登入 { #login }
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
## 關於 FastAPI Cloud { #about-fastapi-cloud }
-**FastAPI Cloud** 由 **FastAPI** 的作者與團隊打造。
+**[FastAPI Cloud](https://fastapicloud.com)** 由 **FastAPI** 的作者與團隊打造。
它以最少的心力,精簡化建立、部署與存取 API 的流程。
diff --git a/docs/zh-hant/docs/deployment/https.md b/docs/zh-hant/docs/deployment/https.md
index 0934b02831..ddafcb34b1 100644
--- a/docs/zh-hant/docs/deployment/https.md
+++ b/docs/zh-hant/docs/deployment/https.md
@@ -10,7 +10,7 @@
///
-想從使用者角度學習 HTTPS 基礎,請參考 https://howhttps.works/。
+想從使用者角度學習 HTTPS 基礎,請參考 [https://howhttps.works/](https://howhttps.works/)。
接著以開發者角度,談幾個關於 HTTPS 需要注意的重點:
@@ -28,13 +28,13 @@
* **預設**情況下,這表示你每個 IP 位址**只能**使用**一張 HTTPS 憑證**。
* 不論你的伺服器多強或你在上面跑的應用多小。
* 不過,這是有**解法**的。
-* 在 **TLS** 協定(在 HTTP 之前於 TCP 層處理加密的協定)上有個**擴充**稱為 **SNI**。
+* 在 **TLS** 協定(在 HTTP 之前於 TCP 層處理加密的協定)上有個**擴充**稱為 **[SNI](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** 傳回給用戶端。這類伺服器常被稱為 **TLS 終止代理 (TLS Termination Proxy)**。
+常見做法是讓伺服器(機器、主機等)上跑**一個程式/HTTP 伺服器**來**管理所有 HTTPS 相關工作**:接收**加密的 HTTPS 請求**、將其**解密**成**純 HTTP 請求**轉交給同台伺服器上實際運行的 HTTP 應用(本例為 **FastAPI** 應用)、從應用取得 **HTTP 回應**、再用合適的 **HTTPS 憑證**將其**加密**並以 **HTTPS** 傳回給用戶端。這類伺服器常被稱為 **[TLS 終止代理](https://en.wikipedia.org/wiki/TLS_termination_proxy)**。
可作為 TLS 終止代理的選項包括:
@@ -49,7 +49,7 @@
取得這些憑證的流程過去相當繁瑣,需要許多手續,且憑證相當昂貴。
-之後出現了 **Let's Encrypt**。
+之後出現了 **[Let's Encrypt](https://letsencrypt.org/)**。
它是 Linux Foundation 的專案,能**免費**且自動化地提供 **HTTPS 憑證**。這些憑證採用標準的密碼學安全機制,且有效期較短(約 3 個月),因此因為壽命短,**安全性其實更好**。
@@ -200,9 +200,9 @@ TLS 終止代理接著會依照先前協商(起點是 `someapp.example.com`
這些代理標頭包括:
-* X-Forwarded-For
-* X-Forwarded-Proto
-* X-Forwarded-Host
+* [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) 中了解更多。
///
diff --git a/docs/zh-hant/docs/deployment/index.md b/docs/zh-hant/docs/deployment/index.md
index ddf533efc9..c9d474cacb 100644
--- a/docs/zh-hant/docs/deployment/index.md
+++ b/docs/zh-hant/docs/deployment/index.md
@@ -16,7 +16,7 @@
你可以使用一些工具自行**部署伺服器**,你也可以使用能為你完成部分工作的**雲端服務**,或其他可能的選項。
-例如,我們(FastAPI 的團隊)打造了 **FastAPI Cloud**,讓將 FastAPI 應用程式部署到雲端變得盡可能流暢,並保持與使用 FastAPI 開發時相同的開發者體驗。
+例如,我們(FastAPI 的團隊)打造了 [**FastAPI Cloud**](https://fastapicloud.com),讓 FastAPI 應用程式部署到雲端變得盡可能流暢,並保持與使用 FastAPI 開發時相同的開發者體驗。
我將向你展示在部署 **FastAPI** 應用程式時你可能應該記住的一些主要概念(儘管其中大部分適用於任何其他類型的 Web 應用程式)。
diff --git a/docs/zh-hant/docs/deployment/manually.md b/docs/zh-hant/docs/deployment/manually.md
index bf9f6a93f4..71e9e27c87 100644
--- a/docs/zh-hant/docs/deployment/manually.md
+++ b/docs/zh-hant/docs/deployment/manually.md
@@ -52,11 +52,11 @@ FastAPI 採用建立 Python 網頁框架與伺服器的標準 Uvicorn:高效能 ASGI 伺服器。
-* Hypercorn:支援 HTTP/2 與 Trio 等功能的 ASGI 伺服器。
-* Daphne:為 Django Channels 打造的 ASGI 伺服器。
-* Granian:針對 Python 應用的 Rust HTTP 伺服器。
-* NGINX Unit: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 網頁框架與伺服器的標準 fastapi run --workers 4 INFO Started server process [27369]
INFO Started server process [27370]
INFO Started server process [27367]
- INFO Waiting for application startup.
- INFO Waiting for application startup.
- INFO Waiting for application startup.
- INFO Waiting for application startup.
- INFO Application startup complete.
- INFO Application startup complete.
- INFO Application startup complete.
- INFO Application startup complete.
+ INFO Waiting for application startup.
+ INFO Waiting for application startup.
+ INFO Waiting for application startup.
+ INFO Waiting for application startup.
+ INFO Application startup complete.
+ INFO Application startup complete.
+ INFO Application startup complete.
+ INFO Application startup complete.
```
@@ -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** 這類分散式容器管理系統時,大多情況也會這麼做。
diff --git a/docs/zh-hant/docs/deployment/versions.md b/docs/zh-hant/docs/deployment/versions.md
index c4f9c52624..37d3dd3e24 100644
--- a/docs/zh-hant/docs/deployment/versions.md
+++ b/docs/zh-hant/docs/deployment/versions.md
@@ -4,7 +4,7 @@
經常加入新功能、定期修復錯誤,程式碼也在持續改進。
-這就是為什麼目前版本仍為 `0.x.x`,這表示每個版本都可能包含破壞性變更。這遵循 語意化版本(Semantic Versioning) 的慣例。
+這就是為什麼目前版本仍為 `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** 升級到較新的版本,並透過執行測試來確保所有程式碼都能正確運作。
diff --git a/docs/zh-hant/docs/how-to/authentication-error-status-code.md b/docs/zh-hant/docs/how-to/authentication-error-status-code.md
index 9a8de4c910..beea430707 100644
--- a/docs/zh-hant/docs/how-to/authentication-error-status-code.md
+++ b/docs/zh-hant/docs/how-to/authentication-error-status-code.md
@@ -2,7 +2,7 @@
在 FastAPI 版本 `0.122.0` 之前,當內建的安全工具在身分驗證失敗後回傳錯誤給用戶端時,會使用 HTTP 狀態碼 `403 Forbidden`。
-從 FastAPI 版本 `0.122.0` 起,改為使用更合適的 HTTP 狀態碼 `401 Unauthorized`,並在回應中依據 HTTP 規範加上合理的 `WWW-Authenticate` 標頭,參考 RFC 7235、RFC 9110。
+從 FastAPI 版本 `0.122.0` 起,改為使用更合適的 HTTP 狀態碼 `401 Unauthorized`,並在回應中依據 HTTP 規範加上合理的 `WWW-Authenticate` 標頭,參考 [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1)、[RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized)。
但如果你的用戶端因某些原因依賴於舊行為,你可以在你的 security 類別中覆寫 `make_not_authenticated_error` 方法以恢復舊的行為。
diff --git a/docs/zh-hant/docs/how-to/conditional-openapi.md b/docs/zh-hant/docs/how-to/conditional-openapi.md
index 5c091e5b7b..485a7d11d7 100644
--- a/docs/zh-hant/docs/how-to/conditional-openapi.md
+++ b/docs/zh-hant/docs/how-to/conditional-openapi.md
@@ -10,7 +10,7 @@
若你的程式碼有安全性缺陷,它依然會存在。
-隱藏文件只會讓他人更難理解如何與你的 API 互動,也可能讓你在正式環境除錯更困難。這通常僅被視為一種 以隱匿求安全。
+隱藏文件只會讓他人更難理解如何與你的 API 互動,也可能讓你在正式環境除錯更困難。這通常僅被視為一種 [以隱匿求安全](https://en.wikipedia.org/wiki/Security_through_obscurity)。
如果你想保護 API,有許多更好的作法,例如:
diff --git a/docs/zh-hant/docs/how-to/configure-swagger-ui.md b/docs/zh-hant/docs/how-to/configure-swagger-ui.md
index e5b6d7d1e3..cbb63ef5e6 100644
--- a/docs/zh-hant/docs/how-to/configure-swagger-ui.md
+++ b/docs/zh-hant/docs/how-to/configure-swagger-ui.md
@@ -1,12 +1,12 @@
# 設定 Swagger UI { #configure-swagger-ui }
-你可以設定一些額外的 Swagger UI 參數。
+你可以設定一些額外的 [Swagger UI 參數](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)。
要設定它們,建立 `FastAPI()` 應用物件時,或呼叫 `get_swagger_ui_html()` 函式時,傳入參數 `swagger_ui_parameters`。
`swagger_ui_parameters` 接受一個 dict,內容會直接傳給 Swagger UI 作為設定。
-FastAPI 會把這些設定轉換成 JSON,以便與 JavaScript 相容,因為 Swagger UI 需要的是這種格式。
+FastAPI 會把這些設定轉換成 **JSON**,以便與 JavaScript 相容,因為 Swagger UI 需要的是這種格式。
## 停用語法醒目提示 { #disable-syntax-highlighting }
@@ -50,11 +50,11 @@ FastAPI 內建一些預設參數,適用於大多數情境。
## 其他 Swagger UI 參數 { #other-swagger-ui-parameters }
-若要查看所有可用的設定,請參考官方的 Swagger UI 參數文件。
+若要查看所有可用的設定,請參考官方的 [Swagger UI 參數文件](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)。
## 僅限 JavaScript 的設定 { #javascript-only-settings }
-Swagger UI 也允許某些設定是僅限 JavaScript 的物件(例如 JavaScript 函式)。
+Swagger UI 也允許某些設定是**僅限 JavaScript** 的物件(例如 JavaScript 函式)。
FastAPI 也包含以下僅限 JavaScript 的 `presets` 設定:
diff --git a/docs/zh-hant/docs/how-to/custom-docs-ui-assets.md b/docs/zh-hant/docs/how-to/custom-docs-ui-assets.md
index 4b53945891..e690e55c96 100644
--- a/docs/zh-hant/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/zh-hant/docs/how-to/custom-docs-ui-assets.md
@@ -54,7 +54,7 @@ Swagger UI 會在背後幫你處理,不過它需要這個「redirect」輔助
### 測試 { #test-it }
-現在你應該能造訪 http://127.0.0.1:8000/docs,重新載入頁面後,資源會從新的 CDN 載入。
+現在你應該能造訪 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs),重新載入頁面後,資源會從新的 CDN 載入。
## 自行託管文件所需的 JavaScript 與 CSS { #self-hosting-javascript-and-css-for-docs }
@@ -93,12 +93,12 @@ Swagger UI 會在背後幫你處理,不過它需要這個「redirect」輔助
Swagger UI 需要以下檔案:
-* `swagger-ui-bundle.js`
-* `swagger-ui.css`
+* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
+* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
而 ReDoc 需要以下檔案:
-* `redoc.standalone.js`
+* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
之後,你的檔案結構可能如下:
@@ -122,7 +122,7 @@ Swagger UI 需要以下檔案:
### 測試靜態檔案 { #test-the-static-files }
-啟動你的應用並前往 http://127.0.0.1:8000/static/redoc.standalone.js。
+啟動你的應用並前往 [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js)。
你應該會看到一個很長的 **ReDoc** JavaScript 檔案。
@@ -180,6 +180,6 @@ Swagger UI 會在背後幫你處理,不過它需要這個「redirect」輔助
### 測試使用靜態檔案的 UI { #test-static-files-ui }
-現在,你應該可以關閉 WiFi,造訪你的文件 http://127.0.0.1:8000/docs,並重新載入頁面。
+現在,你應該可以關閉 WiFi,造訪你的文件 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs),並重新載入頁面。
即使沒有網際網路,也能看到你的 API 文件並與之互動。
diff --git a/docs/zh-hant/docs/how-to/custom-request-and-route.md b/docs/zh-hant/docs/how-to/custom-request-and-route.md
index 99c3410e47..00031fcaad 100644
--- a/docs/zh-hant/docs/how-to/custom-request-and-route.md
+++ b/docs/zh-hant/docs/how-to/custom-request-and-route.md
@@ -18,7 +18,7 @@
可能的使用情境包括:
-* 將非 JSON 的請求本文轉換為 JSON(例如 `msgpack`)。
+* 將非 JSON 的請求本文轉換為 JSON(例如 [`msgpack`](https://msgpack.org/index.html))。
* 解壓縮以 gzip 壓縮的請求本文。
* 自動記錄所有請求本文。
@@ -32,7 +32,7 @@
/// tip
-這是一個示範用的簡化範例;如果你需要 Gzip 支援,可以直接使用提供的 [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}。
+這是一個示範用的簡化範例;如果你需要 Gzip 支援,可以直接使用提供的 [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware)。
///
@@ -40,7 +40,7 @@
如果標頭中沒有 `gzip`,它就不會嘗試解壓縮本文。
-如此一來,相同的路由類別即可同時處理經 gzip 壓縮與未壓縮的請求.
+如此一來,相同的路由類別即可同時處理經 gzip 壓縮與未壓縮的請求。
{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}
@@ -66,7 +66,7 @@
而 `scope` 與 `receive` 這兩者,就是建立一個新的 `Request` 實例所需的資料。
-想了解更多 `Request`,請參考 Starlette 的 Request 文件。
+想了解更多 `Request`,請參考 [Starlette 的 Request 文件](https://www.starlette.dev/requests/)。
///
@@ -82,7 +82,7 @@
/// tip
-要解決相同問題,使用針對 `RequestValidationError` 的自訂處理器來讀取 `body` 通常更簡單([處理錯誤](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank})。
+要解決相同問題,使用針對 `RequestValidationError` 的自訂處理器來讀取 `body` 通常更簡單([處理錯誤](../tutorial/handling-errors.md#use-the-requestvalidationerror-body))。
但本範例仍然有效,並示範了如何與內部元件互動。
diff --git a/docs/zh-hant/docs/how-to/extending-openapi.md b/docs/zh-hant/docs/how-to/extending-openapi.md
index c51e896f32..b5adca0f76 100644
--- a/docs/zh-hant/docs/how-to/extending-openapi.md
+++ b/docs/zh-hant/docs/how-to/extending-openapi.md
@@ -37,7 +37,7 @@
基於上述資訊,你可以用相同的工具函式來產生 OpenAPI 結構,並覆寫你需要客製的部分。
-例如,我們要加入 ReDoc 的 OpenAPI 擴充,插入自訂 logo。
+例如,我們要加入 [ReDoc 的 OpenAPI 擴充,插入自訂 logo](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo)。
### 一般的 **FastAPI** { #normal-fastapi }
@@ -75,6 +75,6 @@
### 檢查看看 { #check-it }
-造訪 http://127.0.0.1:8000/redoc 後,你會看到自訂的 logo(此例為 **FastAPI** 的 logo):
+造訪 [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) 後,你會看到自訂的 logo(此例為 **FastAPI** 的 logo):
diff --git a/docs/zh-hant/docs/how-to/general.md b/docs/zh-hant/docs/how-to/general.md
index 96a71d62dd..13d4d7d3ee 100644
--- a/docs/zh-hant/docs/how-to/general.md
+++ b/docs/zh-hant/docs/how-to/general.md
@@ -4,36 +4,40 @@
## 篩選資料 - 安全性 { #filter-data-security }
-為確保你不會回傳超出應有的資料,請參閱[教學 - 回應模型 - 回傳型別](../tutorial/response-model.md){.internal-link target=_blank}。
+為確保你不會回傳超出應有的資料,請參閱[教學 - 回應模型 - 回傳型別](../tutorial/response-model.md)。
+
+## 最佳化回應效能 - 回應模型 - 回傳型別 { #optimize-response-performance-response-model-return-type }
+
+為了在回傳 JSON 資料時最佳化效能,請使用回傳型別或回應模型,如此 Pydantic 會在 Rust 端處理序列化為 JSON,而不經過 Python。更多內容請參閱[教學 - 回應模型 - 回傳型別](../tutorial/response-model.md)。
## 文件標籤 - OpenAPI { #documentation-tags-openapi }
-要在你的*路徑操作(path operation)*加入標籤,並在文件 UI 中分組,請參閱[教學 - 路徑操作設定 - 標籤](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}。
+要在你的*路徑操作(path operation)*加入標籤,並在文件 UI 中分組,請參閱[教學 - 路徑操作設定 - 標籤](../tutorial/path-operation-configuration.md#tags)。
## 文件摘要與描述 - OpenAPI { #documentation-summary-and-description-openapi }
-要為你的*路徑操作*加入摘要與描述,並在文件 UI 中顯示,請參閱[教學 - 路徑操作設定 - 摘要與描述](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}。
+要為你的*路徑操作*加入摘要與描述,並在文件 UI 中顯示,請參閱[教學 - 路徑操作設定 - 摘要與描述](../tutorial/path-operation-configuration.md#summary-and-description)。
## 文件回應描述 - OpenAPI { #documentation-response-description-openapi }
-要定義在文件 UI 中顯示的回應描述,請參閱[教學 - 路徑操作設定 - 回應描述](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}。
+要定義在文件 UI 中顯示的回應描述,請參閱[教學 - 路徑操作設定 - 回應描述](../tutorial/path-operation-configuration.md#response-description)。
## 文件將*路徑操作*標記為已棄用 - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
-要將*路徑操作*標記為已棄用,並在文件 UI 中顯示,請參閱[教學 - 路徑操作設定 - 棄用](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}。
+要將*路徑操作*標記為已棄用,並在文件 UI 中顯示,請參閱[教學 - 路徑操作設定 - 棄用](../tutorial/path-operation-configuration.md#deprecate-a-path-operation)。
## 將任意資料轉換為 JSON 相容格式 { #convert-any-data-to-json-compatible }
-要將任意資料轉換為 JSON 相容格式,請參閱[教學 - JSON 相容編碼器](../tutorial/encoder.md){.internal-link target=_blank}。
+要將任意資料轉換為 JSON 相容格式,請參閱[教學 - JSON 相容編碼器](../tutorial/encoder.md)。
## OpenAPI 中繼資料 - 文件 { #openapi-metadata-docs }
-要在你的 OpenAPI 綱要中加入中繼資料(包含授權、版本、聯絡方式等),請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md){.internal-link target=_blank}。
+要在你的 OpenAPI 綱要中加入中繼資料(包含授權、版本、聯絡方式等),請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md)。
## 自訂 OpenAPI URL { #openapi-custom-url }
-要自訂(或移除)OpenAPI 的 URL,請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}。
+要自訂(或移除)OpenAPI 的 URL,請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md#openapi-url)。
## OpenAPI 文件 URL { #openapi-docs-urls }
-要更新自動產生的文件使用者介面所使用的 URL,請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}。
+要更新自動產生的文件使用者介面所使用的 URL,請參閱[教學 - 中繼資料與文件 URL](../tutorial/metadata.md#docs-urls)。
diff --git a/docs/zh-hant/docs/how-to/graphql.md b/docs/zh-hant/docs/how-to/graphql.md
index 51933210c5..24e4d89792 100644
--- a/docs/zh-hant/docs/how-to/graphql.md
+++ b/docs/zh-hant/docs/how-to/graphql.md
@@ -18,18 +18,18 @@ GraphQL 解決某些非常特定的使用情境。
下面是支援 ASGI 的部分 GraphQL 函式庫,你可以與 FastAPI 一起使用:
-* Strawberry 🍓
- * 提供 FastAPI 文件
-* Ariadne
- * 提供 FastAPI 文件
-* Tartiflette
- * 使用 Tartiflette ASGI 提供 ASGI 整合
-* Graphene
- * 搭配 starlette-graphene3
+* [Strawberry](https://strawberry.rocks/) 🍓
+ * 提供 [FastAPI 文件](https://strawberry.rocks/docs/integrations/fastapi)
+* [Ariadne](https://ariadnegraphql.org/)
+ * 提供 [FastAPI 文件](https://ariadnegraphql.org/docs/fastapi-integration)
+* [Tartiflette](https://tartiflette.io/)
+ * 使用 [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) 提供 ASGI 整合
+* [Graphene](https://graphene-python.org/)
+ * 搭配 [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)
## 使用 Strawberry 的 GraphQL { #graphql-with-strawberry }
-如果你需要或想使用 GraphQL,Strawberry 是推薦的函式庫,因為它的設計與 FastAPI 最接近,全部都基於型別註解 (type annotations)。
+如果你需要或想使用 GraphQL,[Strawberry](https://strawberry.rocks/) 是推薦的函式庫,因為它的設計與 FastAPI 最接近,全部都基於型別註解 (type annotations)。
視你的使用情境而定,你可能會偏好其他函式庫,但如果你問我,我大概會建議你先試試 Strawberry。
@@ -37,24 +37,24 @@ GraphQL 解決某些非常特定的使用情境。
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
-你可以在 Strawberry 文件 中進一步了解 Strawberry。
+你可以在 [Strawberry 文件](https://strawberry.rocks/) 中進一步了解 Strawberry。
-也可以參考關於 Strawberry 與 FastAPI 的文件。
+也可以參考關於 [Strawberry 與 FastAPI](https://strawberry.rocks/docs/integrations/fastapi) 的文件。
## 來自 Starlette 的較舊 `GraphQLApp` { #older-graphqlapp-from-starlette }
-早期版本的 Starlette 提供 `GraphQLApp` 類別以整合 Graphene。
+早期版本的 Starlette 提供 `GraphQLApp` 類別以整合 [Graphene](https://graphene-python.org/)。
-它已在 Starlette 中被棄用,但如果你的程式碼使用了它,可以輕鬆遷移到 starlette-graphene3,涵蓋相同的使用情境,且介面幾乎相同。
+它已在 Starlette 中被棄用,但如果你的程式碼使用了它,可以輕鬆遷移到 [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3),涵蓋相同的使用情境,且介面幾乎相同。
/// tip
-如果你需要 GraphQL,我仍建議你看看 Strawberry,因為它基於型別註解,而不是自訂的類別與型別。
+如果你需要 GraphQL,我仍建議你看看 [Strawberry](https://strawberry.rocks/),因為它基於型別註解,而不是自訂的類別與型別。
///
## 進一步了解 { #learn-more }
-你可以在 官方 GraphQL 文件 中進一步了解 GraphQL。
+你可以在 [官方 GraphQL 文件](https://graphql.org/) 中進一步了解 GraphQL。
你也可以透過上述連結閱讀各個函式庫的更多內容。
diff --git a/docs/zh-hant/docs/how-to/index.md b/docs/zh-hant/docs/how-to/index.md
index 6c9a8202c0..c08bd3d663 100644
--- a/docs/zh-hant/docs/how-to/index.md
+++ b/docs/zh-hant/docs/how-to/index.md
@@ -8,6 +8,6 @@
/// tip
-如果你想要以結構化的方式**學習 FastAPI**(推薦),請前往[教學 - 使用者指南](../tutorial/index.md){.internal-link target=_blank}逐章閱讀。
+如果你想要以結構化的方式**學習 FastAPI**(推薦),請前往[教學 - 使用者指南](../tutorial/index.md)逐章閱讀。
///
diff --git a/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
index 109e57bc81..4495e3dd70 100644
--- a/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
+++ b/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -22,7 +22,7 @@ Pydantic 團隊自 **Python 3.14** 起,已停止在最新的 Python 版本中
## 官方指南 { #official-guide }
-Pydantic 提供從 v1 遷移到 v2 的官方遷移指南。
+Pydantic 提供從 v1 遷移到 v2 的官方[遷移指南](https://docs.pydantic.dev/latest/migration/)。
其中包含變更內容、驗證如何更正確且更嚴格、可能的注意事項等。
@@ -30,7 +30,7 @@ Pydantic 提供從 v1 遷移到 v2 的官方`bump-pydantic`。
+你可以使用 Pydantic 團隊提供的 [`bump-pydantic`](https://github.com/pydantic/bump-pydantic)。
這個工具會自動修改大部分需要變更的程式碼。
diff --git a/docs/zh-hant/docs/how-to/testing-database.md b/docs/zh-hant/docs/how-to/testing-database.md
index cbaecc2389..cf1ed9d36a 100644
--- a/docs/zh-hant/docs/how-to/testing-database.md
+++ b/docs/zh-hant/docs/how-to/testing-database.md
@@ -1,7 +1,7 @@
# 測試資料庫 { #testing-a-database }
-你可以在 SQLModel 文件 中學習關於資料庫、SQL 與 SQLModel。 🤓
+你可以在 [SQLModel 文件](https://sqlmodel.tiangolo.com/) 中學習關於資料庫、SQL 與 SQLModel。 🤓
-有一個迷你 將 SQLModel 與 FastAPI 搭配使用的教學。 ✨
+有一個迷你 [將 SQLModel 與 FastAPI 搭配使用的教學](https://sqlmodel.tiangolo.com/tutorial/fastapi/)。 ✨
-該教學包含一節介紹 測試 SQL 資料庫。 😎
+該教學包含一節介紹 [測試 SQL 資料庫](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/)。 😎