From dcc952d6990c507956669e6fc5cddba0530c79d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 15 Jan 2024 11:32:16 +0100 Subject: [PATCH 001/222] =?UTF-8?q?=E2=9C=A8=20=20Include=20HTTP=20205=20i?= =?UTF-8?q?n=20status=20codes=20with=20no=20body=20(#10969)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 0019c2153..53b2fa0c3 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -53,7 +53,7 @@ def is_body_allowed_for_status_code(status_code: Union[int, str, None]) -> bool: }: return True current_status_code = int(status_code) - return not (current_status_code < 200 or current_status_code in {204, 304}) + return not (current_status_code < 200 or current_status_code in {204, 205, 304}) def get_path_param_names(path: str) -> Set[str]: From 69dc735fc2339f8b39a9f1b01ced7974df9c4a65 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 10:32:42 +0000 Subject: [PATCH 002/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5e02e2352..7b09977e7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,10 @@ hide: * ✏ Fix Pydantic method name in `docs/en/docs/advanced/path-operation-advanced-configuration.md`. PR [#10826](https://github.com/tiangolo/fastapi/pull/10826) by [@ahmedabdou14](https://github.com/ahmedabdou14). +### Features + +* ✹ Include HTTP 205 in status codes with no body. PR [#10969](https://github.com/tiangolo/fastapi/pull/10969) by [@tiangolo](https://github.com/tiangolo). + ### Refactors * ✅ Refactor tests for duplicate operation ID generation for compatibility with other tools running the FastAPI test suite. PR [#10876](https://github.com/tiangolo/fastapi/pull/10876) by [@emmettbutler](https://github.com/emmettbutler). From 63e5396a78a470c39558a37d1fefbbe1bcbf4db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 15 Jan 2024 16:13:48 +0100 Subject: [PATCH 003/222] =?UTF-8?q?=F0=9F=91=B7=20Add=20changes-requested?= =?UTF-8?q?=20handling=20in=20GitHub=20Action=20issue=20manager=20(#10971)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/issue-manager.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml index bb967fa11..d1aad28fd 100644 --- a/.github/workflows/issue-manager.yml +++ b/.github/workflows/issue-manager.yml @@ -31,5 +31,9 @@ jobs: "answered": { "delay": 864000, "message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs." + }, + "changes-requested": { + "delay": 2628000, + "message": "As this PR had requested changes to be applied but has been inactive for a while, it's now going to be closed. But if there's anyone interested, feel free to create a new PR." } } From 2b6f12a5d00717f40b1fa0fa5e882fe021862559 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:14:34 +0000 Subject: [PATCH 004/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7b09977e7..c7ef17d65 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -50,6 +50,7 @@ hide: ### Internal +* 👷 Add changes-requested handling in GitHub Action issue manager. PR [#10971](https://github.com/tiangolo/fastapi/pull/10971) by [@tiangolo](https://github.com/tiangolo). * 🔧 Group dependencies on dependabot updates. PR [#10952](https://github.com/tiangolo/fastapi/pull/10952) by [@Kludex](https://github.com/Kludex). * ⬆ Bump actions/setup-python from 4 to 5. PR [#10764](https://github.com/tiangolo/fastapi/pull/10764) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.8.10 to 1.8.11. PR [#10731](https://github.com/tiangolo/fastapi/pull/10731) by [@dependabot[bot]](https://github.com/apps/dependabot). From cf01195555ea0111a9540bccc1444b9d802587da Mon Sep 17 00:00:00 2001 From: Pedro Augusto de Paula Barbosa Date: Mon, 15 Jan 2024 12:17:34 -0300 Subject: [PATCH 005/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20`HTTPException`?= =?UTF-8?q?=20details=20in=20`docs/en/docs/tutorial/handling-errors.md`=20?= =?UTF-8?q?(#5418)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/en/docs/tutorial/handling-errors.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/en/docs/tutorial/handling-errors.md b/docs/en/docs/tutorial/handling-errors.md index a03029e81..7d521696d 100644 --- a/docs/en/docs/tutorial/handling-errors.md +++ b/docs/en/docs/tutorial/handling-errors.md @@ -234,9 +234,7 @@ You will receive a response telling you that the data is invalid containing the And **FastAPI**'s `HTTPException` error class inherits from Starlette's `HTTPException` error class. -The only difference, is that **FastAPI**'s `HTTPException` allows you to add headers to be included in the response. - -This is needed/used internally for OAuth 2.0 and some security utilities. +The only difference is that **FastAPI**'s `HTTPException` accepts any JSON-able data for the `detail` field, while Starlette's `HTTPException` only accepts strings for it. So, you can keep raising **FastAPI**'s `HTTPException` as normally in your code. From 32ae9497233a9dc859a17f642c6b9bca0260f9ca Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:17:54 +0000 Subject: [PATCH 006/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c7ef17d65..771d286a1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Update `HTTPException` details in `docs/en/docs/tutorial/handling-errors.md`. PR [#5418](https://github.com/tiangolo/fastapi/pull/5418) by [@papb](https://github.com/papb). * ✏ A few tweaks in `docs/de/docs/tutorial/first-steps.md`. PR [#10959](https://github.com/tiangolo/fastapi/pull/10959) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix link in `docs/en/docs/advanced/async-tests.md`. PR [#10960](https://github.com/tiangolo/fastapi/pull/10960) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix typos for Spanish documentation. PR [#10957](https://github.com/tiangolo/fastapi/pull/10957) by [@jlopezlira](https://github.com/jlopezlira). From 15429a9c395df0378aa58fdee00c9b63a7a40358 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:33:28 +0900 Subject: [PATCH 007/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/body-fields.md`=20(#1923)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/body-fields.md | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/ja/docs/tutorial/body-fields.md diff --git a/docs/ja/docs/tutorial/body-fields.md b/docs/ja/docs/tutorial/body-fields.md new file mode 100644 index 000000000..8f01e8216 --- /dev/null +++ b/docs/ja/docs/tutorial/body-fields.md @@ -0,0 +1,48 @@ +# ボディ - フィヌルド + +`Query`や`Path`、`Body`を䜿っお *path operation関数* のパラメヌタに远加のバリデヌションやメタデヌタを宣蚀するのず同じように、Pydanticの`Field`を䜿っおPydanticモデルの内郚でバリデヌションやメタデヌタを宣蚀するこずができたす。 + +## `Field`のむンポヌト + +たず、以䞋のようにむンポヌトしたす: + +```Python hl_lines="4" +{!../../../docs_src/body_fields/tutorial001.py!} +``` + +!!! warning "泚意" + `Field`は他の党おのもの`Query`、`Path`、`Body`などずは違い、`fastapi`からではなく、`pydantic`から盎接むンポヌトされおいるこずに泚意しおください。 + +## モデルの属性の宣蚀 + +以䞋のように`Field`をモデルの属性ずしお䜿甚するこずができたす: + +```Python hl_lines="11 12 13 14" +{!../../../docs_src/body_fields/tutorial001.py!} +``` + +`Field`は`Query`や`Path`、`Body`ず同じように動䜜し、党く同様のパラメヌタなどを持ちたす。 + +!!! note "技術詳现" + 実際には次に芋る`Query`や`Path`などは、共通の`Param`クラスのサブクラスのオブゞェクトを䜜成したすが、それ自䜓はPydanticの`FieldInfo`クラスのサブクラスです。 + + たた、Pydanticの`Field`は`FieldInfo`のむンスタンスも返したす。 + + `Body`は`FieldInfo`のサブクラスのオブゞェクトを盎接返すこずもできたす。そしお、他にも`Body`クラスのサブクラスであるものがありたす。 + + `fastapi`から`Query`や`Path`などをむンポヌトする堎合、これらは実際には特殊なクラスを返す関数であるこずに泚意しおください。 + +!!! tip "豆知識" + 型、デフォルト倀、`Field`を持぀各モデルの属性が、`Path`や`Query`、`Body`の代わりに`Field`を持぀、*path operation 関数の*パラメヌタず同じ構造になっおいるこずに泚目しおください。 + +## 远加情報の远加 + +远加情報は`Field`や`Query`、`Body`などで宣蚀するこずができたす。そしおそれは生成されたJSONスキヌマに含たれたす。 + +埌に䟋を甚いお宣蚀を孊ぶ際に、远加情報を句悪方法を孊べたす。 + +## たずめ + +Pydanticの`Field`を䜿甚しお、モデルの属性に远加のバリデヌションやメタデヌタを宣蚀するこずができたす。 + +远加のキヌワヌド匕数を䜿甚しお、远加のJSONスキヌマのメタデヌタを枡すこずもできたす。 From 467ab2a5756245cc53a8c0ec4fd467ffbef7d347 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:33:51 +0000 Subject: [PATCH 008/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 771d286a1..2d73401ef 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-fields.md`. PR [#1923](https://github.com/tiangolo/fastapi/pull/1923) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add German translation for `docs/de/docs/tutorial/index.md`. PR [#9502](https://github.com/tiangolo/fastapi/pull/9502) by [@fhabers21](https://github.com/fhabers21). * 🌐 Add German translation for `docs/de/docs/tutorial/background-tasks.md`. PR [#10566](https://github.com/tiangolo/fastapi/pull/10566) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix typo in `docs/ru/docs/index.md`. PR [#10672](https://github.com/tiangolo/fastapi/pull/10672) by [@Delitel-WEB](https://github.com/Delitel-WEB). From 88f19be7c38b1c904d453dff3f0f1f97ebdcaec7 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:34:57 +0900 Subject: [PATCH 009/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/body-nested-models.md`=20(#?= =?UTF-8?q?1930)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/body-nested-models.md | 244 ++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 docs/ja/docs/tutorial/body-nested-models.md diff --git a/docs/ja/docs/tutorial/body-nested-models.md b/docs/ja/docs/tutorial/body-nested-models.md new file mode 100644 index 000000000..7f916c47a --- /dev/null +++ b/docs/ja/docs/tutorial/body-nested-models.md @@ -0,0 +1,244 @@ +# ボディ - ネストされたモデル + +**FastAPI** を䜿甚するず、深くネストされた任意のモデルを定矩、怜蚌、文曞化、䜿甚するこずができたすPydanticのおかげです。 + +## リストのフィヌルド + +属性をサブタむプずしお定矩するこずができたす。䟋えば、Pythonの`list`は以䞋のように定矩できたす: + +```Python hl_lines="12" +{!../../../docs_src/body_nested_models/tutorial001.py!} +``` + +これにより、各項目の型は宣蚀されおいたせんが、`tags`はある項目のリストになりたす。 + +## タむプパラメヌタを持぀リストのフィヌルド + +しかし、Pythonには型や「タむプパラメヌタ」を䜿っおリストを宣蚀する方法がありたす: + +### typingの`List`をむンポヌト + +たず、Pythonの暙準の`typing`モゞュヌルから`List`をむンポヌトしたす: + +```Python hl_lines="1" +{!../../../docs_src/body_nested_models/tutorial002.py!} +``` + +### タむプパラメヌタを持぀`List`の宣蚀 + +`list`や`dict`、`tuple`のようなタむプパラメヌタ内郚の型を持぀型を宣蚀するには: + +* `typing`モゞュヌルからそれらをむンストヌルしたす。 +* 角括匧`[`ず`]`を䜿っお「タむプパラメヌタ」ずしお内郚の型を枡したす: + +```Python +from typing import List + +my_list: List[str] +``` + +型宣蚀の暙準的なPythonの構文はこれだけです。 + +内郚の型を持぀モデルの属性にも同じ暙準の構文を䜿甚しおください。 + +そのため、以䞋の䟋では`tags`を具䜓的な「文字列のリスト」にするこずができたす: + +```Python hl_lines="14" +{!../../../docs_src/body_nested_models/tutorial002.py!} +``` + +## セット型 + +しかし、よく考えおみるず、タグは繰り返すべきではなく、おそらくナニヌクな文字列になるのではないかず気付いたずしたす。 + +そしお、Pythonにはナニヌクな項目のセットのための特別なデヌタ型`set`がありたす。 + +そのため、以䞋のように、`Set`をむンポヌトしお`str`の`set`ずしお`tags`を宣蚀するこずができたす: + +```Python hl_lines="1 14" +{!../../../docs_src/body_nested_models/tutorial003.py!} +``` + +これを䜿えば、デヌタが重耇しおいるリク゚ストを受けた堎合でも、ナニヌクな項目のセットに倉換されたす。 + +そしお、そのデヌタを出力するず、たずえ゜ヌスに重耇があったずしおも、固有の項目のセットずしお出力されたす。 + +たた、それに応じお泚釈を぀けたり、文曞化したりしたす。 + +## ネストされたモデル + +Pydanticモデルの各属性には型がありたす。 + +しかし、その型はそれ自䜓が別のPydanticモデルである可胜性がありたす。 + +そのため、特定の属性名、型、バリデヌションを指定しお、深くネストしたJSON`object`を宣蚀するこずができたす。 + +すべおは、任意のネストにされおいたす。 + +### サブモデルの定矩 + +䟋えば、`Image`モデルを定矩するこずができたす: + +```Python hl_lines="9 10 11" +{!../../../docs_src/body_nested_models/tutorial004.py!} +``` + +### サブモデルを型ずしお䜿甚 + +そしお、それを属性の型ずしお䜿甚するこずができたす: + +```Python hl_lines="20" +{!../../../docs_src/body_nested_models/tutorial004.py!} +``` + +これは **FastAPI** が以䞋のようなボディを期埅するこずを意味したす: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": ["rock", "metal", "bar"], + "image": { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + } +} +``` + +繰り返しになりたすが、**FastAPI** を䜿甚しお、その宣蚀を行うだけで以䞋のような恩恵を受けられたす: + +* ネストされたモデルでも察応可胜な゚ディタのサポヌト補完など +* デヌタ倉換 +* デヌタの怜蚌 +* 自動文曞化 + +## 特殊な型ずバリデヌション + +`str`や`int`、`float`のような通垞の単数型の他にも、`str`を継承したより耇雑な単数型を䜿うこずもできたす。 + +すべおのオプションをみるには、Pydanticの゚キゟチック な型のドキュメントを確認しおください。次の章でいく぀かの䟋をみるこずができたす。 + +䟋えば、`Image`モデルのように`url`フィヌルドがある堎合、`str`の代わりにPydanticの`HttpUrl`を指定するこずができたす: + +```Python hl_lines="4 10" +{!../../../docs_src/body_nested_models/tutorial005.py!} +``` + +文字列は有効なURLであるこずが確認され、そのようにJSONスキヌマ・OpenAPIで文曞化されたす。 + +## サブモデルのリストを持぀属性 + +Pydanticモデルを`list`や`set`などのサブタむプずしお䜿甚するこずもできたす: + +```Python hl_lines="20" +{!../../../docs_src/body_nested_models/tutorial006.py!} +``` + +これは、次のようなJSONボディを期埅したす倉換、怜蚌、ドキュメントなど: + +```JSON hl_lines="11" +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": [ + "rock", + "metal", + "bar" + ], + "images": [ + { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + }, + { + "url": "http://example.com/dave.jpg", + "name": "The Baz" + } + ] +} +``` + +!!! info "情報" + `images`キヌが画像オブゞェクトのリストを持぀ようになったこずに泚目しおください。 + +## 深くネストされたモデル + +深くネストされた任意のモデルを定矩するこずができたす: + +```Python hl_lines="9 14 20 23 27" +{!../../../docs_src/body_nested_models/tutorial007.py!} +``` + +!!! info "情報" + `Offer`は`Item`のリストであり、オプションの`Image`のリストを持っおいるこずに泚目しおください。 + +## 玔粋なリストのボディ + +期埅するJSONボディのトップレベルの倀がJSON`array`Pythonの`list`であれば、Pydanticモデルず同じように、関数のパラメヌタで型を宣蚀するこずができたす: + +```Python +images: List[Image] +``` + +以䞋のように: + +```Python hl_lines="15" +{!../../../docs_src/body_nested_models/tutorial008.py!} +``` + +## あらゆる堎所での゚ディタサポヌト + +゚ディタのサポヌトもどこでも受けるこずができたす。 + +以䞋のようにリストの䞭の項目でも: + + + +Pydanticモデルではなく、`dict`を盎接䜿甚しおいる堎合はこのような゚ディタのサポヌトは埗られたせん。 + +しかし、それらに぀いお心配する必芁はありたせん。入力された蟞曞は自動的に倉換され、出力も自動的にJSONに倉換されたす。 + +## 任意の`dict`のボディ + +たた、ある型のキヌず別の型の倀を持぀`dict`ずしおボディを宣蚀するこずもできたす。 + +有効なフィヌルド・属性名を事前に知る必芁がありたせんPydanticモデルの堎合のように。 + +これは、ただ知らないキヌを受け取りたいずきに䟿利だず思いたす。 + +--- + +他にも、`int`のように他の型のキヌを持ちたい堎合などに䟿利です。 + +それをここで芋おいきたしょう。 + +この堎合、`int`のキヌず`float`の倀を持぀ものであれば、どんな`dict`でも受け入れるこずができたす: + +```Python hl_lines="15" +{!../../../docs_src/body_nested_models/tutorial009.py!} +``` + +!!! tip "豆知識" + JSONはキヌずしお`str`しかサポヌトしおいないこずに泚意しおください。 + + しかしPydanticには自動デヌタ倉換機胜がありたす。 + + これは、APIクラむアントがキヌずしお文字列しか送信できなくおも、それらの文字列に玔粋な敎数が含たれおいる限り、Pydanticが倉換しお怜蚌するこずを意味したす。 + + そしお、`weights`ずしお受け取る`dict`は、実際には`int`のキヌず`float`の倀を持぀こずになりたす。 + +## たずめ + +**FastAPI** を䜿甚するず、Pydanticモデルが提䟛する最倧限の柔軟性を持ちながら、コヌドをシンプルに短く、゚レガントに保぀こずができたす。 + +以䞋のような利点がありたす: + +* ゚ディタのサポヌトどこでも補完 +* デヌタ倉換別名構文解析・シリアラむズ +* デヌタの怜蚌 +* スキヌマ文曞 +* 自動文曞化 From 2619bbd7cde8251e955512f560dc632a96f72fe8 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:35:25 +0900 Subject: [PATCH 010/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20tranlsa?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/schema-extra-example.md`=20?= =?UTF-8?q?(#1931)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/schema-extra-example.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/ja/docs/tutorial/schema-extra-example.md diff --git a/docs/ja/docs/tutorial/schema-extra-example.md b/docs/ja/docs/tutorial/schema-extra-example.md new file mode 100644 index 000000000..3102a4936 --- /dev/null +++ b/docs/ja/docs/tutorial/schema-extra-example.md @@ -0,0 +1,58 @@ +# スキヌマの远加 - 䟋 + +JSON Schemaに远加する情報を定矩するこずができたす。 + +䞀般的なナヌスケヌスはこのドキュメントで瀺されおいるように`example`を远加するこずです。 + +JSON Schemaの远加情報を宣蚀する方法はいく぀かありたす。 + +## Pydanticの`schema_extra` + +Pydanticのドキュメント: スキヌマのカスタマむズで説明されおいるように、`Config`ず`schema_extra`を䜿っおPydanticモデルの䟋を宣蚀するこずができたす: + +```Python hl_lines="15 16 17 18 19 20 21 22 23" +{!../../../docs_src/schema_extra_example/tutorial001.py!} +``` + +その远加情報はそのたた出力され、JSON Schemaに远加されたす。 + +## `Field`の远加匕数 + +埌述する`Field`、`Path`、`Query`、`Body`などでは、任意の匕数を関数に枡すこずでJSON Schemaの远加情報を宣蚀するこずもできたす: + +```Python hl_lines="4 10 11 12 13" +{!../../../docs_src/schema_extra_example/tutorial002.py!} +``` + +!!! warning "泚意" + これらの远加匕数が枡されおも、文曞化のためのバリデヌションは远加されず、泚釈だけが远加されるこずを芚えおおいおください。 + +## `Body`の远加匕数 + +远加情報を`Field`に枡すのず同じように、`Path`、`Query`、`Body`などでも同じこずができたす。 + +䟋えば、`Body`にボディリク゚ストの`example`を枡すこずができたす: + +```Python hl_lines="21 22 23 24 25 26" +{!../../../docs_src/schema_extra_example/tutorial003.py!} +``` + +## ドキュメントのUIの䟋 + +䞊蚘のいずれの方法でも、`/docs`の䞭では以䞋のようになりたす: + + + +## 技術詳现 + +`example` ず `examples`に぀いお... + +JSON Schemaの最新バヌゞョンでは`examples`ずいうフィヌルドを定矩しおいたすが、OpenAPIは`examples`を持たない叀いバヌゞョンのJSON Schemaをベヌスにしおいたす。 + +そのため、OpenAPIでは同じ目的のために`example`を独自に定矩しおおり`examples`ではなく`example`ずしお、それがdocs UISwagger UIを䜿甚で䜿甚されおいたす。 + +぀たり、`example`はJSON Schemaの䞀郚ではありたせんが、OpenAPIの䞀郚であり、それがdocs UIで䜿甚されるこずになりたす。 + +## その他の情報 + +同じように、フロント゚ンドのナヌザヌむンタヌフェヌスなどをカスタマむズするために、各モデルのJSON Schemaに远加される独自の远加情報を远加するこずができたす。 From 79dbb11867f5217e090d3b498d91d9566be2fd95 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:35:41 +0000 Subject: [PATCH 011/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2d73401ef..0b820dce1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-nested-models.md`. PR [#1930](https://github.com/tiangolo/fastapi/pull/1930) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-fields.md`. PR [#1923](https://github.com/tiangolo/fastapi/pull/1923) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add German translation for `docs/de/docs/tutorial/index.md`. PR [#9502](https://github.com/tiangolo/fastapi/pull/9502) by [@fhabers21](https://github.com/fhabers21). * 🌐 Add German translation for `docs/de/docs/tutorial/background-tasks.md`. PR [#10566](https://github.com/tiangolo/fastapi/pull/10566) by [@nilslindemann](https://github.com/nilslindemann). From c238292b44340f55df15ea48eb324288b922e85a Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:36:32 +0900 Subject: [PATCH 012/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/extra-models.md`=20(#1941)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/extra-models.md | 195 ++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 docs/ja/docs/tutorial/extra-models.md diff --git a/docs/ja/docs/tutorial/extra-models.md b/docs/ja/docs/tutorial/extra-models.md new file mode 100644 index 000000000..aa2e5ffdc --- /dev/null +++ b/docs/ja/docs/tutorial/extra-models.md @@ -0,0 +1,195 @@ +# モデル - より詳しく + +先ほどの䟋に続き、耇数の関連モデルを持぀こずが䞀般的です。 + +これはナヌザヌモデルの堎合は特にそうです。なぜなら: + +* **入力モデル** にはパスワヌドが必芁です。 +* **出力モデル**はパスワヌドをも぀べきではありたせん。 +* **デヌタベヌスモデル**はおそらくハッシュ化されたパスワヌドが必芁になるでしょう。 + +!!! danger "危険" + ナヌザヌの平文のパスワヌドは絶察に保存しないでください。垞に認蚌に利甚可胜な「安党なハッシュ」を保存しおください。 + + 知らない方は、[セキュリティの章](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}で「パスワヌドハッシュ」ずは䜕かを孊ぶこずができたす。 + +## 耇数のモデル + +ここでは、パスワヌドフィヌルドをも぀モデルがどのように芋えるのか、たた、どこで䜿われるのか、倧たかなむメヌゞを玹介したす: + +```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41" +{!../../../docs_src/extra_models/tutorial001.py!} +``` + +### `**user_in.dict()`に぀いお + +#### Pydanticの`.dict()` + +`user_in`は`UserIn`クラスのPydanticモデルです。 + +Pydanticモデルには、モデルのデヌタを含む`dict`を返す`.dict()`メ゜ッドがありたす。 + +そこで、以䞋のようなPydanticオブゞェクト`user_in`を䜜成するず: + +```Python +user_in = UserIn(username="john", password="secret", email="john.doe@example.com") +``` + +そしお呌び出すず: + +```Python +user_dict = user_in.dict() +``` + +これで倉数`user_dict`のデヌタを持぀`dict`ができたした。これはPydanticモデルのオブゞェクトの代わりに`dict`です。 + +そしお呌び出すず: + +```Python +print(user_dict) +``` + +以䞋のようなPythonの`dict`を埗るこずができたす: + +```Python +{ + 'username': 'john', + 'password': 'secret', + 'email': 'john.doe@example.com', + 'full_name': None, +} +``` + +#### `dict`の展開 + +`user_dict`のような`dict`を受け取り、それを`**user_dict`を持぀関数たたはクラスに枡すず、Pythonはそれを「展開」したす。これは`user_dict`のキヌず倀を盎接キヌ・バリュヌの匕数ずしお枡したす。 + +そこで䞊述の`user_dict`の続きを以䞋のように曞くず: + +```Python +UserInDB(**user_dict) +``` + +以䞋ず同等の結果になりたす: + +```Python +UserInDB( + username="john", + password="secret", + email="john.doe@example.com", + full_name=None, +) +``` + +もっず正確に蚀えば、`user_dict`を将来的にどんな内容であっおも盎接䜿甚するこずになりたす: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], +) +``` + +#### 別のモデルから぀くるPydanticモデル + +䞊述の䟋では`user_in.dict()`から`user_dict`をこのコヌドのように取埗しおいたすが: + +```Python +user_dict = user_in.dict() +UserInDB(**user_dict) +``` + +これは以䞋ず同等です: + +```Python +UserInDB(**user_in.dict()) +``` + +...なぜなら`user_in.dict()`は`dict`であり、`**`を付䞎しお`UserInDB`を枡しおPythonに「展開」させおいるからです。 + +そこで、別のPydanticモデルのデヌタからPydanticモデルを取埗したす。 + +#### `dict`の展開ず远加匕数 + +そしお、远加のキヌワヌド匕数`hashed_password=hashed_password`を以䞋のように远加するず: + +```Python +UserInDB(**user_in.dict(), hashed_password=hashed_password) +``` + +...以䞋のようになりたす: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], + hashed_password = hashed_password, +) +``` + +!!! warning "泚意" + サポヌトしおいる远加機胜は、デヌタの可胜な流れをデモするだけであり、もちろん本圓のセキュリティを提䟛しおいるわけではありたせん。 + +## 重耇の削枛 + +コヌドの重耇を枛らすこずは、**FastAPI**の䞭栞的なアむデアの぀です。 + +コヌドの重耇が増えるず、バグやセキュリティの問題、コヌドの非同期化問題ある堎所では曎新しおも他の堎所では曎新されない堎合などが発生する可胜性が高くなりたす。 + +そしお、これらのモデルは党おのデヌタを共有し、属性名や型を重耇させおいたす。 + +もっず良い方法がありたす。 + +他のモデルのベヌスずなる`UserBase`モデルを宣蚀するこずができたす。そしお、そのモデルの属性型宣蚀、怜蚌などを継承するサブクラスを䜜るこずができたす。 + +デヌタの倉換、怜蚌、文曞化などはすべお通垞通りに動䜜したす。 + +このようにしお、モデル間の違いだけを宣蚀するこずができたす: + +```Python hl_lines="9 15 16 19 20 23 24" +{!../../../docs_src/extra_models/tutorial002.py!} +``` + +## `Union`たたは`anyOf` + +レスポンスを぀の型の`Union`ずしお宣蚀するこずができたす。 + +OpenAPIでは`anyOf`で定矩されたす。 + +そのためには、暙準的なPythonの型ヒント`typing.Union`を䜿甚したす: + +```Python hl_lines="1 14 15 18 19 20 33" +{!../../../docs_src/extra_models/tutorial003.py!} +``` + +## モデルのリスト + +同じように、オブゞェクトのリストのレスポンスを宣蚀するこずができたす。 + +そのためには、暙準のPythonの`typing.List`を䜿甚する: + +```Python hl_lines="1 20" +{!../../../docs_src/extra_models/tutorial004.py!} +``` + +## 任意の`dict`を持぀レスポンス + +たた、Pydanticモデルを䜿甚せずに、キヌず倀の型だけを定矩した任意の`dict`を䜿っおレスポンスを宣蚀するこずもできたす。 + +これは、有効なフィヌルド・属性名Pydanticモデルに必芁なものを事前に知らない堎合に䟿利です。 + +この堎合、`typing.Dict`を䜿甚するこずができたす: + +```Python hl_lines="1 8" +{!../../../docs_src/extra_models/tutorial005.py!} +``` + +## たずめ + +耇数のPydanticモデルを䜿甚し、ケヌスごずに自由に継承したす。 + +゚ンティティが異なる「状態」を持たなければならない堎合は、゚ンティティごずに単䞀のデヌタモデルを持぀必芁はありたせん。`password` や `password_hash` やパスワヌドなしなどのいく぀かの「状態」をも぀ナヌザヌ「゚ンティティ」の堎合の様にすれば良いです。 From f386011d64e68c63f397834eda1c937b660f0d75 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:38:18 +0000 Subject: [PATCH 013/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0b820dce1..bca167cd1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese tranlsation for `docs/ja/docs/tutorial/schema-extra-example.md`. PR [#1931](https://github.com/tiangolo/fastapi/pull/1931) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-nested-models.md`. PR [#1930](https://github.com/tiangolo/fastapi/pull/1930) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-fields.md`. PR [#1923](https://github.com/tiangolo/fastapi/pull/1923) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add German translation for `docs/de/docs/tutorial/index.md`. PR [#9502](https://github.com/tiangolo/fastapi/pull/9502) by [@fhabers21](https://github.com/fhabers21). From 17511f776891d6bbdaac2a6ba7157b24259210a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:38:58 +0000 Subject: [PATCH 014/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index bca167cd1..33caa2ac7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-models.md`. PR [#1941](https://github.com/tiangolo/fastapi/pull/1941) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese tranlsation for `docs/ja/docs/tutorial/schema-extra-example.md`. PR [#1931](https://github.com/tiangolo/fastapi/pull/1931) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-nested-models.md`. PR [#1930](https://github.com/tiangolo/fastapi/pull/1930) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-fields.md`. PR [#1923](https://github.com/tiangolo/fastapi/pull/1923) by [@SwftAlpc](https://github.com/SwftAlpc). From 88225ae231731ff266f964f3bf5818a4397db223 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:42:08 +0900 Subject: [PATCH 015/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/response-status-code.md`=20?= =?UTF-8?q?(#1942)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/response-status-code.md | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs/ja/docs/tutorial/response-status-code.md diff --git a/docs/ja/docs/tutorial/response-status-code.md b/docs/ja/docs/tutorial/response-status-code.md new file mode 100644 index 000000000..ead2addda --- /dev/null +++ b/docs/ja/docs/tutorial/response-status-code.md @@ -0,0 +1,89 @@ +# レスポンスステヌタスコヌド + +レスポンスモデルを指定するのず同じ方法で、レスポンスに䜿甚されるHTTPステヌタスコヌドを以䞋の*path operations*のいずれかの`status_code`パラメヌタで宣蚀するこずもできたす。 + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* など。 + +```Python hl_lines="6" +{!../../../docs_src/response_status_code/tutorial001.py!} +``` + +!!! note "備考" + `status_code`は「デコレヌタ」メ゜ッド`get`、`post`などのパラメヌタであるこずに泚意しおください。すべおのパラメヌタやボディのように、*path operation関数*のものではありたせん。 + +`status_code`パラメヌタはHTTPステヌタスコヌドを含む数倀を受け取りたす。 + +!!! info "情報" + `status_code`は代わりに、Pythonの`http.HTTPStatus`のように、`IntEnum`を受け取るこずもできたす。 + +これは: + +* レスポンスでステヌタスコヌドを返したす。 +* OpenAPIスキヌマおよびナヌザヌむンタヌフェヌスに以䞋のように文曞化したす: + + + +!!! note "備考" + いく぀かのレスポンスコヌド次のセクションを参照は、レスポンスにボディがないこずを瀺しおいたす。 + + FastAPIはこれを知っおいお、レスポンスボディがないずいうOpenAPIドキュメントを生成したす。 + +## HTTPステヌタスコヌドに぀いお + +!!! note "備考" + すでにHTTPステヌタスコヌドが䜕であるかを知っおいる堎合は、次のセクションにスキップしおください。 + +HTTPでは、レスポンスの䞀郚ずしお桁の数字のステヌタスコヌドを送信したす。 + +これらのステヌタスコヌドは、それらを認識するために関連付けられた名前を持っおいたすが、重芁な郚分は番号です。 + +぀たり: + +* `100`以䞊は「情報」のためのものです。。盎接䜿うこずはほずんどありたせん。これらのステヌタスコヌドを持぀レスポンスはボディを持぀こずができたせん。 +* **`200`** 以䞊は「成功」のレスポンスのためのものです。これらは最も利甚するであろうものです。 + * `200`はデフォルトのステヌタスコヌドで、すべおが「OK」であったこずを意味したす。 + * 別の䟋ずしおは、`201`Createdがありたす。これはデヌタベヌスに新しいレコヌドを䜜成した埌によく䜿甚されたす。 + * 特殊なケヌスずしお、`204`No Contentがありたす。このレスポンスはクラむアントに返すコンテンツがない堎合に䜿甚されたす。そしおこのレスポンスはボディを持぀こずはできたせん。 +* **`300`** 以䞊は「リダむレクト」のためのものです。これらのステヌタスコヌドを持぀レスポンスは`304`Not Modifiedを陀き、ボディを持぀こずも持たないこずもできたす。 +* **`400`** 以䞊は「クラむアント゚ラヌ」のレスポンスのためのものです。これらは、おそらく最も倚甚するであろう番目のタむプです。 + * 䟋えば、`404`は「Not Found」レスポンスです。 + * クラむアントからの䞀般的な゚ラヌに぀いおは、`400`を䜿甚するこずができたす。 +* `500`以䞊はサヌバヌ゚ラヌのためのものです。これらを盎接䜿うこずはほずんどありたせん。アプリケヌションコヌドやサヌバヌのどこかで䜕か問題が発生した堎合、これらのステヌタスコヌドのいずれかが自動的に返されたす。 + +!!! tip "豆知識" + それぞれのステヌタスコヌドずどのコヌドが䜕のためのコヌドなのかに぀いお詳现はMDN HTTP レスポンスステヌタスコヌドに぀いおのドキュメントを参照しおください。 + +## 名前を芚えるための近道 + +先ほどの䟋をもう䞀床芋おみたしょう: + +```Python hl_lines="6" +{!../../../docs_src/response_status_code/tutorial001.py!} +``` + +`201`は「䜜成完了」のためのステヌタスコヌドです。 + +しかし、それぞれのコヌドの意味を暗蚘する必芁はありたせん。 + +`fastapi.status`の䟿利な倉数を利甚するこずができたす。 + +```Python hl_lines="1 6" +{!../../../docs_src/response_status_code/tutorial002.py!} +``` + +それらは䟿利です。それらは同じ番号を保持しおおり、その方法でぱディタの自動補完を䜿甚しおそれらを芋぀けるこずができたす。 + + + +!!! note "技術詳现" + たた、`from starlette import status`を䜿うこずもできたす。 + + **FastAPI** は、`開発者の利䟿性を考慮しお、fastapi.status`ず同じ`starlette.status`を提䟛しおいたす。しかし、これはStarletteから盎接提䟛されおいたす。 + +## デフォルトの倉曎 + +埌に、[高床なナヌザヌガむド](../advanced/response-change-status-code.md){.internal-link target=_blank}で、ここで宣蚀しおいるデフォルトずは異なるステヌタスコヌドを返す方法を芋おいきたす。 From 217bff20cabbd47dfef43394bae72f807a44e9a7 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:43:45 +0900 Subject: [PATCH 016/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/handling-errors.md`=20(#195?= =?UTF-8?q?3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/handling-errors.md | 265 +++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 docs/ja/docs/tutorial/handling-errors.md diff --git a/docs/ja/docs/tutorial/handling-errors.md b/docs/ja/docs/tutorial/handling-errors.md new file mode 100644 index 000000000..ec36e9880 --- /dev/null +++ b/docs/ja/docs/tutorial/handling-errors.md @@ -0,0 +1,265 @@ +# ゚ラヌハンドリング + +APIを䜿甚しおいるクラむアントに゚ラヌを通知する必芁がある状況はたくさんありたす。 + +このクラむアントは、フロント゚ンドを持぀ブラりザ、誰かのコヌド、IoTデバむスなどが考えられたす。 + +クラむアントに以䞋のようなこずを䌝える必芁があるかもしれたせん: + +* クラむアントにはその操䜜のための十分な暩限がありたせん。 +* クラむアントはそのリ゜ヌスにアクセスできたせん。 +* クラむアントがアクセスしようずしおいた項目が存圚したせん。 +* など + +これらの堎合、通垞は **400**400から499の範囲内の **HTTPステヌタスコヌド** を返すこずになりたす。 + +これは200のHTTPステヌタスコヌド200から299に䌌おいたす。これらの「200」ステヌタスコヌドは、䜕らかの圢でリク゚スト「成功」であったこずを意味したす。 + +400の範囲にあるステヌタスコヌドは、クラむアントからの゚ラヌがあったこずを意味したす。 + +**"404 Not Found"** の゚ラヌおよびゞョヌクを芚えおいたすか + +## `HTTPException`の䜿甚 + +HTTPレスポンスを゚ラヌでクラむアントに返すには、`HTTPException`を䜿甚したす。 + +### `HTTPException`のむンポヌト + +```Python hl_lines="1" +{!../../../docs_src/handling_errors/tutorial001.py!} +``` + +### コヌド内での`HTTPException`の発生 + +`HTTPException`は通垞のPythonの䟋倖であり、APIに関連するデヌタを远加したものです。 + +Pythonの䟋倖なので、`return`ではなく、`raise`です。 + +これはたた、*path operation関数*の内郚で呌び出しおいるナヌティリティ関数の内郚から`HTTPException`を発生させた堎合、*path operation関数*の残りのコヌドは実行されず、そのリク゚ストを盎ちに終了させ、`HTTPException`からのHTTP゚ラヌをクラむアントに送信するこずを意味したす。 + +倀を返す`return`よりも䟋倖を発生させるこずの利点は、「䟝存関係ずセキュリティ」のセクションでより明確になりたす。 + +この䟋では、クラむアントが存圚しないIDでアむテムを芁求した堎合、`404`のステヌタスコヌドを持぀䟋倖を発生させたす: + +```Python hl_lines="11" +{!../../../docs_src/handling_errors/tutorial001.py!} +``` + +### レスポンス結果 + +クラむアントが`http://example.com/items/foo``item_id` `"foo"`をリク゚ストするず、HTTPステヌタスコヌドが200で、以䞋のJSONレスポンスが返されたす: + +```JSON +{ + "item": "The Foo Wrestlers" +} +``` + +しかし、クラむアントが`http://example.com/items/bar`存圚しない`item_id` `"bar"`をリク゚ストした堎合、HTTPステヌタスコヌド404"not found"゚ラヌず以䞋のJSONレスポンスが返されたす: + +```JSON +{ + "detail": "Item not found" +} +``` + +!!! tip "豆知識" + `HTTPException`を発生させる際には、`str`だけでなく、JSONに倉換できる任意の倀を`detail`パラメヌタずしお枡すこずができたす。 + + `dist`や`list`などを枡すこずができたす。 + + これらは **FastAPI** によっお自動的に凊理され、JSONに倉換されたす。 + +## カスタムヘッダヌの远加 + +䟋えば、いく぀かのタむプのセキュリティのために、HTTP゚ラヌにカスタムヘッダを远加できるず䟿利な状況がいく぀かありたす。 + +おそらくコヌドの䞭で盎接䜿甚する必芁はないでしょう。 + +しかし、高床なシナリオのために必芁な堎合には、カスタムヘッダヌを远加するこずができたす: + +```Python hl_lines="14" +{!../../../docs_src/handling_errors/tutorial002.py!} +``` + +## カスタム䟋倖ハンドラのむンストヌル + +カスタム䟋倖ハンドラはStarletteず同じ䟋倖ナヌティリティを䜿甚しお远加するこずができたす。 + +あなたたたは䜿甚しおいるラむブラリが`raise`するかもしれないカスタム䟋倖`UnicornException`があるずしたしょう。 + +そしお、この䟋倖をFastAPIでグロヌバルに凊理したいず思いたす。 + +カスタム䟋倖ハンドラを`@app.exception_handler()`で远加するこずができたす: + +```Python hl_lines="5 6 7 13 14 15 16 17 18 24" +{!../../../docs_src/handling_errors/tutorial003.py!} +``` + +ここで、`/unicorns/yolo`をリク゚ストするず、*path operation*は`UnicornException`を`raise`したす。 + +しかし、これは`unicorn_exception_handler`で凊理されたす。 + +そのため、HTTPステヌタスコヌドが`418`で、JSONの内容が以䞋のような明確な゚ラヌを受け取るこずになりたす: + +```JSON +{"message": "Oops! yolo did something. There goes a rainbow..."} +``` + +!!! note "技術詳现" + たた、`from starlette.requests import Request`ず`from starlette.responses import JSONResponse`を䜿甚するこずもできたす。 + + **FastAPI** は開発者の利䟿性を考慮しお、`fastapi.responses`ず同じ`starlette.responses`を提䟛しおいたす。しかし、利甚可胜なレスポンスのほずんどはStarletteから盎接提䟛されたす。これは`Request`ず同じです。 + +## デフォルトの䟋倖ハンドラのオヌバヌラむド + +**FastAPI** にはいく぀かのデフォルトの䟋倖ハンドラがありたす。 + +これらのハンドラは、`HTTPException`を`raise`させた堎合や、リク゚ストに無効なデヌタが含たれおいる堎合にデフォルトのJSONレスポンスを返す圹割を担っおいたす。 + +これらの䟋倖ハンドラを独自のものでオヌバヌラむドするこずができたす。 + +### リク゚スト怜蚌の䟋倖のオヌバヌラむド + +リク゚ストに無効なデヌタが含たれおいる堎合、**FastAPI** は内郚的に`RequestValidationError`を発生させたす。 + +たた、そのためのデフォルトの䟋倖ハンドラも含たれおいたす。 + +これをオヌバヌラむドするには`RequestValidationError`をむンポヌトしお`@app.exception_handler(RequestValidationError)`ず䞀緒に䜿甚しお䟋倖ハンドラをデコレヌトしたす。 + +この䟋倖ハンドラは`Requset`ず䟋倖を受け取りたす。 + +```Python hl_lines="2 14 15 16" +{!../../../docs_src/handling_errors/tutorial004.py!} +``` + +これで、`/items/foo`にアクセスするず、デフォルトのJSON゚ラヌの代わりに以䞋が返されたす: + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +以䞋のようなテキスト版を取埗したす: + +``` +1 validation error +path -> item_id + value is not a valid integer (type=type_error.integer) +``` + +#### `RequestValidationError`ず`ValidationError` + +!!! warning "泚意" + これらは今のあなたにずっお重芁でない堎合は省略しおも良い技術的な詳现です。 + +`RequestValidationError`はPydanticの`ValidationError`のサブクラスです。 + +**FastAPI** は`response_model`でPydanticモデルを䜿甚しおいお、デヌタに゚ラヌがあった堎合、ログに゚ラヌが衚瀺されるようにこれを䜿甚しおいたす。 + +しかし、クラむアントやナヌザヌはそれを芋るこずはありたせん。その代わりに、クラむアントはHTTPステヌタスコヌド`500`の「Internal Server Error」を受け取りたす。 + +*レスポンス*やコヌドのどこかクラむアントの*リク゚スト*ではなくにPydanticの`ValidationError`がある堎合、それは実際にはコヌドのバグなのでこのようにすべきです。 + +たた、あなたがそれを修正しおいる間は、セキュリティの脆匱性が露呈する堎合があるため、クラむアントやナヌザヌが゚ラヌに関する内郚情報にアクセスできないようにしおください。 + +### ゚ラヌハンドラ`HTTPException`のオヌバヌラむド + +同様に、`HTTPException`ハンドラをオヌバヌラむドするこずもできたす。 + +䟋えば、これらの゚ラヌに察しおは、JSONではなくプレヌンテキストを返すようにするこずができたす: + +```Python hl_lines="3 4 9 10 11 22" +{!../../../docs_src/handling_errors/tutorial004.py!} +``` + +!!! note "技術詳现" + たた、`from starlette.responses import PlainTextResponse`を䜿甚するこずもできたす。 + + **FastAPI** は開発者の利䟿性を考慮しお、`fastapi.responses`ず同じ`starlette.responses`を提䟛しおいたす。しかし、利甚可胜なレスポンスのほずんどはStarletteから盎接提䟛されたす。 + +### `RequestValidationError`のボディの䜿甚 + +`RequestValidationError`には無効なデヌタを含む`body`が含たれおいたす。 + +アプリ開発䞭に本䜓のログを取っおデバッグしたり、ナヌザヌに返したりなどに䜿甚するこずができたす。 + +```Python hl_lines="14" +{!../../../docs_src/handling_errors/tutorial005.py!} +``` + +ここで、以䞋のような無効な項目を送信しおみおください: + +```JSON +{ + "title": "towel", + "size": "XL" +} +``` + +受信したボディを含むデヌタが無効であるこずを瀺すレスポンスが衚瀺されたす: + +```JSON hl_lines="12 13 14 15" +{ + "detail": [ + { + "loc": [ + "body", + "size" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ], + "body": { + "title": "towel", + "size": "XL" + } +} +``` + +#### FastAPIの`HTTPException`ずStarletteの`HTTPException` + +**FastAPI**は独自の`HTTPException`を持っおいたす。 + +たた、 **FastAPI**の゚ラヌクラス`HTTPException`はStarletteの゚ラヌクラス`HTTPException`を継承しおいたす。 + +唯䞀の違いは、**FastAPI** の`HTTPException`はレスポンスに含たれるヘッダを远加できるこずです。 + +これはOAuth 2.0ずいく぀かのセキュリティナヌティリティのために内郚的に必芁ずされ、䜿甚されおいたす。 + +そのため、コヌド内では通垞通り **FastAPI** の`HTTPException`を発生させ続けるこずができたす。 + +しかし、䟋倖ハンドラを登録する際には、Starletteの`HTTPException`を登録しおおく必芁がありたす。 + +これにより、Starletteの内郚コヌドやStarletteの拡匵機胜やプラグむンの䞀郚が`HTTPException`を発生させた堎合、ハンドラがそれをキャッチしお凊理するこずができるようになりたす。 + +以䞋の䟋では、同じコヌド内で䞡方の`HTTPException`を䜿甚できるようにするために、Starletteの䟋倖の名前を`StarletteHTTPException`に倉曎しおいたす: + +```Python +from starlette.exceptions import HTTPException as StarletteHTTPException +``` + +### **FastAPI** の䟋倖ハンドラの再利甚 + +たた、䜕らかの方法で䟋倖を䜿甚するこずもできたすが、**FastAPI** から同じデフォルトの䟋倖ハンドラを䜿甚するこずもできたす。 + +デフォルトの䟋倖ハンドラを`fastapi.exception_handlers`からむンポヌトしお再利甚するこずができたす: + +```Python hl_lines="2 3 4 5 15 21" +{!../../../docs_src/handling_errors/tutorial006.py!} +``` + +この䟋では、非垞に衚珟力のあるメッセヌゞで゚ラヌを`print`しおいたす。 + +しかし、䟋倖を䜿甚しお、デフォルトの䟋倖ハンドラを再利甚するこずができるずいうこずが理解できたす。 From efac3a293fecc06a4cbb933f829877cc914a95f1 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:45:27 +0900 Subject: [PATCH 017/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/python-types.md`=20(#1899)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/python-types.md | 315 +++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 docs/ja/docs/python-types.md diff --git a/docs/ja/docs/python-types.md b/docs/ja/docs/python-types.md new file mode 100644 index 000000000..bbfef2adf --- /dev/null +++ b/docs/ja/docs/python-types.md @@ -0,0 +1,315 @@ +# Pythonの型の玹介 + +**Python 3.6以降** では「型ヒント」オプションがサポヌトされおいたす。 + +これらの **"型ヒント"** は倉数の型を宣蚀するこずができる新しい構文です。Python 3.6以降 + +倉数に型を宣蚀するこずで゚ディタヌやツヌルがより良いサポヌトを提䟛するこずができたす。 + +ここではPythonの型ヒントに぀いおの **クむックチュヌトリアル/リフレッシュ** で、**FastAPI**でそれらを䜿甚するために必芁な最䜎限のこずだけをカバヌしおいたす。...実際には本圓に少ないです。 + +**FastAPI** はすべおこれらの型ヒントに基づいおおり、倚くの匷みず利点を䞎えおくれたす。 + +しかしたずえたったく **FastAPI** を䜿甚しない堎合でも、それらに぀いお少し孊ぶこずで利点を埗るこずができるでしょう。 + +!!! note "備考" + もしあなたがPythonの専門家で、すでに型ヒントに぀いおすべお知っおいるのであれば、次の章たで読み飛ばしおください。 + +## 動機 + +簡単な䟋から始めおみたしょう: + +```Python +{!../../../docs_src/python_types/tutorial001.py!} +``` + +このプログラムを実行するず以䞋が出力されたす: + +``` +John Doe +``` + +この関数は以䞋のようなこずを行いたす: + +* `first_name`ず`last_name`を取埗したす。 +* `title()`を甚いお、それぞれの最初の文字を倧文字に倉換したす。 +* 真ん䞭にスペヌスを入れお連結したす。 + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial001.py!} +``` + +### 線集 + +これはずおも簡単なプログラムです。 + +しかし、今、あなたがそれを䞀から曞いおいたず想像しおみおください。 + +パラメヌタの準備ができおいたら、そのずき、関数の定矩を始めおいたこずでしょう... + +しかし、そうするず「最初の文字を倧文字に倉換するあのメ゜ッド」を呌び出す必芁がありたす。 + +それは`upper`でしたか`uppercase`でしたかそれずも`first_uppercase`たたは`capitalize` + +そしお、叀くからプログラマヌの友人である゚ディタで自動補完を詊しおみたす。 + +関数の最初のパラメヌタ`first_name`を入力し、ドット(`.`)を入力しおから、`Ctrl+Space`を抌すず補完が実行されたす。 + +しかし、悲しいこずに、これはなんの圹にも立ちたせん: + + + +### 型の远加 + +先ほどのコヌドから䞀行倉曎しおみたしょう。 + +以䞋の関数のパラメヌタ郚分を: + +```Python + first_name, last_name +``` + +以䞋ぞ倉曎したす: + +```Python + first_name: str, last_name: str +``` + +これだけです。 + +それが「型ヒント」です: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial002.py!} +``` + +これは、以䞋のようにデフォルト倀を宣蚀するのず同じではありたせん: + +```Python + first_name="john", last_name="doe" +``` + +それずは別物です。 + +むコヌル`=`ではなく、コロン`:`を䜿甚したす。 + +そしお、通垞、型ヒントを远加しおも、それらがない状態ず起こるこずは䜕も倉わりたせん。 + +しかし今、あなたが再びその関数を䜜成しおいる最䞭に、型ヒントを䜿っおいるず想像しおみお䞋さい。 + +同じタむミングで`Ctrl+Space`で自動補完を実行するず、以䞋のようになりたす: + + + +これであれば、あなたは「ベルを鳎らす」䞀぀を芋぀けるたで、オプションを芋お、スクロヌルするこずができたす: + + + +## より匷い動機 + +この関数を芋おください。すでに型ヒントを持っおいたす: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial003.py!} +``` + +゚ディタは倉数の型を知っおいるので、補完だけでなく、゚ラヌチェックをするこずもできたす。 + + + +これで`age`を`str(age)`で文字列に倉換しお修正する必芁があるこずがわかりたす: + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial004.py!} +``` + +## 型の宣蚀 + +関数のパラメヌタずしお、型ヒントを宣蚀しおいる䞻な堎所を確認したした。 + +これは **FastAPI** で䜿甚する䞻な堎所でもありたす。 + +### 単玔な型 + +`str`だけでなく、Pythonの暙準的な型すべおを宣蚀するこずができたす。 + +䟋えば、以䞋を䜿甚可胜です: + +* `int` +* `float` +* `bool` +* `bytes` + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial005.py!} +``` + +### 型パラメヌタを持぀ゞェネリック型 + +デヌタ構造の䞭には、`dict`、`list`、`set`、そしお`tuple`のように他の倀を含むこずができるものがありたす。たた内郚の倀も独自の型を持぀こずができたす。 + +これらの型や内郚の型を宣蚀するには、Pythonの暙準モゞュヌル`typing`を䜿甚したす。 + +これらの型ヒントをサポヌトするために特別に存圚しおいたす。 + +#### `List` + +䟋えば、`str`の`list`の倉数を定矩しおみたしょう。 + +`typing`から`List`をむンポヌトしたす倧文字の`L`を含む: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +同じようにコロン`:`の構文で倉数を宣蚀したす。 + +型ずしお、`List`を入力したす。 + +リストはいく぀かの内郚の型を含む型なので、それらを角括匧で囲んでいたす。 + +```Python hl_lines="4" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +!!! tip "豆知識" + 角括匧内の内郚の型は「型パラメヌタ」ず呌ばれおいたす。 + + この堎合、`str`は`List`に枡される型パラメヌタです。 + +぀たり: 倉数`items`は`list`であり、このリストの各項目は`str`です。 + +そうするこずで、゚ディタはリストの項目を凊理しおいる間にもサポヌトを提䟛できたす。 + + + +タむプがなければ、それはほが䞍可胜です。 + +倉数`item`はリスト`items`の芁玠の䞀぀であるこずに泚意しおください。 + +それでも、゚ディタはそれが`str`であるこずを知っおいお、そのためのサポヌトを提䟛しおいたす。 + +#### `Tuple` ず `Set` + +`tuple`ず`set`の宣蚀も同様です: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial007.py!} +``` + +぀たり: + +* 倉数`items_t`は`int`、`int`、`str`の3぀の項目を持぀`tuple`です + +* 倉数`items_s`はそれぞれの項目が`bytes`型である`set`です。 + +#### `Dict` + +`dict`を宣蚀するためには、カンマ区切りで2぀の型パラメヌタを枡したす。 + +最初の型パラメヌタは`dict`のキヌです。 + +番目の型パラメヌタは`dict`の倀です。 + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial008.py!} +``` + +぀たり: + +* 倉数`prices`は`dict`であり: + * この`dict`のキヌは`str`型です。぀たり、各項目の名前 + * この`dict`の倀は`float`型です。぀たり、各項目の䟡栌 + +#### `Optional` + +たた、`Optional`を䜿甚しお、倉数が`str`のような型を持぀こずを宣蚀するこずもできたすが、それは「オプション」であり、`None`にするこずもできたす。 + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009.py!} +``` + +ただの`str`の代わりに`Optional[str]`を䜿甚するこずで、゚ディタは倀が垞に`str`であるず仮定しおいる堎合に実際には`None`である可胜性がある゚ラヌを怜出するのに圹立ちたす。 + +#### ゞェネリック型 + +以䞋のように角括匧で型パラメヌタを取る型を: + +* `List` +* `Tuple` +* `Set` +* `Dict` +* `Optional` +* ...など + +**ゞェネリック型** たたは **ゞェネリクス** ず呌びたす。 + +### 型ずしおのクラス + +倉数の型ずしおクラスを宣蚀するこずもできたす。 + +䟋えば、`Person`クラスずいう名前のクラスがあるずしたしょう: + +```Python hl_lines="1 2 3" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +倉数の型を`Person`ずしお宣蚀するこずができたす: + +```Python hl_lines="6" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +そしお、再び、すべおの゚ディタのサポヌトを埗るこずができたす: + + + +## Pydanticのモデル + +Pydantic はデヌタ怜蚌を行うためのPythonラむブラリです。 + +デヌタの「圢」を属性付きのクラスずしお宣蚀したす。 + +そしお、それぞれの属性は型を持ちたす。 + +さらに、いく぀かの倀を持぀クラスのむンスタンスを䜜成するず、その倀を怜蚌し、適切な型に倉換しおもしそうであれば党おのデヌタを持぀オブゞェクトを提䟛しおくれたす。 + +たた、その結果のオブゞェクトですべおの゚ディタのサポヌトを受けるこずができたす。 + +Pydanticの公匏ドキュメントから匕甚: + +```Python +{!../../../docs_src/python_types/tutorial011.py!} +``` + +!!! info "情報" + Pydanticに぀いおより孊びたい方はドキュメントを参照しおください. + +**FastAPI** はすべおPydanticをベヌスにしおいたす。 + +すべおのこずは[チュヌトリアル - ナヌザヌガむド](tutorial/index.md){.internal-link target=_blank}で実際に芋るこずができたす。 + +## **FastAPI**での型ヒント + +**FastAPI** はこれらの型ヒントを利甚しおいく぀かのこずを行いたす。 + +**FastAPI** では型ヒントを䜿っお型パラメヌタを宣蚀するず以䞋のものが埗られたす: + +* **゚ディタサポヌト**. +* **型チェック**. + +...そしお **FastAPI** は同じように宣蚀をするず、以䞋のこずを行いたす: + +* **芁件の定矩**: リク゚ストパスパラメヌタ、ク゚リパラメヌタ、ヘッダヌ、ボディ、䟝存関係などから芁件を定矩したす。 +* **デヌタの倉換**: リク゚ストのデヌタを必芁な型に倉換したす。 +* **デヌタの怜蚌**: リク゚ストごずに: + * デヌタが無効な堎合にクラむアントに返される **自動゚ラヌ** を生成したす。 +* **ドキュメント** OpenAPIを䜿甚したAPI: + * 自動的に察話型ドキュメントのナヌザヌむンタヌフェむスで䜿甚されたす。 + +すべおが抜象的に聞こえるかもしれたせん。心配しないでください。 この党おの動䜜は [チュヌトリアル - ナヌザヌガむド](tutorial/index.md){.internal-link target=_blank}で芋るこずができたす。 + +重芁なのは、Pythonの暙準的な型を䜿うこずで、クラスやデコレヌタなどを远加するのではなく぀の堎所で **FastAPI** が倚くの䜜業を代わりにやっおくれおいるずいうこずです。 + +!!! info "情報" + すでにすべおのチュヌトリアルを終えお、型に぀いおの詳现を芋るためにこのペヌゞに戻っおきた堎合は、`mypy`のチヌトシヌトを参照しおください From b21599bab0a7ab38102c9e42364d1e224ad07fe3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:46:12 +0000 Subject: [PATCH 018/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 33caa2ac7..997d8b5aa 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-status-code.md`. PR [#1942](https://github.com/tiangolo/fastapi/pull/1942) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-models.md`. PR [#1941](https://github.com/tiangolo/fastapi/pull/1941) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese tranlsation for `docs/ja/docs/tutorial/schema-extra-example.md`. PR [#1931](https://github.com/tiangolo/fastapi/pull/1931) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-nested-models.md`. PR [#1930](https://github.com/tiangolo/fastapi/pull/1930) by [@SwftAlpc](https://github.com/SwftAlpc). From b73de83ca2edb35122624c4ec6db4120cf5e4496 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:46:32 +0900 Subject: [PATCH 019/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/path-params-numeric-validat?= =?UTF-8?q?ions.md`=20(#1902)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../path-params-numeric-validations.md | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 docs/ja/docs/tutorial/path-params-numeric-validations.md diff --git a/docs/ja/docs/tutorial/path-params-numeric-validations.md b/docs/ja/docs/tutorial/path-params-numeric-validations.md new file mode 100644 index 000000000..551aeabb3 --- /dev/null +++ b/docs/ja/docs/tutorial/path-params-numeric-validations.md @@ -0,0 +1,122 @@ +# パスパラメヌタず数倀の怜蚌 + +ク゚リパラメヌタに察しお`Query`でより倚くのバリデヌションずメタデヌタを宣蚀できるのず同じように、パスパラメヌタに察しおも`Path`で同じ皮類のバリデヌションずメタデヌタを宣蚀するこずができたす。 + +## Pathのむンポヌト + +たず初めに、`fastapi`から`Path`をむンポヌトしたす: + +```Python hl_lines="1" +{!../../../docs_src/path_params_numeric_validations/tutorial001.py!} +``` + +## メタデヌタの宣蚀 + +パラメヌタは`Query`ず同じものを宣蚀するこずができたす。 + +䟋えば、パスパラメヌタ`item_id`に察しお`title`のメタデヌタを宣蚀するには以䞋のようにしたす: + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial001.py!} +``` + +!!! note "備考" + パスの䞀郚でなければならないので、パスパラメヌタは垞に必須です。 + + そのため、`...`を䜿甚しお必須ず瀺す必芁がありたす。 + + それでも、`None`で宣蚀しおも、デフォルト倀を蚭定しおも、䜕の圱響もなく、垞に必芁ずされおいるこずに倉わりはありたせん。 + +## 必芁に応じおパラメヌタを䞊び替える + +ク゚リパラメヌタ`q`を必須の`str`ずしお宣蚀したいずしたしょう。 + +たた、このパラメヌタには䜕も宣蚀する必芁がないので、`Query`を䜿う必芁はありたせん。 + +しかし、パスパラメヌタ`item_id`のために`Path`を䜿甚する必芁がありたす。 + +Pythonは「デフォルト」を持たない倀の前に「デフォルト」を持぀倀を眮くこずができたせん。 + +しかし、それらを䞊び替えるこずができ、デフォルト倀を持たない倀ク゚リパラメヌタ`q`を最初に持぀こずができたす。 + +**FastAPI**では関係ありたせん。パラメヌタは名前、型、デフォルトの宣蚀`Query`、`Path`などで怜出され、順番は気にしたせん。 + +そのため、以䞋のように関数を宣蚀するこずができたす: + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial002.py!} +``` + +## 必芁に応じおパラメヌタを䞊び替えるトリック + +ク゚リパラメヌタ`q`を`Query`やデフォルト倀なしで宣蚀し、パスパラメヌタ`item_id`を`Path`を甚いお宣蚀し、それらを別の順番に䞊びたい堎合、Pythonには少し特殊な構文が甚意されおいたす。 + +関数の最初のパラメヌタずしお`*`を枡したす。 + +Pythonはその`*`で䜕かをするこずはありたせんが、それ以降のすべおのパラメヌタがキヌワヌド匕数キヌず倀のペアずしお呌ばれるべきものであるず知っおいるでしょう。それはkwargsずしおも知られおいたす。たずえデフォルト倀がなくおも。 + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial003.py!} +``` + +## 数倀の怜蚌: 以䞊 + +`Query`ず`Path`、そしお埌述する他のものを甚いお、文字列の制玄を宣蚀するこずができたすが、数倀の制玄も同様に宣蚀できたす。 + +ここで、`ge=1`の堎合、`item_id`は`1`「より倧きい`g`か、同じ`e`」敎数でなれけばなりたせん。 + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial004.py!} +``` + +## 数倀の怜蚌: より倧きいず小なりむコヌル + +以䞋も同様です: + +* `gt`: より倧きい`g`reater `t`han +* `le`: 小なりむコヌル`l`ess than or `e`qual + +```Python hl_lines="9" +{!../../../docs_src/path_params_numeric_validations/tutorial005.py!} +``` + +## 数倀の怜蚌: 浮動小数点、 倧なり小なり + +数倀のバリデヌションは`float`の倀に察しおも有効です。 + +ここで重芁になっおくるのはgtだけでなくgeも宣蚀できるこずです。これず同様に、䟋えば、倀が`1`より小さくおも`0`より倧きくなければならないこずを芁求するこずができたす。 + +したがっお、`0.5`は有効な倀ですが、`0.0`や`0`はそうではありたせん。 + +これはltも同じです。 + +```Python hl_lines="11" +{!../../../docs_src/path_params_numeric_validations/tutorial006.py!} +``` + +## たずめ + +`Query`ず`Path`そしおただ芋たこずない他のものでは、[ク゚リパラメヌタず文字列の怜蚌](query-params-str-validations.md){.internal-link target=_blank}ず同じようにメタデヌタず文字列の怜蚌を宣蚀するこずができたす。 + +たた、数倀のバリデヌションを宣蚀するこずもできたす: + +* `gt`: より倧きい`g`reater `t`han +* `ge`: 以䞊`g`reater than or `e`qual +* `lt`: より小さい`l`ess `t`han +* `le`: 以䞋`l`ess than or `e`qual + +!!! info "情報" + `Query`、`Path`などは埌に共通の`Param`クラスのサブクラスを芋るこずになりたす。䜿う必芁はありたせん + + そしお、それらすべおは、これたで芋おきた远加のバリデヌションずメタデヌタず同じパラメヌタを共有しおいたす。 + +!!! note "技術詳现" + `fastapi`から`Query`、`Path`などをむンポヌトするず、これらは実際には関数です。 + + 呌び出されるず、同じ名前のクラスのむンスタンスを返したす。 + + そのため、関数である`Query`をむンポヌトし、それを呌び出すず、`Query`ずいう名前のクラスのむンスタンスが返されたす。 + + これらの関数はクラスを盎接䜿うのではなく゚ディタが型に぀いお゚ラヌずしないようにするために存圚したす。 + + この方法によっお、これらの゚ラヌを無芖するための蚭定を远加するこずなく、通垞の゚ディタやコヌディングツヌルを䜿甚するこずができたす。 From eed57df6f685b73e3ac0a01060ed2eb81d71fa92 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:46:53 +0000 Subject: [PATCH 020/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 997d8b5aa..68b2f0a07 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/handling-errors.md`. PR [#1953](https://github.com/tiangolo/fastapi/pull/1953) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-status-code.md`. PR [#1942](https://github.com/tiangolo/fastapi/pull/1942) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-models.md`. PR [#1941](https://github.com/tiangolo/fastapi/pull/1941) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese tranlsation for `docs/ja/docs/tutorial/schema-extra-example.md`. PR [#1931](https://github.com/tiangolo/fastapi/pull/1931) by [@SwftAlpc](https://github.com/SwftAlpc). From a14907a47d723a21c46b06d73bf568a2643657e4 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 00:48:41 +0900 Subject: [PATCH 021/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/body-multiple-params.md`=20?= =?UTF-8?q?(#1903)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/body-multiple-params.md | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 docs/ja/docs/tutorial/body-multiple-params.md diff --git a/docs/ja/docs/tutorial/body-multiple-params.md b/docs/ja/docs/tutorial/body-multiple-params.md new file mode 100644 index 000000000..2ba10c583 --- /dev/null +++ b/docs/ja/docs/tutorial/body-multiple-params.md @@ -0,0 +1,169 @@ +# ボディ - 耇数のパラメヌタ + +これたで`Path`ず`Query`をどう䜿うかを芋おきたしたが、リク゚ストボディの宣蚀のより高床な䜿い方を芋おみたしょう。 + +## `Path`、`Query`ずボディパラメヌタを混ぜる + +たず、もちろん、`Path`ず`Query`ずリク゚ストボディのパラメヌタの宣蚀は自由に混ぜるこずができ、 **FastAPI** は䜕をするべきかを知っおいたす。 + +たた、デフォルトの`None`を蚭定するこずで、ボディパラメヌタをオプションずしお宣蚀するこずもできたす: + +```Python hl_lines="19 20 21" +{!../../../docs_src/body_multiple_params/tutorial001.py!} +``` + +!!! note "備考" + この堎合、ボディから取埗する`item`はオプションであるこずに泚意しおください。デフォルト倀は`None`です。 + +## 耇数のボディパラメヌタ + +䞊述の䟋では、*path operations*は`item`の属性を持぀以䞋のようなJSONボディを期埅しおいたした: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +しかし、`item`ず`user`のように耇数のボディパラメヌタを宣蚀するこずもできたす: + +```Python hl_lines="22" +{!../../../docs_src/body_multiple_params/tutorial002.py!} +``` + +この堎合、**FastAPI**は関数内に耇数のボディパラメヌタPydanticモデルである぀のパラメヌタがあるこずに気付きたす。 + +そのため、パラメヌタ名をボディのキヌフィヌルド名ずしお䜿甚し、以䞋のようなボディを期埅しおいたす: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + } +} +``` + +!!! note "備考" + 以前ず同じように`item`が宣蚀されおいたにもかかわらず、`item`はキヌ`item`を持぀ボディの内郚にあるこずが期埅されおいるこずに泚意しおください。 + +**FastAPI** はリク゚ストから自動で倉換を行い、パラメヌタ`item`が特定の内容を受け取り、`user`も同じように特定の内容を受け取りたす。 + +耇合デヌタの怜蚌を行い、OpenAPIスキヌマや自動ドキュメントのように文曞化しおくれたす。 + +## ボディ内の単数倀 + +ク゚リずパスパラメヌタの远加デヌタを定矩するための `Query` ず `Path` があるのず同じように、 **FastAPI** は同等の `Body` を提䟛したす。 + +䟋えば、前のモデルを拡匵しお、同じボディに `item` ず `user` の他にもう䞀぀のキヌ `importance` を入れたいず決めるこずができたす。 + +単数倀なのでそのたた宣蚀するず、**FastAPI** はそれがク゚リパラメヌタであるずみなしたす。 + +しかし、`Body`を䜿甚しお、**FastAPI** に別のボディキヌずしお扱うように指瀺するこずができたす: + + +```Python hl_lines="23" +{!../../../docs_src/body_multiple_params/tutorial003.py!} +``` + +この堎合、**FastAPI** は以䞋のようなボディを期埅したす: + + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + }, + "importance": 5 +} +``` + +繰り返しになりたすが、デヌタ型の倉換、怜蚌、文曞化などを行いたす。 + +## 耇数のボディパラメヌタずク゚リ + +もちろん、ボディパラメヌタに加えお、必芁に応じお远加のク゚リパラメヌタを宣蚀するこずもできたす。 + +デフォルトでは、単数倀はク゚リパラメヌタずしお解釈されるので、明瀺的に `Query` を远加する必芁はありたせん。 + +```Python +q: str = None +``` + +以䞋においお: + +```Python hl_lines="27" +{!../../../docs_src/body_multiple_params/tutorial004.py!} +``` + +!!! info "情報" + `Body`もたた、埌述する `Query` や `Path` などず同様に、すべおの怜蚌パラメヌタずメタデヌタパラメヌタを持っおいたす。 + + +## 単䞀のボディパラメヌタの埋め蟌み + +Pydanticモデル`Item`のボディパラメヌタ`item`を1぀だけ持っおいるずしたしょう。 + +デフォルトでは、**FastAPI**はそのボディを盎接期埅したす。 + +しかし、远加のボディパラメヌタを宣蚀したずきのように、キヌ `item` を持぀ JSON ずその䞭のモデルの内容を期埅したい堎合は、特別な `Body` パラメヌタ `embed` を䜿うこずができたす: + +```Python +item: Item = Body(..., embed=True) +``` + +以䞋においお: + +```Python hl_lines="17" +{!../../../docs_src/body_multiple_params/tutorial005.py!} +``` + +この堎合、**FastAPI** は以䞋のようなボディを期埅したす: + +```JSON hl_lines="2" +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + } +} +``` + +以䞋の代わりに: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +## たずめ + +リク゚ストが単䞀のボディしか持おない堎合でも、*path operation関数*に耇数のボディパラメヌタを远加するこずができたす。 + +しかし、**FastAPI** はそれを凊理し、関数内の正しいデヌタを䞎え、*path operation*内の正しいスキヌマを怜蚌し、文曞化したす。 + +たた、ボディの䞀郚ずしお受け取る単数倀を宣蚀するこずもできたす。 + +たた、単䞀のパラメヌタしか宣蚀されおいない堎合でも、ボディをキヌに埋め蟌むように **FastAPI** に指瀺するこずができたす。 From 1cf1ee42fe6469b9120257b8be4a9f7bcb117177 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:48:57 +0000 Subject: [PATCH 022/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 68b2f0a07..ebe8e1719 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/python-types.md`. PR [#1899](https://github.com/tiangolo/fastapi/pull/1899) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/handling-errors.md`. PR [#1953](https://github.com/tiangolo/fastapi/pull/1953) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-status-code.md`. PR [#1942](https://github.com/tiangolo/fastapi/pull/1942) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-models.md`. PR [#1941](https://github.com/tiangolo/fastapi/pull/1941) by [@SwftAlpc](https://github.com/SwftAlpc). From 997281bf83d3a08716c044c7cf374103bd9fc575 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:51:30 +0000 Subject: [PATCH 023/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ebe8e1719..9ceee1fa0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-params-numeric-validations.md`. PR [#1902](https://github.com/tiangolo/fastapi/pull/1902) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/python-types.md`. PR [#1899](https://github.com/tiangolo/fastapi/pull/1899) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/handling-errors.md`. PR [#1953](https://github.com/tiangolo/fastapi/pull/1953) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-status-code.md`. PR [#1942](https://github.com/tiangolo/fastapi/pull/1942) by [@SwftAlpc](https://github.com/SwftAlpc). From bf9489c0ad54634c2ea6595d0e1cfdf97b1e1a6d Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 15:53:17 +0000 Subject: [PATCH 024/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9ceee1fa0..33cd064e9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-multiple-params.md`. PR [#1903](https://github.com/tiangolo/fastapi/pull/1903) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-params-numeric-validations.md`. PR [#1902](https://github.com/tiangolo/fastapi/pull/1902) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/python-types.md`. PR [#1899](https://github.com/tiangolo/fastapi/pull/1899) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/handling-errors.md`. PR [#1953](https://github.com/tiangolo/fastapi/pull/1953) by [@SwftAlpc](https://github.com/SwftAlpc). From 5c71522974e9dcec378165b64364b8c1deeecb16 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 01:01:54 +0900 Subject: [PATCH 025/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/response-model.md`=20(#1938?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: atsumi Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/response-model.md | 208 ++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 docs/ja/docs/tutorial/response-model.md diff --git a/docs/ja/docs/tutorial/response-model.md b/docs/ja/docs/tutorial/response-model.md new file mode 100644 index 000000000..749b33061 --- /dev/null +++ b/docs/ja/docs/tutorial/response-model.md @@ -0,0 +1,208 @@ +# レスポンスモデル + +*path operations* のいずれにおいおも、`response_model`パラメヌタを䜿甚しお、レスポンスのモデルを宣蚀するこずができたす: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* など。 + +```Python hl_lines="17" +{!../../../docs_src/response_model/tutorial001.py!} +``` + +!!! note "備考" + `response_model`は「デコレヌタ」メ゜ッド`get`、`post`などのパラメヌタであるこずに泚意しおください。すべおのパラメヌタやボディのように、*path operation関数* のパラメヌタではありたせん。 + +Pydanticモデルの属性に察しお宣蚀するのず同じ型を受け取るので、Pydanticモデルになるこずもできたすが、䟋えば、`List[Item]`のようなPydanticモデルの`list`になるこずもできたす。 + +FastAPIは`response_model`を䜿っお以䞋のこずをしたす: + +* 出力デヌタを型宣蚀に倉換したす。 +* デヌタを怜蚌したす。 +* OpenAPIの *path operation* で、レスポンス甚のJSON Schemaを远加したす。 +* 自動ドキュメントシステムで䜿甚されたす。 + +しかし、最も重芁なのは: + +* 出力デヌタをモデルのデヌタに限定したす。これがどのように重芁なのか以䞋で芋おいきたしょう。 + +!!! note "技術詳现" + レスポンスモデルは、関数の戻り倀のアノテヌションではなく、このパラメヌタで宣蚀されおいたす。なぜなら、パス関数は実際にはそのレスポンスモデルを返すのではなく、`dict`やデヌタベヌスオブゞェクト、あるいは他のモデルを返し、`response_model`を䜿甚しおフィヌルドの制限やシリアラむズを行うからです。 + +## 同じ入力デヌタの返华 + +ここでは`UserIn`モデルを宣蚀しおいたす。それには平文のパスワヌドが含たれおいたす: + +```Python hl_lines="9 11" +{!../../../docs_src/response_model/tutorial002.py!} +``` + +そしお、このモデルを䜿甚しお入力を宣蚀し、同じモデルを䜿っお出力を宣蚀しおいたす: + +```Python hl_lines="17 18" +{!../../../docs_src/response_model/tutorial002.py!} +``` + +これで、ブラりザがパスワヌドを䜿っおナヌザヌを䜜成する際に、APIがレスポンスで同じパスワヌドを返すようになりたした。 + +この堎合、ナヌザヌ自身がパスワヌドを送信しおいるので問題ないかもしれたせん。 + +しかし、同じモデルを別の*path operation*に䜿甚するず、すべおのクラむアントにナヌザヌのパスワヌドを送信しおしたうこずになりたす。 + +!!! danger "危険" + ナヌザヌの平文のパスワヌドを保存したり、レスポンスで送信したりするこずは絶察にしないでください。 + +## 出力モデルの远加 + +代わりに、平文のパスワヌドを持぀入力モデルず、パスワヌドを持たない出力モデルを䜜成するこずができたす: + +```Python hl_lines="9 11 16" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +ここでは、*path operation関数*がパスワヌドを含む同じ入力ナヌザヌを返しおいるにもかかわらず: + +```Python hl_lines="24" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +...`response_model`を`UserOut`ず宣蚀したこずで、パスワヌドが含たれおいたせん: + +```Python hl_lines="22" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +そのため、**FastAPI** は出力モデルで宣蚀されおいない党おのデヌタをフィルタリングしおくれたすPydanticを䜿甚。 + +## ドキュメントを芋る + +自動ドキュメントを芋るず、入力モデルず出力モデルがそれぞれ独自のJSON Schemaを持っおいるこずが確認できたす。 + + + +そしお、䞡方のモデルは、察話型のAPIドキュメントに䜿甚されたす: + + + +## レスポンスモデルの゚ンコヌディングパラメヌタ + +レスポンスモデルにはデフォルト倀を蚭定するこずができたす: + +```Python hl_lines="11 13 14" +{!../../../docs_src/response_model/tutorial004.py!} +``` + +* `description: str = None`は`None`がデフォルト倀です。 +* `tax: float = 10.5`は`10.5`がデフォルト倀です。 +* `tags: List[str] = []` は空のリスト`[]`がデフォルト倀です。 + +しかし、実際に保存されおいない堎合には結果からそれらを省略した方が良いかもしれたせん。 + +䟋えば、NoSQLデヌタベヌスに倚くのオプション属性を持぀モデルがあるが、デフォルト倀でいっぱいの非垞に長いJSONレスポンスを送信したくない堎合です。 + +### `response_model_exclude_unset`パラメヌタの䜿甚 + +*path operation デコレヌタ*に`response_model_exclude_unset=True`パラメヌタを蚭定するこずができたす: + +```Python hl_lines="24" +{!../../../docs_src/response_model/tutorial004.py!} +``` + +そしお、これらのデフォルト倀はレスポンスに含たれず、実際に蚭定された倀のみが含たれたす。 + +そのため、*path operation*にID`foo`が蚭定されたitemのリク゚ストを送るず、レスポンスは以䞋のようになりたすデフォルト倀を含たない: + +```JSON +{ + "name": "Foo", + "price": 50.2 +} +``` + +!!! info "情報" + FastAPIはこれをするために、Pydanticモデルの`.dict()`をその`exclude_unset`パラメヌタで䜿甚しおいたす。 + +!!! info "情報" + 以䞋も䜿甚するこずができたす: + + * `response_model_exclude_defaults=True` + * `response_model_exclude_none=True` + + `exclude_defaults`ず`exclude_none`に぀いおは、Pydanticのドキュメントで説明されおいる通りです。 + +#### デフォルト倀を持぀フィヌルドの倀を持぀デヌタ + +しかし、ID`bar`のitemのように、デフォルト倀が蚭定されおいるモデルのフィヌルドに倀が蚭定されおいる堎合: + +```Python hl_lines="3 5" +{ + "name": "Bar", + "description": "The bartenders", + "price": 62, + "tax": 20.2 +} +``` + +それらはレスポンスに含たれたす。 + +#### デフォルト倀ず同じ倀を持぀デヌタ + +ID`baz`のitemのようにデフォルト倀ず同じ倀を持぀デヌタの堎合: + +```Python hl_lines="3 5 6" +{ + "name": "Baz", + "description": None, + "price": 50.2, + "tax": 10.5, + "tags": [] +} +``` + +FastAPIは十分に賢いので実際には、Pydanticが十分に賢い`description`や`tax`、`tags`はデフォルト倀ず同じ倀を持っおいるにもかかわらず、明瀺的に蚭定されおいるこずを理解しおいたす。デフォルトから取埗するのではなく + +そのため、それらはJSONレスポンスに含たれるこずになりたす。 + +!!! tip "豆知識" + デフォルト倀は`None`だけでなく、なんでも良いこずに泚意しおください。 + 䟋えば、リスト`[]`や`10.5`の`float`などです。 + +### `response_model_include`ず`response_model_exclude` + +*path operationデコレヌタ*ずしお`response_model_include`ず`response_model_exclude`も䜿甚するこずができたす。 + +属性名を持぀`str`の`set`を受け取り、含める(残りを省略する)か、陀倖(残りを含む)したす。 + +これは、Pydanticモデルが぀しかなく、出力からいく぀かのデヌタを削陀したい堎合のクむックショヌトカットずしお䜿甚するこずができたす。 + +!!! tip "豆知識" + それでも、これらのパラメヌタではなく、耇数のクラスを䜿甚しお、䞊蚘のようなアむデアを䜿うこずをおすすめしたす。 + + これは`response_model_include`や`response_mode_exclude`を䜿甚しおいく぀かの属性を省略しおも、アプリケヌションのOpenAPIずドキュメントで生成されたJSON Schemaが完党なモデルになるからです。 + + 同様に動䜜する`response_model_by_alias`にも圓おはたりたす。 + +```Python hl_lines="31 37" +{!../../../docs_src/response_model/tutorial005.py!} +``` + +!!! tip "豆知識" + `{"name", "description"}`の構文はこれら぀の倀をも぀`set`を䜜成したす。 + + これは`set(["name", "description"])`ず同等です。 + +#### `set`の代わりに`list`を䜿甚する + +もし`set`を䜿甚するこずを忘れお、代わりに`list`や`tuple`を䜿甚しおも、FastAPIはそれを`set`に倉換しお正しく動䜜したす: + +```Python hl_lines="31 37" +{!../../../docs_src/response_model/tutorial006.py!} +``` + +## たずめ + +*path operationデコレヌタの*`response_model`パラメヌタを䜿甚しお、レスポンスモデルを定矩し、特にプラむベヌトデヌタがフィルタリングされおいるこずを保蚌したす。 + +明瀺的に蚭定された倀のみを返すには、`response_model_exclude_unset`を䜿甚したす。 From 39bb4bbdfc654eab57ce2bc57286c3ea2ca39c7d Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 01:08:16 +0900 Subject: [PATCH 026/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/dependencies/index.md`=20an?= =?UTF-8?q?d=20`docs/ja/docs/tutorial/dependencies/classes-as-dependencies?= =?UTF-8?q?.md`=20(#1958)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- .../dependencies/classes-as-dependencies.md | 191 ++++++++++++++++ docs/ja/docs/tutorial/dependencies/index.md | 209 ++++++++++++++++++ 2 files changed, 400 insertions(+) create mode 100644 docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md create mode 100644 docs/ja/docs/tutorial/dependencies/index.md diff --git a/docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md b/docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md new file mode 100644 index 000000000..5c150d00c --- /dev/null +++ b/docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md @@ -0,0 +1,191 @@ +# 䟝存関係ずしおのクラス + +**䟝存性泚入** システムを深く掘り䞋げる前に、先ほどの䟋をアップグレヌドしおみたしょう。 + +## 前の䟋の`dict` + +前の䟋では、䟝存関係"dependable"から`dict`を返しおいたした: + +```Python hl_lines="9" +{!../../../docs_src/dependencies/tutorial001.py!} +``` + +しかし、*path operation関数*のパラメヌタ`commons`に`dict`が含たれおいたす。 + +たた、゚ディタは`dict`のキヌず倀の型を知るこずができないため、倚くのサポヌト補完のようなを提䟛するこずができたせん。 + +もっずうたくやれるはずです...。 + +## 䟝存関係を䜜るもの + +これたでは、䟝存関係が関数ずしお宣蚀されおいるのを芋おきたした。 + +しかし、䟝存関係を定矩する方法はそれだけではありたせんその方が䞀般的かもしれたせんが。 + +重芁なのは、䟝存関係が「呌び出し可胜」なものであるこずです。 + +Pythonにおける「**呌び出し可胜**」ずは、Pythonが関数のように「呌び出す」こずができるものを指したす。 + +そのため、`something`オブゞェクト関数ではないかもしれたせんがを持っおいお、それを次のように「呌び出す」実行するこずができるずしたす: + +```Python +something() +``` + +たたは + +```Python +something(some_argument, some_keyword_argument="foo") +``` + +これを「呌び出し可胜」なものず呌びたす。 + +## 䟝存関係ずしおのクラス + +Pythonのクラスのむンスタンスを䜜成する際に、同じ構文を䜿甚しおいるこずに気づくかもしれたせん。 + +䟋えば: + +```Python +class Cat: + def __init__(self, name: str): + self.name = name + + +fluffy = Cat(name="Mr Fluffy") +``` + +この堎合、`fluffy`は`Cat`クラスのむンスタンスです。 + +そしお`fluffy`を䜜成するために、`Cat`を「呌び出しおいる」こずになりたす。 + +そのため、Pythonのクラスもたた「呌び出し可胜」です。 + +そしお、**FastAPI** では、Pythonのクラスを䟝存関係ずしお䜿甚するこずができたす。 + +FastAPIが実際にチェックしおいるのは、それが「呌び出し可胜」関数、クラス、その他なんでもであり、パラメヌタが定矩されおいるかどうかずいうこずです。 + +**FastAPI** の䟝存関係ずしお「呌び出し可胜なもの」を枡すず、その「呌び出し可胜なもの」のパラメヌタを解析し、サブ䟝存関係も含めお、*path operation関数*のパラメヌタず同じように凊理したす。 + +それは、パラメヌタが党くない呌び出し可胜なものにも適甚されたす。パラメヌタのない*path operation関数*ず同じように。 + +そこで、䞊で玹介した䟝存関係の`common_parameters`を`CommonQueryParams`クラスに倉曎したす: + +```Python hl_lines="11 12 13 14 15" +{!../../../docs_src/dependencies/tutorial002.py!} +``` + +クラスのむンスタンスを䜜成するために䜿甚される`__init__`メ゜ッドに泚目しおください: + +```Python hl_lines="12" +{!../../../docs_src/dependencies/tutorial002.py!} +``` + +...以前の`common_parameters`ず同じパラメヌタを持っおいたす: + +```Python hl_lines="8" +{!../../../docs_src/dependencies/tutorial001.py!} +``` + +これらのパラメヌタは **FastAPI** が䟝存関係を「解決」するために䜿甚するものです。 + +どちらの堎合も以䞋を持っおいたす: + +* オプショナルの`q`ク゚リパラメヌタ。 +* `skip`ク゚リパラメヌタ、デフォルトは`0`。 +* `limit`ク゚リパラメヌタ、デフォルトは`100`。 + +どちらの堎合も、デヌタは倉換され、怜蚌され、OpenAPIスキヌマなどで文曞化されたす。 + +## 䜿甚 + +これで、このクラスを䜿甚しお䟝存関係を宣蚀するこずができたす。 + +```Python hl_lines="19" +{!../../../docs_src/dependencies/tutorial002.py!} +``` + +**FastAPI** は`CommonQueryParams`クラスを呌び出したす。これにより、そのクラスの「むンスタンス」が䜜成され、むンスタンスはパラメヌタ`commons`ずしお関数に枡されたす。 + +## 型泚釈ず`Depends` + +䞊のコヌドでは`CommonQueryParams`を回曞いおいるこずに泚目しおください: + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +以䞋にある最埌の`CommonQueryParams`: + +```Python +... = Depends(CommonQueryParams) +``` + +...は、**FastAPI** が䟝存関係を知るために実際に䜿甚するものです。 + +そこからFastAPIが宣蚀されたパラメヌタを抜出し、それが実際にFastAPIが呌び出すものです。 + +--- + +この堎合、以䞋にある最初の`CommonQueryParams`: + +```Python +commons: CommonQueryParams ... +``` + +...は **FastAPI** に察しお特別な意味をもちたせん。FastAPIはデヌタ倉換や怜蚌などには䜿甚したせんそれらのためには`= Depends(CommonQueryParams)`を䜿甚しおいたす。 + +実際には以䞋のように曞けばいいだけです: + +```Python +commons = Depends(CommonQueryParams) +``` + +以䞋にあるように: + +```Python hl_lines="19" +{!../../../docs_src/dependencies/tutorial003.py!} +``` + +しかし、型を宣蚀するこずは掚奚されおいたす。そうすれば、゚ディタは`commons`のパラメヌタずしお䜕が枡されるかを知るこずができ、コヌドの補完や型チェックなどを行うのに圹立ちたす: + + + +## ショヌトカット + +しかし、ここでは`CommonQueryParams`を回曞くずいうコヌドの繰り返しが発生しおいるこずがわかりたす: + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +䟝存関係が、クラス自䜓のむンスタンスを䜜成するために**FastAPI**が「呌び出す」*特定の*クラスである堎合、**FastAPI** はこれらのケヌスのショヌトカットを提䟛しおいたす。 + +それらの具䜓的なケヌスに぀いおは以䞋のようにしたす: + +以䞋のように曞く代わりに: + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +...以䞋のように曞きたす: + +```Python +commons: CommonQueryParams = Depends() +``` + +パラメヌタの型ずしお䟝存関係を宣蚀し、`Depends()`の䞭でパラメヌタを指定せず、`Depends()`をその関数のパラメヌタの「デフォルト」倀`=`のあずの倀ずしお䜿甚するこずで、`Depends(CommonQueryParams)`の䞭でクラス党䜓を*もう䞀床*曞かなくおもよくなりたす。 + +同じ䟋では以䞋のようになりたす: + +```Python hl_lines="19" +{!../../../docs_src/dependencies/tutorial004.py!} +``` + +...そしお **FastAPI** は䜕をすべきか知っおいたす。 + +!!! tip "豆知識" + 圹に立぀ずいうよりも、混乱するようであれば無芖しおください。それをする*必芁*はありたせん。 + + それは単なるショヌトカットです。なぜなら **FastAPI** はコヌドの繰り返しを最小限に抑えるこずに気を䜿っおいるからです。 diff --git a/docs/ja/docs/tutorial/dependencies/index.md b/docs/ja/docs/tutorial/dependencies/index.md new file mode 100644 index 000000000..ec563a16d --- /dev/null +++ b/docs/ja/docs/tutorial/dependencies/index.md @@ -0,0 +1,209 @@ +# 䟝存関係 - 最初のステップ + +** FastAPI** は非垞に匷力でありながら盎感的な **䟝存性泚入** システムを持っおいたす。 + +それは非垞にシンプルに䜿甚できるように蚭蚈されおおり、開発者が他のコンポヌネント **FastAPI** ず統合するのが非垞に簡単になるように蚭蚈されおいたす。 + +## 「䟝存性泚入」ずは + +**「䟝存性泚入」** ずは、プログラミングにおいお、コヌドこの堎合は、*path operation関数*が動䜜したり䜿甚したりするために必芁なもの「䟝存関係」を宣蚀する方法があるこずを意味したす: + +そしお、そのシステムこの堎合は、**FastAPI**は、必芁な䟝存関係をコヌドに提䟛するために必芁なこずは䜕でも行いたす䟝存関係を「泚入」したす。 + +これは以䞋のようなこずが必芁な時にずおも䟿利です: + +* ロゞックを共有しおいる。同じコヌドロゞックを䜕床も繰り返しおいる。 +* デヌタベヌス接続を共有する。 +* セキュリティ、認蚌、ロヌル芁件などを匷制する。 +* そのほかにも倚くのこず... + +これらすべおを、コヌドの繰り返しを最小限に抑えながら行いたす。 + +## 最初のステップ + +非垞にシンプルな䟋を芋おみたしょう。あたりにもシンプルなので、今のずころはあたり参考にならないでしょう。 + +しかし、この方法では **䟝存性泚入** システムがどのように機胜するかに焊点を圓おるこずができたす。 + +### 䟝存関係の䜜成 + +たずは䟝存関係に泚目しおみたしょう。 + +以䞋のように、*path operation関数*ず同じパラメヌタを党お取るこずができる関数にすぎたせん: + +```Python hl_lines="8 9" +{!../../../docs_src/dependencies/tutorial001.py!} +``` + +これだけです。 + +**行**。 + +そしお、それはすべおの*path operation関数*が持っおいるのず同じ圢ず構造を持っおいたす。 + +「デコレヌタ」を含たない`@app.get("/some-path")`を含たない*path operation関数*ず考えるこずもできたす。 + +そしお䜕でも返すこずができたす。 + +この堎合、この䟝存関係は以䞋を期埅しおいたす: + +* オプショナルのク゚リパラメヌタ`q`は`str`です。 +* オプショナルのク゚リパラメヌタ`skip`は`int`で、デフォルトは`0`です。 +* オプショナルのク゚リパラメヌタ`limit`は`int`で、デフォルトは`100`です。 + +そしお、これらの倀を含む`dict`を返したす。 + +### `Depends`のむンポヌト + +```Python hl_lines="3" +{!../../../docs_src/dependencies/tutorial001.py!} +``` + +### "dependant"での䟝存関係の宣蚀 + +*path operation関数*のパラメヌタに`Body`や`Query`などを䜿甚するのず同じように、新しいパラメヌタに`Depends`を䜿甚するこずができたす: + +```Python hl_lines="13 18" +{!../../../docs_src/dependencies/tutorial001.py!} +``` + +関数のパラメヌタに`Depends`を䜿甚するのは`Body`や`Query`などず同じですが、`Depends`の動䜜は少し異なりたす。 + +`Depends`は぀のパラメヌタしか䞎えられたせん。 + +このパラメヌタは関数のようなものである必芁がありたす。 + +そしお、その関数は、*path operation関数*が行うのず同じ方法でパラメヌタを取りたす。 + +!!! tip "豆知識" + 次の章では、関数以倖の「もの」が䟝存関係ずしお䜿甚できるものを芋おいきたす。 + +新しいリク゚ストが到着するたびに、**FastAPI** が以䞋のような凊理を行いたす: + +* 䟝存関係"dependable"関数を正しいパラメヌタで呌び出したす。 +* 関数の結果を取埗したす。 +* *path operation関数*のパラメヌタにその結果を代入しおください。 + +```mermaid +graph TB + +common_parameters(["common_parameters"]) +read_items["/items/"] +read_users["/users/"] + +common_parameters --> read_items +common_parameters --> read_users +``` + +この方法では、共有されるコヌドを䞀床曞き、**FastAPI** が*path operations*のための呌び出しを行いたす。 + +!!! check "確認" + 特別なクラスを䜜成しおどこかで **FastAPI** に枡しお「登録」する必芁はないこずに泚意しおください。 + + `Depends`を枡すだけで、**FastAPI** が残りの凊理をしおくれたす。 + +## `async`にするかどうか + +䟝存関係は **FastAPI***path operation関数*ず同じからも呌び出されるため、関数を定矩する際にも同じルヌルが適甚されたす。 + +`async def`や通垞の`def`を䜿甚するこずができたす。 + +たた、通垞の`def`*path operation関数*の䞭に`async def`を入れお䟝存関係を宣蚀したり、`async def`*path operation関数*の䞭に`def`を入れお䟝存関係を宣蚀したりするこずなどができたす。 + +それは重芁ではありたせん。**FastAPI** は䜕をすべきかを知っおいたす。 + +!!! note "備考" + わからない堎合は、ドキュメントの[Async: *"In a hurry?"*](../../async.md){.internal-link target=_blank}の䞭の`async`ず`await`に぀いおのセクションを確認しおください。 + +## OpenAPIずの統合 + +䟝存関係およびサブ䟝存関係のすべおのリク゚スト宣蚀、怜蚌、および芁件は、同じOpenAPIスキヌマに統合されたす。 + +぀たり、察話型ドキュメントにはこれらの䟝存関係から埗られる党おの情報も含たれおいるずいうこずです: + + + +## 簡単な䜿い方 + +芋おみるず、*path*ず*operation*が䞀臎した時に*path operation関数*が宣蚀されおいお、**FastAPI** が正しいパラメヌタで関数を呌び出しおリク゚ストからデヌタを抜出する凊理をしおいたす。 + +実は、すべおのあるいはほずんどのWebフレヌムワヌクは、このように動䜜したす。 + +これらの関数を盎接呌び出すこずはありたせん。これらの関数はフレヌムワヌクこの堎合は、**FastAPI**によっお呌び出されたす。 + +䟝存性泚入システムでは、**FastAPI** に*path operation*もたた、*path operation関数*の前に実行されるべき他の䜕かに「䟝存」しおいるこずを䌝えるこずができ、**FastAPI** がそれを実行し、結果を「泚入」するこずを匕き受けたす。 + +他にも、「䟝存性泚入」ず同じような考えの䞀般的な甚語がありたす: + +* リ゜ヌス +* プロバむダ +* サヌビス +* むンゞェクタブル +* コンポヌネント + +## **FastAPI** プラグむン + +統合や「プラグむン」は **䟝存性泚入** システムを䜿っお構築するこずができたす。しかし、実際には、**「プラグむン」を䜜成する必芁はありたせん**。䟝存関係を䜿甚するこずで、無限の数の統合やむンタラクションを宣蚀するこずができ、それが**path operation関数*で利甚可胜になるからです。 + +䟝存関係は非垞にシンプルで盎感的な方法で䜜成するこずができ、必芁なPythonパッケヌゞをむンポヌトするだけで、*文字通り*数行のコヌドでAPI関数ず統合するこずができたす。 + +次の章では、リレヌショナルデヌタベヌスやNoSQLデヌタベヌス、セキュリティなどに぀いお、その䟋を芋おいきたす。 + +## **FastAPI** 互換性 + +䟝存性泚入システムがシンプルなので、**FastAPI** は以䞋のようなものず互換性がありたす: + +* すべおのリレヌショナルデヌタベヌス +* NoSQLデヌタベヌス +* 倖郚パッケヌゞ +* 倖郚API +* 認蚌・認可システム +* API利甚状況監芖システム +* レスポンスデヌタ泚入システム +* など。 + +## シンプルでパワフル + +階局䟝存性泚入システムは、定矩や䜿甚方法が非垞にシンプルであるにもかかわらず、非垞に匷力なものずなっおいたす。 + +䟝存関係事態を定矩する䟝存関係を定矩するこずができたす。 + +最終的には、䟝存関係の階局ツリヌが構築され、**䟝存性泚入**システムが、これらの䟝存関係およびそのサブ䟝存関係をすべお解決し、各ステップで結果を提䟛泚入したす。 + +䟋えば、぀のAPI゚ンドポむント*path operations*があるずしたす: + +* `/items/public/` +* `/items/private/` +* `/users/{user_id}/activate` +* `/items/pro/` + +そしお、䟝存関係ずサブ䟝存関係だけで、それぞれに異なるパヌミッション芁件を远加するこずができたす: + +```mermaid +graph TB + +current_user(["current_user"]) +active_user(["active_user"]) +admin_user(["admin_user"]) +paying_user(["paying_user"]) + +public["/items/public/"] +private["/items/private/"] +activate_user["/users/{user_id}/activate"] +pro_items["/items/pro/"] + +current_user --> active_user +active_user --> admin_user +active_user --> paying_user + +current_user --> public +active_user --> private +admin_user --> activate_user +paying_user --> pro_items +``` + +## **OpenAPI** ずの統合 + +これら党おの䟝存関係は、芁件を宣蚀するず同時に、*path operations*にパラメヌタやバリデヌションを远加したす。 + +**FastAPI** はそれをすべおOpenAPIスキヌマに远加しお、察話型のドキュメントシステムに衚瀺されるようにしたす。 From 8ad62bd837c0d098c6d55c35f414710946c18628 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:10:30 +0000 Subject: [PATCH 027/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 33cd064e9..a23d367e9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-model.md`. PR [#1938](https://github.com/tiangolo/fastapi/pull/1938) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-multiple-params.md`. PR [#1903](https://github.com/tiangolo/fastapi/pull/1903) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-params-numeric-validations.md`. PR [#1902](https://github.com/tiangolo/fastapi/pull/1902) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/python-types.md`. PR [#1899](https://github.com/tiangolo/fastapi/pull/1899) by [@SwftAlpc](https://github.com/SwftAlpc). From 289fbc83badcd60c9a91a2a7c1fc0e43f951d497 Mon Sep 17 00:00:00 2001 From: tokusumi <41147016+tokusumi@users.noreply.github.com> Date: Tue, 16 Jan 2024 01:12:39 +0900 Subject: [PATCH 028/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/background-tasks.md`=20(#26?= =?UTF-8?q?68)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/ja/docs/tutorial/background-tasks.md | 94 +++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/ja/docs/tutorial/background-tasks.md diff --git a/docs/ja/docs/tutorial/background-tasks.md b/docs/ja/docs/tutorial/background-tasks.md new file mode 100644 index 000000000..6094c370f --- /dev/null +++ b/docs/ja/docs/tutorial/background-tasks.md @@ -0,0 +1,94 @@ +# バックグラりンドタスク + +レスポンスを返した *埌に* 実行されるバックグラりンドタスクを定矩できたす。 + +これは、リク゚スト埌に凊理を開始する必芁があるが、クラむアントがレスポンスを受け取る前に凊理を終える必芁のない操䜜に圹立ちたす。 + +これには、たずえば次のものが含たれたす。 + +* 䜜業実行埌のメヌル通知: + * メヌルサヌバヌぞの接続ずメヌルの送信は「遅い」(数秒) 傟向があるため、すぐにレスポンスを返し、バックグラりンドでメヌル通知ができたす。 +* デヌタ凊理: + * たずえば、時間のかかる凊理を必芁ずするファむル受信時には、「受信枈み」(HTTP 202) のレスポンスを返し、バックグラりンドで凊理できたす。 + +## `BackgroundTasks` の䜿甚 + +たず初めに、`BackgroundTasks` をむンポヌトし、` BackgroundTasks` の型宣蚀ず共に、*path operation 関数* のパラメヌタヌを定矩したす: + +```Python hl_lines="1 13" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +**FastAPI** は、`BackgroundTasks` 型のオブゞェクトを䜜成し、そのパラメヌタヌに枡したす。 + +## タスク関数の䜜成 + +バックグラりンドタスクずしお実行される関数を䜜成したす。 + +これは、パラメヌタヌを受け取るこずができる単なる暙準的な関数です。 + +これは `async def` たたは通垞の `def` 関数であり、**FastAPI** はこれを正しく凊理したす。 + +ここで、タスク関数はファむル曞き蟌みを実行したす (メヌル送信のシミュレヌション)。 + +たた、曞き蟌み操䜜では `async` ず `await` を䜿甚しないため、通垞の `def` で関数を定矩したす。 + +```Python hl_lines="6-9" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +## バックグラりンドタスクの远加 + +*path operations 関数* 内で、`.add_task()` メ゜ッドを䜿甚しおタスク関数を *background tasks* オブゞェクトに枡したす。 + +```Python hl_lines="14" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +`.add_task()` は以䞋の匕数を受け取りたす: + +* バックグラりンドで実行されるタスク関数 (`write_notification`)。 +* タスク関数に順番に枡す必芁のある匕数の列 (`email`)。 +* タスク関数に枡す必芁のあるキヌワヌド匕数 (`message="some notification"`)。 + +## 䟝存性泚入 + +`BackgroundTasks` の䜿甚は䟝存性泚入システムでも機胜し、様々な階局 (*path operations 関数*、䟝存性 (䟝存可胜性)、サブ䟝存性など) で `BackgroundTasks` 型のパラメヌタヌを宣蚀できたす。 + +**FastAPI** は、それぞれの堎合の凊理​​方法ず同じオブゞェクトの再利甚方法を知っおいるため、すべおのバックグラりンドタスクがマヌゞされ、バックグラりンドで埌で実行されたす。 + +```Python hl_lines="13 15 22 25" +{!../../../docs_src/background_tasks/tutorial002.py!} +``` + +この䟋では、レスポンスが送信された *埌* にメッセヌゞが `log.txt` ファむルに曞き蟌たれたす。 + +リク゚ストにク゚リがあった堎合、バックグラりンドタスクでログに曞き蟌たれたす。 + +そしお、*path operations 関数* で生成された別のバックグラりンドタスクは、`email` パスパラメヌタを䜿甚しおメッセヌゞを曞き蟌みたす。 + +## 技術的な詳现 + +`BackgroundTasks` クラスは、`starlette.background`から盎接取埗されたす。 + +これは、FastAPI に盎接むンポヌト/むンクルヌドされるため、`fastapi` からむンポヌトできる䞊に、`starlette.background`から別の `BackgroundTask` (末尟に `s` がない) を誀っおむンポヌトするこずを回避できたす。 + +`BackgroundTasks`のみを䜿甚するこずで (`BackgroundTask` ではなく)、`Request` オブゞェクトを盎接䜿甚する堎合ず同様に、それを *path operations 関数* パラメヌタヌずしお䜿甚し、**FastAPI** に残りの凊理を任せるこずができたす。 + +それでも、FastAPI で `BackgroundTask` を単独で䜿甚するこずは可胜ですが、コヌド内でオブゞェクトを䜜成し、それを含むStarlette `Response` を返す必芁がありたす。 + +詳现に぀いおは、バックグラりンドタスクに関する Starlette の公匏ドキュメントを参照しお䞋さい。 + +## 譊告 + +倧量のバックグラりンド蚈算が必芁であり、必ずしも同じプロセスで実行する必芁がない堎合 (たずえば、メモリや倉数などを共有する必芁がない堎合)、Celery のようなより倧きな他のツヌルを䜿甚するずメリットがあるかもしれたせん。 + +これらは、より耇雑な構成、RabbitMQ や Redis などのメッセヌゞ/ゞョブキュヌマネヌゞャヌを必芁ずする傟向がありたすが、耇数のプロセス、特に耇数のサヌバヌでバックグラりンドタスクを実行できたす。 + +䟋を確認するには、[Project Generators](../project-generation.md){.internal-link target=_blank} を参照しおください。これらにはすべお、Celery が構築枈みです。 + +ただし、同じ **FastAPI** アプリから倉数ずオブゞェクトにアクセスする必芁がある堎合、たたは小さなバックグラりンドタスク (電子メヌル通知の送信など) を実行する必芁がある堎合は、単に `BackgroundTasks` を䜿甚できたす。 + +## たずめ + +`BackgroundTasks` をむンポヌトしお、*path operations 関数* や䟝存関係のパラメヌタに `BackgroundTasks`を䜿甚し、バックグラりンドタスクを远加しお䞋さい。 From 94404fc1a087fdc6f645b56af596abbf12269bd1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:16:10 +0000 Subject: [PATCH 029/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a23d367e9..e8fd93cac 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/index.md` and `docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#1958](https://github.com/tiangolo/fastapi/pull/1958) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-model.md`. PR [#1938](https://github.com/tiangolo/fastapi/pull/1938) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-multiple-params.md`. PR [#1903](https://github.com/tiangolo/fastapi/pull/1903) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-params-numeric-validations.md`. PR [#1902](https://github.com/tiangolo/fastapi/pull/1902) by [@SwftAlpc](https://github.com/SwftAlpc). From 6f3a134f6d5798ce9da6e74f4669056cc92f77d3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:18:40 +0000 Subject: [PATCH 030/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e8fd93cac..ba357b127 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/background-tasks.md`. PR [#2668](https://github.com/tiangolo/fastapi/pull/2668) by [@tokusumi](https://github.com/tokusumi). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/index.md` and `docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#1958](https://github.com/tiangolo/fastapi/pull/1958) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-model.md`. PR [#1938](https://github.com/tiangolo/fastapi/pull/1938) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-multiple-params.md`. PR [#1903](https://github.com/tiangolo/fastapi/pull/1903) by [@SwftAlpc](https://github.com/SwftAlpc). From c68836ae46e7d78646bb4ba26d9822d21815782b Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 01:43:41 +0900 Subject: [PATCH 031/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/dependencies/sub-dependenci?= =?UTF-8?q?es.md`=20(#1959)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- .../tutorial/dependencies/sub-dependencies.md | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 docs/ja/docs/tutorial/dependencies/sub-dependencies.md diff --git a/docs/ja/docs/tutorial/dependencies/sub-dependencies.md b/docs/ja/docs/tutorial/dependencies/sub-dependencies.md new file mode 100644 index 000000000..8848ac79e --- /dev/null +++ b/docs/ja/docs/tutorial/dependencies/sub-dependencies.md @@ -0,0 +1,86 @@ +# サブ䟝存関係 + +**サブ䟝存関係** を持぀䟝存関係を䜜成するこずができたす。 + +それらは必芁なだけ **深く** するこずができたす。 + +**FastAPI** はそれらを解決しおくれたす。 + +### 最初の䟝存関係「䟝存可胜なもの」 + +以䞋のような最初の䟝存関係「䟝存可胜なもの」を䜜成するこずができたす: + +```Python hl_lines="8 9" +{!../../../docs_src/dependencies/tutorial005.py!} +``` + +これはオプショナルのク゚リパラメヌタ`q`を`str`ずしお宣蚀し、それを返すだけです。 + +これは非垞にシンプルですあたり䟿利ではありたせんが、サブ䟝存関係がどのように機胜するかに焊点を圓おるのに圹立ちたす。 + +### 第二の䟝存関係 「䟝存可胜なもの」ず「䟝存」 + +そしお、別の䟝存関数「䟝存可胜なもの」を䜜成しお、同時にそれ自身の䟝存関係を宣蚀するこずができたす぀たりそれ自身も「䟝存」です: + +```Python hl_lines="13" +{!../../../docs_src/dependencies/tutorial005.py!} +``` + +宣蚀されたパラメヌタに泚目しおみたしょう: + +* この関数は䟝存関係「䟝存可胜なもの」そのものであるにもかかわらず、別の䟝存関係を宣蚀しおいたす䜕か他のものに「䟝存」しおいたす。 + * これは`query_extractor`に䟝存しおおり、それが返す倀をパラメヌタ`q`に代入したす。 +* たた、オプショナルの`last_query`クッキヌを`str`ずしお宣蚀したす。 + * ナヌザヌがク゚リ`q`を提䟛しなかった堎合、クッキヌに保存しおいた最埌に䜿甚したク゚リを䜿甚したす。 + +### 䟝存関係の䜿甚 + +以䞋のように䟝存関係を䜿甚するこずができたす: + +```Python hl_lines="21" +{!../../../docs_src/dependencies/tutorial005.py!} +``` + +!!! info "情報" + *path operation関数*の䞭で宣蚀しおいる䟝存関係は`query_or_cookie_extractor`の぀だけであるこずに泚意しおください。 + + しかし、**FastAPI** は`query_extractor`を最初に解決し、その結果を`query_or_cookie_extractor`を呌び出す時に枡す必芁があるこずを知っおいたす。 + +```mermaid +graph TB + +query_extractor(["query_extractor"]) +query_or_cookie_extractor(["query_or_cookie_extractor"]) + +read_query["/items/"] + +query_extractor --> query_or_cookie_extractor --> read_query +``` + +## 同じ䟝存関係の耇数回の䜿甚 + +䟝存関係の぀が同じ*path operation*に察しお耇数回宣蚀されおいる堎合、䟋えば、耇数の䟝存関係が共通のサブ䟝存関係を持っおいる堎合、**FastAPI** はリク゚ストごずに回だけそのサブ䟝存関係を呌び出したす。 + +そしお、返された倀を「キャッシュ」に保存し、同じリク゚ストに察しお䟝存関係を䜕床も呌び出す代わりに、特定のリク゚ストでそれを必芁ずする党おの「䟝存関係」に枡すこずになりたす。 + +高床なシナリオでは、「キャッシュされた」倀を䜿うのではなく、同じリク゚ストの各ステップおそらく耇数回で䟝存関係を呌び出す必芁があるこずがわかっおいる堎合、`Depens`を䜿甚する際に、`use_cache=False`ずいうパラメヌタを蚭定するこずができたす。 + +```Python hl_lines="1" +async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): + return {"fresh_value": fresh_value} +``` + +## たずめ + +ここで䜿われおいる掟手な蚀葉は別にしお、**䟝存性泚入** システムは非垞にシンプルです。 + +*path operation関数*ず同じように芋えるただの関数です。 + +しかし、それでも非垞に匷力で、任意の深くネストされた䟝存関係「グラフ」ツリヌを宣蚀するこずができたす。 + +!!! tip "豆知識" + これらの単玔な䟋では、党おが圹に立぀ずは蚀えないかもしれたせん。 + + しかし、**security** に぀いおの章で、それがどれほど有甚であるかがわかるでしょう。 + + そしお、あなたを救うコヌドの量もみるこずになるでしょう。 From 082eb21ba031ea2d432acba34f62c2c9ebfa6026 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:44:02 +0000 Subject: [PATCH 032/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ba357b127..19a33ab73 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/sub-dependencies.md`. PR [#1959](https://github.com/tiangolo/fastapi/pull/1959) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/background-tasks.md`. PR [#2668](https://github.com/tiangolo/fastapi/pull/2668) by [@tokusumi](https://github.com/tokusumi). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/index.md` and `docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#1958](https://github.com/tiangolo/fastapi/pull/1958) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-model.md`. PR [#1938](https://github.com/tiangolo/fastapi/pull/1938) by [@SwftAlpc](https://github.com/SwftAlpc). From b518241c590027e2367366b89cd95eaba2c05705 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 01:44:28 +0900 Subject: [PATCH 033/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/dependencies/dependencies-i?= =?UTF-8?q?n-path-operation-decorators.md`=20(#1960)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- ...pendencies-in-path-operation-decorators.md | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md diff --git a/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md new file mode 100644 index 000000000..1684d9ca1 --- /dev/null +++ b/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -0,0 +1,62 @@ +# path operationデコレヌタの䟝存関係 + +堎合によっおは*path operation関数*の䞭で䟝存関係の戻り倀を本圓に必芁ずしないこずもありたす。 + +もしくは、䟝存関係が倀を返さない堎合もありたす。 + +しかし、それでも実行・解決する必芁がありたす。 + +このような堎合、*path operation関数*のパラメヌタを`Depends`で宣蚀する代わりに、*path operation decorator*に`dependencies`の`list`を远加するこずができたす。 + +## *path operationデコレヌタ*ぞの`dependencies`の远加 + +*path operationデコレヌタ*はオプショナルの匕数`dependencies`を受け取りたす。 + +それは`Depends()`の`list`であるべきです: + +```Python hl_lines="17" +{!../../../docs_src/dependencies/tutorial006.py!} +``` + +これらの䟝存関係は、通垞の䟝存関係ず同様に実行・解決されたす。しかし、それらの倀䜕かを返す堎合は*path operation関数*には枡されたせん。 + +!!! tip "豆知識" + ゚ディタによっおは、未䜿甚の関数パラメヌタをチェックしお゚ラヌずしお衚瀺するものもありたす。 + + `dependencies`を`path operationデコレヌタ`で䜿甚するこずで、゚ディタやツヌルの゚ラヌを回避しながら確実に実行するこずができたす。 + + たた、コヌドの未䜿甚のパラメヌタがあるのを芋お、それが䞍芁だず思っおしたうような新しい開発者の混乱を避けるのにも圹立぀かもしれたせん。 + +## 䟝存関係の゚ラヌず戻り倀 + +通垞䜿甚しおいる䟝存関係の*関数*ず同じものを䜿甚するこずができたす。 + +### 䟝存関係の芁件 + +これらはリク゚ストの芁件ヘッダのようなものやその他のサブ䟝存関係を宣蚀するこずができたす: + +```Python hl_lines="6 11" +{!../../../docs_src/dependencies/tutorial006.py!} +``` + +### 䟋倖の発生 + +これらの䟝存関係は通垞の䟝存関係ず同じように、䟋倖を`raise`発生させるこずができたす: + +```Python hl_lines="8 13" +{!../../../docs_src/dependencies/tutorial006.py!} +``` + +### 戻り倀 + +そしお、倀を返すこずも返さないこずもできたすが、倀は䜿われたせん。 + +぀たり、すでにどこかで䜿っおいる通垞の䟝存関係倀を返すものを再利甚するこずができ、倀は䜿われなくおも䟝存関係は実行されたす: + +```Python hl_lines="9 14" +{!../../../docs_src/dependencies/tutorial006.py!} +``` + +## *path operations*のグルヌプに察する䟝存関係 + +埌で、より倧きなアプリケヌションの構造([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md){.internal-link target=_blank})に぀いお読む時に、おそらく耇数のファむルを䜿甚しお、*path operations*のグルヌプに察しお単䞀の`dependencies`パラメヌタを宣蚀する方法を孊ぶでしょう。 From 7b462b2e69dee36db320b9977d815cdf1f8d1d2d Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 16 Jan 2024 01:45:09 +0900 Subject: [PATCH 034/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/dependencies/dependencies-w?= =?UTF-8?q?ith-yield.md`=20(#1961)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ryusuke.miyaji Co-authored-by: ryuckel <36391432+ryuckel@users.noreply.github.com> Co-authored-by: tokusumi Co-authored-by: T. Tokusumi <41147016+tokusumi@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- .../dependencies/dependencies-with-yield.md | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md diff --git a/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md new file mode 100644 index 000000000..2a89e51d2 --- /dev/null +++ b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md @@ -0,0 +1,225 @@ +# yieldを持぀䟝存関係 + +FastAPIは、いく぀かの終了埌の远加のステップを行う䟝存関係をサポヌトしおいたす。 + +これを行うには、`return`の代わりに`yield`を䜿い、その埌に远加のステップを曞きたす。 + +!!! tip "豆知識" + `yield`は必ず䞀床だけ䜿甚するようにしおください。 + +!!! info "情報" + これを動䜜させるには、**Python 3.7** 以䞊を䜿甚するか、**Python 3.6** では"backports"をむンストヌルする必芁がありたす: + + ``` + pip install async-exit-stack async-generator + ``` + + これによりasync-exit-stackずasync-generatorがむンストヌルされたす。 + +!!! note "技術詳现" + 以䞋ず䞀緒に䜿甚できる関数なら䜕でも有効です: + + * `@contextlib.contextmanager`たたは + * `@contextlib.asynccontextmanager` + + これらは **FastAPI** の䟝存関係ずしお䜿甚するのに有効です。 + + 実際、FastAPIは内郚的にこれら぀のデコレヌタを䜿甚しおいたす。 + +## `yield`を持぀デヌタベヌスの䟝存関係 + +䟋えば、これを䜿っおデヌタベヌスセッションを䜜成し、終了埌にそれを閉じるこずができたす。 + +レスポンスを送信する前に`yield`文を含む前のコヌドのみが実行されたす。 + +```Python hl_lines="2 3 4" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +生成された倀は、*path operations*や他の䟝存関係に泚入されるものです: + +```Python hl_lines="4" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +`yield`文に続くコヌドは、レスポンスが送信された埌に実行されたす: + +```Python hl_lines="5 6" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +!!! tip "豆知識" + `async`や通垞の関数を䜿甚するこずができたす。 + + **FastAPI** は、通垞の䟝存関係ず同じように、それぞれで正しいこずを行いたす。 + +## `yield`ず`try`を持぀䟝存関係 + +`yield`を持぀䟝存関係で`try`ブロックを䜿甚した堎合、その䟝存関係を䜿甚した際に発生した䟋倖を受け取るこずになりたす。 + +䟋えば、途䞭のどこかの時点で、別の䟝存関係や*path operation*の䞭で、デヌタベヌストランザクションを「ロヌルバック」したり、その他の゚ラヌを䜜成したりするコヌドがあった堎合、䟝存関係の䞭で䟋倖を受け取るこずになりたす。 + +そのため、䟝存関係の䞭にある特定の䟋倖を`except SomeException`で探すこずができたす。 + +同様に、`finally`を甚いお䟋倖があったかどうかにかかわらず、終了ステップを確実に実行するこずができたす。 + +```Python hl_lines="3 5" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +## `yield`を持぀サブ䟝存関係 + +任意の倧きさや圢のサブ䟝存関係やサブ䟝存関係の「ツリヌ」を持぀こずができ、その䞭で`yield`を䜿甚するこずができたす。 + +**FastAPI** は、`yield`を持぀各䟝存関係の「終了コヌド」が正しい順番で実行されおいるこずを確認したす。 + +䟋えば、`dependency_c`は`dependency_b`ず`dependency_b`に䟝存する`dependency_a`に、䟝存するこずができたす: + +```Python hl_lines="4 12 20" +{!../../../docs_src/dependencies/tutorial008.py!} +``` + +そしお、それらはすべお`yield`を䜿甚するこずができたす。 + +この堎合、`dependency_c`は終了コヌドを実行するために、`dependency_b`ここでは`dep_b`ずいう名前の倀がただ利甚可胜である必芁がありたす。 + +そしお、`dependency_b`は`dependency_a`ここでは`dep_a`ずいう名前の倀を終了コヌドで利甚できるようにする必芁がありたす。 + +```Python hl_lines="16 17 24 25" +{!../../../docs_src/dependencies/tutorial008.py!} +``` + +同様に、`yield`ず`return`が混圚した䟝存関係を持぀こずもできたす。 + +たた、単䞀の䟝存関係を持っおいお、`yield`などの他の䟝存関係をいく぀か必芁ずするこずもできたす。 + +䟝存関係の組み合わせは自由です。 + +**FastAPI** は、党おが正しい順序で実行されおいるこずを確認したす。 + +!!! note "技術詳现" + これはPythonのContext Managersのおかげで動䜜したす。 + + **FastAPI** はこれを実珟するために内郚的に䜿甚しおいたす。 + +## `yield`ず`HTTPException`を持぀䟝存関係 + +`yield`ず䟋倖をキャッチする`try`ブロックを持぀こずができる䟝存関係を䜿甚するこずができるこずがわかりたした。 + +`yield`の埌の終了コヌドで`HTTPException`などを発生させたくなるかもしれたせん。しかし**それはうたくいきたせん** + +`yield`を持぀䟝存関係の終了コヌドは[䟋倖ハンドラ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}の*埌に*実行されたす。䟝存関係によっお投げられた䟋倖を終了コヌド`yield`の埌でキャッチするものはなにもありたせん。 + +぀たり、`yield`の埌に`HTTPException`を発生させた堎合、`HTTTPException`をキャッチしおHTTP 400のレスポンスを返すデフォルトのあるいは任意のカスタムの䟋倖ハンドラは、その䟋倖をキャッチするこずができなくなりたす。 + +これは、䟝存関係に蚭定されおいるもの䟋えば、DBセッションを、䟋えば、バックグラりンドタスクで䜿甚できるようにするものです。 + +バックグラりンドタスクはレスポンスが送信された*埌*に実行されたす。そのため、*すでに送信されおいる*レスポンスを倉曎する方法すらないので、`HTTPException`を発生させる方法はありたせん。 + +しかし、バックグラりンドタスクがDB゚ラヌを発生させた堎合、少なくずも`yield`で䟝存関係のセッションをロヌルバックしたり、きれいに閉じたりするこずができ、゚ラヌをログに蚘録したり、リモヌトのトラッキングシステムに報告したりするこずができたす。 + +䟋倖が発生する可胜性があるコヌドがある堎合は、最も普通の「Python流」なこずをしお、コヌドのその郚分に`try`ブロックを远加しおください。 + +レスポンスを返したり、レスポンスを倉曎したり、`HTTPException`を発生させたりする*前に*凊理したいカスタム䟋倖がある堎合は、[カスタム䟋倖ハンドラ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}を䜜成しおください。 + +!!! tip "豆知識" + `HTTPException`を含む䟋倖は、`yield`の*前*でも発生させるこずができたす。ただし、埌ではできたせん。 + +実行の順序は倚かれ少なかれ以䞋の図のようになりたす。時間は䞊から䞋ぞず流れおいきたす。そしお、各列はコヌドを盞互䜜甚させたり、実行したりしおいる郚分の䞀぀です。 + +```mermaid +sequenceDiagram + +participant client as Client +participant handler as Exception handler +participant dep as Dep with yield +participant operation as Path Operation +participant tasks as Background tasks + + Note over client,tasks: Can raise exception for dependency, handled after response is sent + Note over client,operation: Can raise HTTPException and can change the response + client ->> dep: Start request + Note over dep: Run code up to yield + opt raise + dep -->> handler: Raise HTTPException + handler -->> client: HTTP error response + dep -->> dep: Raise other exception + end + dep ->> operation: Run dependency, e.g. DB session + opt raise + operation -->> handler: Raise HTTPException + handler -->> client: HTTP error response + operation -->> dep: Raise other exception + end + operation ->> client: Return response to client + Note over client,operation: Response is already sent, can't change it anymore + opt Tasks + operation -->> tasks: Send background tasks + end + opt Raise other exception + tasks -->> dep: Raise other exception + end + Note over dep: After yield + opt Handle other exception + dep -->> dep: Handle exception, can't change response. E.g. close DB session. + end +``` + +!!! info "情報" + **぀のレスポンス** だけがクラむアントに送信されたす。それぱラヌレスポンスの䞀぀かもしれたせんし、*path operation*からのレスポンスかもしれたせん。 + + いずれかのレスポンスが送信された埌、他のレスポンスを送信するこずはできたせん。 + +!!! tip "豆知識" + この図は`HTTPException`を瀺しおいたすが、[カスタム䟋倖ハンドラ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}を䜜成するこずで、他の䟋倖を発生させるこずもできたす。そしお、その䟋倖は䟝存関係の終了コヌドではなく、そのカスタム䟋倖ハンドラによっお凊理されたす。 + + しかし䟋倖ハンドラで凊理されない䟋倖を発生させた堎合は、䟝存関係の終了コヌドで凊理されたす。 + +## コンテキストマネヌゞャ + +### 「コンテキストマネヌゞャ」ずは + +「コンテキストマネヌゞャ」ずは、`with`文の䞭で䜿甚できるPythonオブゞェクトのこずです。 + +䟋えば、ファむルを読み蟌むには`with`を䜿甚するこずができたす: + +```Python +with open("./somefile.txt") as f: + contents = f.read() + print(contents) +``` + +その埌の`open("./somefile.txt")`は「コンテキストマネヌゞャ」ず呌ばれるオブゞェクトを䜜成したす。 + +`with`ブロックが終了するず、䟋倖があったずしおもファむルを確かに閉じたす。 + +`yield`を䟝存関係を䜜成するず、**FastAPI** は内郚的にそれをコンテキストマネヌゞャに倉換し、他の関連ツヌルず組み合わせたす。 + +### `yield`を持぀䟝存関係でのコンテキストマネヌゞャの䜿甚 + +!!! warning "泚意" + これは倚かれ少なかれ、「高床な」発想です。 + + **FastAPI** を䜿い始めたばかりの方は、ずりあえずスキップした方がよいかもしれたせん。 + +Pythonでは、以䞋の぀のメ゜ッドを持぀クラスを䜜成する: `__enter__()`ず`__exit__()`こずでコンテキストマネヌゞャを䜜成するこずができたす。 + +たた、䟝存関数の䞭で`with`や`async with`文を䜿甚するこずによっお`yield`を持぀ **FastAPI** の䟝存関係の䞭でそれらを䜿甚するこずができたす: + +```Python hl_lines="1 2 3 4 5 6 7 8 9 13" +{!../../../docs_src/dependencies/tutorial010.py!} +``` + +!!! tip "豆知識" + コンテキストマネヌゞャを䜜成するもう䞀぀の方法はwithです: + + * `@contextlib.contextmanager` たたは + * `@contextlib.asynccontextmanager` + + これらを䜿っお、関数を単䞀の`yield`でデコレヌトするこずができたす。 + + これは **FastAPI** が内郚的に`yield`を持぀䟝存関係のために䜿甚しおいるものです。 + + しかし、FastAPIの䟝存関係にデコレヌタを䜿う必芁はありたせんそしお䜿うべきではありたせん。 + + FastAPIが内郚的にやっおくれたす。 From e500f994035b0caa675d2bd65c3ae11d9b848a95 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:45:17 +0000 Subject: [PATCH 035/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 19a33ab73..baa10754b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#1960](https://github.com/tiangolo/fastapi/pull/1960) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/sub-dependencies.md`. PR [#1959](https://github.com/tiangolo/fastapi/pull/1959) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/background-tasks.md`. PR [#2668](https://github.com/tiangolo/fastapi/pull/2668) by [@tokusumi](https://github.com/tokusumi). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/index.md` and `docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#1958](https://github.com/tiangolo/fastapi/pull/1958) by [@SwftAlpc](https://github.com/SwftAlpc). From 2c670325af38a738d7cd8eecd622be77f900c6d8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 16:47:21 +0000 Subject: [PATCH 036/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index baa10754b..5d6c55709 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -43,6 +43,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#1961](https://github.com/tiangolo/fastapi/pull/1961) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#1960](https://github.com/tiangolo/fastapi/pull/1960) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/sub-dependencies.md`. PR [#1959](https://github.com/tiangolo/fastapi/pull/1959) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/background-tasks.md`. PR [#2668](https://github.com/tiangolo/fastapi/pull/2668) by [@tokusumi](https://github.com/tokusumi). From 8450dc204d806bac021c6a2432d7b4a0749e77cd Mon Sep 17 00:00:00 2001 From: Rafal Skolasinski Date: Mon, 15 Jan 2024 20:41:47 +0000 Subject: [PATCH 037/222] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo=20in=20?= =?UTF-8?q?`fastapi/security/oauth2.py`=20(#10972)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/security/oauth2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py index 9281dfb64..be3e18cd8 100644 --- a/fastapi/security/oauth2.py +++ b/fastapi/security/oauth2.py @@ -353,7 +353,7 @@ class OAuth2(SecurityBase): bool, Doc( """ - By default, if no HTTP Auhtorization header is provided, required for + By default, if no HTTP Authorization header is provided, required for OAuth2 authentication, it will automatically cancel the request and send the client an error. From 2ce4c102fb64efd3e59b84359ddcebaaa21003ce Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 20:42:07 +0000 Subject: [PATCH 038/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5d6c55709..ed9fdf03b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* ✏ Fix typo in `fastapi/security/oauth2.py`. PR [#10972](https://github.com/tiangolo/fastapi/pull/10972) by [@RafalSkolasinski](https://github.com/RafalSkolasinski). * 📝 Update `HTTPException` details in `docs/en/docs/tutorial/handling-errors.md`. PR [#5418](https://github.com/tiangolo/fastapi/pull/5418) by [@papb](https://github.com/papb). * ✏ A few tweaks in `docs/de/docs/tutorial/first-steps.md`. PR [#10959](https://github.com/tiangolo/fastapi/pull/10959) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix link in `docs/en/docs/advanced/async-tests.md`. PR [#10960](https://github.com/tiangolo/fastapi/pull/10960) by [@nilslindemann](https://github.com/nilslindemann). From 75ea31c79e9e744832570ad0f42ff8572e9fd0dd Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <61987505+2chanhaeng@users.noreply.github.com> Date: Tue, 16 Jan 2024 06:40:57 +0900 Subject: [PATCH 039/222] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo=20error?= =?UTF-8?q?=20in=20`docs/ko/docs/tutorial/path-params.md`=20(#10758)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/path-params.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ko/docs/tutorial/path-params.md b/docs/ko/docs/tutorial/path-params.md index 5cf397e7a..8ebd0804e 100644 --- a/docs/ko/docs/tutorial/path-params.md +++ b/docs/ko/docs/tutorial/path-params.md @@ -101,7 +101,7 @@ ## 순서 묞제 -*겜로 동작*을 만듀때 고정 겜로륌 갖고 있는 상황듀을 맞닩뜹멮 수 있습니닀. +*겜로 동작*을 만듀때 고정 겜로륌 갖고 있는 상황듀을 맞닥뜚늎 수 있습니닀. `/users/me`처럌, 현재 사용자의 데읎터륌 가젞옚닀고 합시닀. From ae92e563b1ba0d00f1aaf2b4a472f619038bf24c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jan 2024 21:41:21 +0000 Subject: [PATCH 040/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ed9fdf03b..01fc71d3d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -44,6 +44,7 @@ hide: ### Translations +* ✏ Fix typo error in `docs/ko/docs/tutorial/path-params.md`. PR [#10758](https://github.com/tiangolo/fastapi/pull/10758) by [@2chanhaeng](https://github.com/2chanhaeng). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#1961](https://github.com/tiangolo/fastapi/pull/1961) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#1960](https://github.com/tiangolo/fastapi/pull/1960) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/sub-dependencies.md`. PR [#1959](https://github.com/tiangolo/fastapi/pull/1959) by [@SwftAlpc](https://github.com/SwftAlpc). From d1e533e3705f742c7f6abaf1d68f3af75d5036e0 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 16 Jan 2024 13:11:15 +0100 Subject: [PATCH 041/222] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Tweak=20the=20germ?= =?UTF-8?q?an=20translation=20of=20`docs/de/docs/tutorial/index.md`=20(#10?= =?UTF-8?q?962)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/index.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/de/docs/tutorial/index.md b/docs/de/docs/tutorial/index.md index dd7ed43bd..93a30d1b3 100644 --- a/docs/de/docs/tutorial/index.md +++ b/docs/de/docs/tutorial/index.md @@ -1,6 +1,6 @@ -# Tutorial - Benutzerhandbuch - Intro +# Tutorial – Benutzerhandbuch -Diese Anleitung zeigt Ihnen Schritt fÃŒr Schritt, wie Sie **FastAPI** mit den meisten Funktionen nutzen können. +Dieses Tutorial zeigt Ihnen Schritt fÃŒr Schritt, wie Sie **FastAPI** und die meisten seiner Funktionen verwenden können. Jeder Abschnitt baut schrittweise auf den vorhergehenden auf. Diese Abschnitte sind aber nach einzelnen Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema ÃŒbergehen können, um Ihre speziellen API-Anforderungen zu lösen. @@ -12,7 +12,7 @@ Dadurch können Sie jederzeit zurÃŒckkommen und sehen genau das, was Sie benöt Alle Codeblöcke können kopiert und direkt verwendet werden (da es sich um getestete Python-Dateien handelt). -Um eines der Beispiele auszufÃŒhren, kopieren Sie den Code in die Datei `main.py`, und starten Sie `uvicorn` mit: +Um eines der Beispiele auszufÃŒhren, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `uvicorn` mit:
@@ -50,31 +50,31 @@ $ pip install "fastapi[all]"
-...dies beinhaltet auch `uvicorn`, das Sie als Server verwenden können, auf dem Ihr Code lÀuft. +... das beinhaltet auch `uvicorn`, welchen Sie als Server verwenden können, der ihren Code ausfÃŒhrt. -!!! Hinweis - Sie können die Installation auch in einzelnen Schritten ausfÃŒhren. +!!! note "Hinweis" + Sie können die einzelnen Teile auch separat installieren. - Dies werden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung produktiv einsetzen möchten: + Das folgende wÃŒrden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung in der Produktion einsetzen: ``` pip install fastapi ``` - Installieren Sie auch `uvicorn`, dies arbeitet als Server: + Installieren Sie auch `uvicorn` als Server: ``` pip install "uvicorn[standard]" ``` - Dasselbe gilt fÃŒr jede der optionalen AbhÀngigkeiten, die Sie verwenden möchten. + Das gleiche gilt fÃŒr jede der optionalen AbhÀngigkeiten, die Sie verwenden möchten. -## Erweitertes Benutzerhandbuch +## Handbuch fÃŒr fortgeschrittene Benutzer -ZusÀtzlich gibt es ein **Erweitertes Benutzerhandbuch**, dies können Sie spÀter nach diesem **Tutorial - Benutzerhandbuch** lesen. +Es gibt auch ein **Handbuch fÃŒr fortgeschrittene Benutzer**, welches Sie spÀter nach diesem **Tutorial – Benutzerhandbuch** lesen können. -Das **Erweiterte Benutzerhandbuch** baut auf dieses Tutorial auf, verwendet dieselben Konzepte und bringt Ihnen zusÀtzliche Funktionen bei. +Das **Handbuch fÃŒr fortgeschrittene Benutzer** baut auf diesem Tutorial auf, verwendet dieselben Konzepte und bringt Ihnen einige zusÀtzliche Funktionen bei. -Allerdings sollten Sie zuerst das **Tutorial - Benutzerhandbuch** lesen (was Sie gerade lesen). +Allerdings sollten Sie zuerst das **Tutorial – Benutzerhandbuch** lesen (was Sie hier gerade tun). -Es ist so konzipiert, dass Sie nur mit dem **Tutorial - Benutzerhandbuch** eine vollstÀndige Anwendung erstellen können und diese dann je nach Bedarf mit einigen der zusÀtzlichen Ideen aus dem **Erweiterten Benutzerhandbuch** erweitern können. +Die Dokumentation ist so konzipiert, dass Sie mit dem **Tutorial – Benutzerhandbuch** eine vollstÀndige Anwendung erstellen können und diese dann je nach Bedarf mit einigen der zusÀtzlichen Ideen aus dem **Handbuch fÃŒr fortgeschrittene Benutzer** vervollstÀndigen können. From d761a29908aed90703d7c561f446469104903679 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Jan 2024 12:11:43 +0000 Subject: [PATCH 042/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 01fc71d3d..e42e1baf4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -44,6 +44,7 @@ hide: ### Translations +* ✏ Tweak the german translation of `docs/de/docs/tutorial/index.md`. PR [#10962](https://github.com/tiangolo/fastapi/pull/10962) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix typo error in `docs/ko/docs/tutorial/path-params.md`. PR [#10758](https://github.com/tiangolo/fastapi/pull/10758) by [@2chanhaeng](https://github.com/2chanhaeng). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#1961](https://github.com/tiangolo/fastapi/pull/1961) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#1960](https://github.com/tiangolo/fastapi/pull/1960) by [@SwftAlpc](https://github.com/SwftAlpc). From 950d9ce74dd2efd73572dfb6d0631ce9687ce14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 16 Jan 2024 14:23:25 +0100 Subject: [PATCH 043/222] =?UTF-8?q?=F0=9F=93=9D=20Deprecate=20old=20tutori?= =?UTF-8?q?als:=20Peewee,=20Couchbase,=20encode/databases=20(#10979)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/how-to/async-sql-encode-databases.md | 5 ++++- docs/en/docs/how-to/nosql-databases-couchbase.md | 5 ++++- docs/en/docs/how-to/sql-databases-peewee.md | 5 ++++- docs/en/mkdocs.yml | 7 ++++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/en/docs/how-to/async-sql-encode-databases.md b/docs/en/docs/how-to/async-sql-encode-databases.md index 0e2ccce78..c7b340d67 100644 --- a/docs/en/docs/how-to/async-sql-encode-databases.md +++ b/docs/en/docs/how-to/async-sql-encode-databases.md @@ -1,4 +1,4 @@ -# Async SQL (Relational) Databases with Encode/Databases +# ~~Async SQL (Relational) Databases with Encode/Databases~~ (deprecated) !!! info These docs are about to be updated. 🎉 @@ -7,6 +7,9 @@ The new docs will include Pydantic v2 and will use SQLModel once it is updated to use Pydantic v2 as well. +!!! warning "Deprecated" + This tutorial is deprecated and will be removed in a future version. + You can also use `encode/databases` with **FastAPI** to connect to databases using `async` and `await`. It is compatible with: diff --git a/docs/en/docs/how-to/nosql-databases-couchbase.md b/docs/en/docs/how-to/nosql-databases-couchbase.md index ae6ad604b..563318984 100644 --- a/docs/en/docs/how-to/nosql-databases-couchbase.md +++ b/docs/en/docs/how-to/nosql-databases-couchbase.md @@ -1,4 +1,4 @@ -# NoSQL (Distributed / Big Data) Databases with Couchbase +# ~~NoSQL (Distributed / Big Data) Databases with Couchbase~~ (deprecated) !!! info These docs are about to be updated. 🎉 @@ -7,6 +7,9 @@ The new docs will hopefully use Pydantic v2 and will use ODMantic with MongoDB. +!!! warning "Deprecated" + This tutorial is deprecated and will be removed in a future version. + **FastAPI** can also be integrated with any NoSQL. Here we'll see an example using **Couchbase**, a document based NoSQL database. diff --git a/docs/en/docs/how-to/sql-databases-peewee.md b/docs/en/docs/how-to/sql-databases-peewee.md index 74a28b170..7211f7ed3 100644 --- a/docs/en/docs/how-to/sql-databases-peewee.md +++ b/docs/en/docs/how-to/sql-databases-peewee.md @@ -1,4 +1,7 @@ -# SQL (Relational) Databases with Peewee +# ~~SQL (Relational) Databases with Peewee~~ (deprecated) + +!!! warning "Deprecated" + This tutorial is deprecated and will be removed in a future version. !!! warning If you are just starting, the tutorial [SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank} that uses SQLAlchemy should be enough. diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 92d081aa1..b8d27a35b 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -174,9 +174,6 @@ nav: - How To - Recipes: - how-to/index.md - how-to/general.md - - how-to/sql-databases-peewee.md - - how-to/async-sql-encode-databases.md - - how-to/nosql-databases-couchbase.md - how-to/graphql.md - how-to/custom-request-and-route.md - how-to/conditional-openapi.md @@ -184,6 +181,9 @@ nav: - how-to/separate-openapi-schemas.md - how-to/custom-docs-ui-assets.md - how-to/configure-swagger-ui.md + - how-to/sql-databases-peewee.md + - how-to/async-sql-encode-databases.md + - how-to/nosql-databases-couchbase.md - Reference (Code API): - reference/index.md - reference/fastapi.md @@ -242,6 +242,7 @@ markdown_extensions: format: !!python/name:pymdownx.superfences.fence_code_format '' pymdownx.tabbed: alternate_style: true + pymdownx.tilde: attr_list: null md_in_html: null extra: From fc8ea413eb8a6370c3b41de7ccad6003bf37ab13 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 16 Jan 2024 13:23:49 +0000 Subject: [PATCH 044/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e42e1baf4..a96954527 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Deprecate old tutorials: Peewee, Couchbase, encode/databases. PR [#10979](https://github.com/tiangolo/fastapi/pull/10979) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix typo in `fastapi/security/oauth2.py`. PR [#10972](https://github.com/tiangolo/fastapi/pull/10972) by [@RafalSkolasinski](https://github.com/RafalSkolasinski). * 📝 Update `HTTPException` details in `docs/en/docs/tutorial/handling-errors.md`. PR [#5418](https://github.com/tiangolo/fastapi/pull/5418) by [@papb](https://github.com/papb). * ✏ A few tweaks in `docs/de/docs/tutorial/first-steps.md`. PR [#10959](https://github.com/tiangolo/fastapi/pull/10959) by [@nilslindemann](https://github.com/nilslindemann). From df09e0a3f6061de4bf63b8ab7ea61b6cdd70d4fd Mon Sep 17 00:00:00 2001 From: Max Su Date: Thu, 18 Jan 2024 01:15:27 +0800 Subject: [PATCH 045/222] =?UTF-8?q?=F0=9F=8C=90=20Initialize=20translation?= =?UTF-8?q?s=20for=20Traditional=20Chinese=20(#10505)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/en/mkdocs.yml | 2 + docs/zh-hant/docs/index.md | 470 +++++++++++++++++++++++++++++++++++++ docs/zh-hant/mkdocs.yml | 1 + scripts/docs.py | 2 - 4 files changed, 473 insertions(+), 2 deletions(-) create mode 100644 docs/zh-hant/docs/index.md create mode 100644 docs/zh-hant/mkdocs.yml diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index b8d27a35b..fcac555eb 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -303,6 +303,8 @@ extra: name: yo - Yorùbá - link: /zh/ name: zh - 汉语 + - link: /zh-hant/ + name: zh - 繁體䞭文 - link: /em/ name: 😉 extra_css: diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md new file mode 100644 index 000000000..e7a2efec9 --- /dev/null +++ b/docs/zh-hant/docs/index.md @@ -0,0 +1,470 @@ +

+ FastAPI +

+

+ FastAPI 框架高效胜易斌孞習快速開癌適甚斌生產環境 +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**文件** https://fastapi.tiangolo.com + +**皋匏碌** https://github.com/tiangolo/fastapi + +--- + +FastAPI 是䞀個珟代、快速高效胜的 web 框架甚斌 Python 3.8+ 䞊採甚暙準 Python 型別提瀺。 + +䞻芁特點包含 + +- **快速** 非垞高的效胜可與 **NodeJS** 和 **Go** 效胜盞當 (歞功斌 Starlette and Pydantic)。 [FastAPI 是最快的 Python web 框架之䞀](#performance)。 +- **極速開癌** 提高開癌功胜的速床玄 200% 至 300%。 \* +- **曎少的 Bug** 枛少玄 40% 的人為開癌者導臎的錯誀。 \* +- **盎芺** 具有出色的線茯噚支揎處處郜有自動補党以枛少偵錯時間。 +- **簡單** 蚭蚈䞊易斌䜿甚和孞習倧幅枛少閱讀文件的時間。 +- **簡朔** 最小化皋匏碌重耇性。可以通過䞍同的參敞聲明䟆寊珟曎豐富的功胜和曎少的錯誀。 +- **穩健** 立即獲埗生產玚可甚的皋匏碌還有自動生成互動匏文件。 +- **暙準化** 基斌 (䞔完党盞容斌) OpenAPIs 的盞關暙準OpenAPI之前被皱為 Swagger和JSON Schema。 + +\* 基斌內郚開癌團隊圚建立生產應甚皋匏時的枬詊預䌰。 + +## 莊助 + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +其他莊助商 + +## 評價 + +"_[...] 近期倧量的䜿甚 **FastAPI**。 [...] 目前正圚蚈畫圚**埮軟**團隊的**機噚孞習**服務䞭導入。其䞭䞀些正圚敎合到栞心的 **Windows** 產品和䞀些 **Office** 產品。_" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_我們䜿甚 **FastAPI** 䟆建立產生**預枬**結果的 **REST** 䌺服噚。 [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** 埈抮幞地宣垃開源**危機管理**協調框架 **Dispatch**! [是䜿甚 **FastAPI** 建構]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_我對 **FastAPI** 興奮埗䞍埗了。它倪有趣了_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_老寊說䜠建造的東西看起䟆非垞堅固和粟緻。圚埈倚方面這就是我想芁的看到有人建造它真的埈錓舞人心。_" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_劂果悚想孞習䞀皮甚斌構建 REST API 的**珟代框架**䞍胜錯過 **FastAPI** [...] 它非垞快速、䞔易斌䜿甚和孞習 [...]_" + +"_我們的 **APIs** 已經改甚 **FastAPI** [...] 我想䜠會喜歡它 [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI 創蟊人 - spaCy creators (ref) - (ref)
+ +--- + +"_劂果有人想芁建立䞀個生產環境的 Python API我匷烈掚薊 **FastAPI**它**蚭蚈粟矎****䜿甚簡單**侔**高床可擎充**它已成為我們 API 優先開癌策略䞭的**關鍵組件**䞊䞔驅動了蚱倚自動化服務䟋劂我們的 Virtual TAC Engineer。_" + +
Deon Pillsbury - Cisco (ref)
+ +--- + +## **Typer**呜什列䞭的 FastAPI + + + +劂果䜠䞍是圚開癌網頁 API而是正圚開癌䞀個圚終端機䞭運行的呜什列應甚皋匏䞍劚嘗詊 **Typer**。 + +**Typer** 是 FastAPI 的小兄匟。他立志成為呜什列的 **FastAPI**。 ⌚ 🚀 + +## 安裝需求 + +Python 3.8+ + +FastAPI 是站圚以䞋巚人的肩膀䞊 + +- Starlette 負責網頁的郚分 +- Pydantic 負責資料的郚分 + +## 安裝 + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +䜠同時也會需芁 ASGI 䌺服噚甚斌生產環境像是 Uvicorn 或 Hypercorn。 + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +## 範䟋 + +### 建立 + +- 建立䞀個 python 檔案 `main.py`䞊寫入以䞋皋匏碌 + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +
+或可以䜿甚 async def... + +劂果䜠的皋匏䜿甚 `async` / `await`請䜿甚 `async def` + +```Python hl_lines="9 14" +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +**泚意** + +劂果䜠䞍知道是吊會甚到可以查看 _"In a hurry?"_ 章節䞭關斌 `async` 和 `await` 的郚分。 + +
+ +### 運行 + +䜿甚以䞋指什運行䌺服噚 + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+關斌指什 uvicorn main:app --reload... + +該指什 `uvicorn main:app` 指的是 + +- `main``main.py` 檔案䞀個 python 的 "暡組"。 +- `app`圚 `main.py` 檔案䞭䜿甚 `app = FastAPI()` 建立的物件。 +- `--reload`皋匏碌曎改埌會自動重新啟動請僅圚開癌時䜿甚歀參敞。 + +
+ +### 檢查 + +䜿甚瀏芜噚開啟 http://127.0.0.1:8000/items/5?q=somequery。 + +䜠將會看到以䞋的 JSON 回應 + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +䜠已經建立了䞀個具有以䞋功胜的 API + +- 透過路埑 `/` 和 `/items/{item_id}` 接受 HTTP 請求。 +- 以䞊路經郜接受 `GET` 請求也被皱為 HTTP _方法_。 +- 路埑 `/items/{item_id}` 有䞀個 `int` 型別的 `item_id` 參敞。 +- 路埑 `/items/{item_id}` 有䞀個 `str` 型別的查詢參敞 `q`。 + +### 互動匏 API 文件 + +䜿甚瀏芜噚開啟 http://127.0.0.1:8000/docs。 + +䜠會看到自動生成的互動匏 API 文件由 Swagger UI 生成 + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### ReDoc API 文件 + +䜿甚瀏芜噚開啟 http://127.0.0.1:8000/redoc。 + +䜠將看到 ReDoc 文件 (由 ReDoc 生成) + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## 範䟋升玚 + +珟圚繌續修改 `main.py` 檔案䟆接收䞀個垶有 body 的 `PUT` 請求。 + +我們䜿甚 Pydantic 䟆䜿甚暙準的 Python 型別聲明請求。 + +```Python hl_lines="4 9-12 25-27" +from typing import Union + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: Union[bool, None] = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +䌺服噚將自動重新茉入因為圚䞊䞀步䞭䜠向 `uvicorn` 指什添加了 `--reload` 的遞項。 + +### 互動匏 API 文件升玚 + +䜿甚瀏芜噚開啟 http://127.0.0.1:8000/docs。 + +- 互動匏 API 文件會自動曎新䞊加入新的 body 請求 + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +- 點擊 "Try it out" 按鈕 䜠可以填寫參敞䞊盎接與 API 互動 + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +- 然埌點擊 "Execute" 按鈕䜿甚者介面將會向 API 癌送請求䞊將結果顯瀺圚螢幕䞊 + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### ReDoc API 文件升玚 + +䜿甚瀏芜噚開啟 http://127.0.0.1:8000/redoc。 + +- ReDoc API 文件會自動曎新䞊加入新的參敞和 body 請求 + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### 瞜結 + +瞜結䟆說 䜠就像宣告凜匏的參敞型別䞀暣只宣告了䞀次請求參敞和請求䞻體參敞等型別。 + +䜠䜿甚 Python 暙準型別䟆完成聲明。 + +䜠䞍需芁孞習新的語法、類別、方法或凜匏庫等等。 + +只需芁䜿甚 **Python 3.8 以䞊的版本**。 + +舉個範䟋比劂宣告 int 的型別 + +```Python +item_id: int +``` + +或是䞀個曎耇雜的 `Item` 暡型 + +```Python +item: Item +``` + +圚進行䞀次宣告埌䜠將獲埗 + +- 線茯噚支揎 + - 自動補党 + - 型別檢查 +- 資料驗證 + - 驗證倱敗時自動生成枅楚的錯誀蚊息 + - 可驗證倚局巢狀的 JSON 物件 +- 蜉換茞入的資料 蜉換䟆自網路請求到 Python 資料型別。包含以䞋敞據 + - JSON + - 路埑參敞 + - 查詢參敞 + - Cookies + - 請求暙頭 + - 衚單 + - 文件 +- 蜉換茞出的資料 蜉換 Python 資料型別到網路傳茞的 JSON + - 蜉換 Python 型別 (`str`、 `int`、 `float`、 `bool`、 `list` 等) + - `datetime` 物件 + - `UUID` 物件 + - 敞據暡型 + - ...還有其他曎倚 +- 自動生成的 API 文件包含 2 皮䞍同的䜿甚介面 + - Swagger UI + - ReDoc + +--- + +回到前面的的皋匏碌範䟋**FastAPI** 還會 + +- 驗證 `GET` 和 `PUT` 請求路埑䞭是吊包含 `item_id`。 +- 驗證 `GET` 和 `PUT` 請求䞭的 `item_id` 是吊是 `int` 型別。 + - 劂果驗證倱敗將會返回枅楚有甚的錯誀蚊息。 +- 查看 `GET` 請求䞭是吊有呜名為 `q` 的查詢參敞 (䟋劂 `http://127.0.0.1:8000/items/foo?q=somequery`)。 + - 因為 `q` 參敞被宣告為 `= None`所以是遞填的。 + - 劂果沒有宣告 `None`則歀參敞將會是必填 (䟋劂 `PUT` 範䟋的請求 body)。 +- 對斌 `PUT` 的請求 `/items/{item_id}`將會讀取 body 為 JSON + - 驗證是吊有必填屬性 `name` 䞔型別是 `str`。 + - 驗證是吊有必填屬性 `price` 䞔型別是 `float`。 + - 驗證是吊有遞填屬性 `is_offer` 䞔型別是 `bool`。 + - 以䞊驗證郜適甚斌倚局次巢狀 JSON 物件。 +- 自動蜉換 JSON 栌匏。 +- 透過 OpenAPI 文件䟆蚘錄所有內容可以被甚斌 + - 互動匏文件系統。 + - 自動為倚皮皋匏語蚀生成甚戶端的皋匏碌。 +- 提䟛兩皮亀互匏文件介面。 + +--- + +雖然我們只敘述了衚面的功胜䜆其寊䜠已經理解了它是劂䜕執行。 + +詊著修改以䞋皋匏碌 + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +埞 + +```Python + ... "item_name": item.name ... +``` + +修改為 + +```Python + ... "item_price": item.price ... +``` + +然埌觀察䜠的線茯噚會自動補党䞊䞔還知道他們的型別 + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +有關曎倚功胜的完敎範䟋可以參考 教孞 - 䜿甚者指南。 + +**劇透譊告** 教孞 - 䜿甚者指南內容有 + +- 對䟆自䞍同地方的**參敞**進行宣告像是 **headers**, **cookies**, **form 衚單**以及**䞊傳檔案**。 +- 劂䜕蚭定 **驗證限制** 像是 `maximum_length` or `regex`。 +- 簡單䞔非垞容易䜿甚的 **䟝賎泚入** 系統。 +- 安党性和身仜驗證包含提䟛支揎 **OAuth2**、**JWT tokens** 和 **HTTP Basic** 驗證。 +- 曎進階 (䜆同暣簡單) 的宣告 **倚局次的巢狀 JSON 栌匏** (感謝 Pydantic)。 +- **GraphQL** 與 Strawberry 以及其他的盞關凜匏庫進行敎合。 +- 曎倚其他的功胜 (感謝 Starlette) 像是 + - **WebSockets** + - æ–Œ HTTPX 和 `pytest` 的非垞簡單枬詊 + - **CORS** + - **Cookie Sessions** + - ...以及曎倚 + +## 效胜 + +䟆自獚立機構 TechEmpower 的枬詊結果顯瀺圚 Uvicorn 執行䞋的 **FastAPI** 是 最快的 Python 框架之䞀 僅次斌 Starlette 和 Uvicorn 本身 (兩者是 FastAPI 的底局)。 (\*) + +想了解曎倚蚊息可以參考 枬詊結果。 + +## 可遞的䟝賎套件 + +甚斌 Pydantic + +- email_validator - 甚斌電子郵件驗證。 +- pydantic-settings - 甚斌蚭定管理。 +- pydantic-extra-types - 甚斌與 Pydantic 䞀起䜿甚的額倖型別。 + +甚斌 Starlette + +- httpx - 䜿甚 `TestClient`時必須安裝。 +- jinja2 - 䜿甚預蚭的暡板配眮時必須安裝。 +- python-multipart - 需芁䜿甚 `request.form()` 對衚單進行 "解析" 時安裝。 +- itsdangerous - 需芁䜿甚 `SessionMiddleware` 支揎時安裝。 +- pyyaml - 甚斌支揎 Starlette 的 `SchemaGenerator` (劂果䜠䜿甚 FastAPI可胜䞍需芁它)。 +- ujson - 䜿甚 `UJSONResponse` 時必須安裝。 + +甚斌 FastAPI / Starlette + +- uvicorn - 甚斌加茉和運行應甚皋匏的服務噚。 +- orjson - 䜿甚 `ORJSONResponse`時必須安裝。 + +䜠可以䜿甚 `pip install "fastapi[all]"` 䟆安裝這些所有䟝賎套件。 + +## 授權 + +該項目遵埪 MIT 蚱可協議。 diff --git a/docs/zh-hant/mkdocs.yml b/docs/zh-hant/mkdocs.yml new file mode 100644 index 000000000..de18856f4 --- /dev/null +++ b/docs/zh-hant/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml diff --git a/scripts/docs.py b/scripts/docs.py index 37a7a3477..0643e414f 100644 --- a/scripts/docs.py +++ b/scripts/docs.py @@ -76,8 +76,6 @@ def callback() -> None: def new_lang(lang: str = typer.Argument(..., callback=lang_callback)): """ Generate a new docs translation directory for the language LANG. - - LANG should be a 2-letter language code, like: en, es, de, pt, etc. """ new_path: Path = Path("docs") / lang if new_path.exists(): From d74b3b25659b42233a669f032529880de8bd6c2d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Jan 2024 17:15:47 +0000 Subject: [PATCH 046/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a96954527..d5117ccd1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Initialize translations for Traditional Chinese. PR [#10505](https://github.com/tiangolo/fastapi/pull/10505) by [@hsuanchi](https://github.com/hsuanchi). * ✏ Tweak the german translation of `docs/de/docs/tutorial/index.md`. PR [#10962](https://github.com/tiangolo/fastapi/pull/10962) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix typo error in `docs/ko/docs/tutorial/path-params.md`. PR [#10758](https://github.com/tiangolo/fastapi/pull/10758) by [@2chanhaeng](https://github.com/2chanhaeng). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#1961](https://github.com/tiangolo/fastapi/pull/1961) by [@SwftAlpc](https://github.com/SwftAlpc). From c3019096e7cc7605a192712c6f7c1bafa1b3b57f Mon Sep 17 00:00:00 2001 From: Kani Kim Date: Sat, 20 Jan 2024 08:04:42 +0900 Subject: [PATCH 047/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/learn/index.md`=20(#10977)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/learn/index.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/ko/docs/learn/index.md diff --git a/docs/ko/docs/learn/index.md b/docs/ko/docs/learn/index.md new file mode 100644 index 000000000..7ac3a99b6 --- /dev/null +++ b/docs/ko/docs/learn/index.md @@ -0,0 +1,5 @@ +# ë°°ìš°êž° + +여Ʞ **FastAPI**륌 ë°°ìš°êž° 위한 입묞 자료와 자습서가 있습니닀. + +여러분은 FastAPI륌 ë°°ìš°êž° 위핎 **책**, **강의**, **공식 자료** 귞늬고 추천받은 방법을 고렀할 수 있습니닀. 😎 From 510c7a56a412302270c34ddfbbdd345a96870d23 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Jan 2024 23:05:10 +0000 Subject: [PATCH 048/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d5117ccd1..7ca9c17a5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/learn/index.md`. PR [#10977](https://github.com/tiangolo/fastapi/pull/10977) by [@KaniKim](https://github.com/KaniKim). * 🌐 Initialize translations for Traditional Chinese. PR [#10505](https://github.com/tiangolo/fastapi/pull/10505) by [@hsuanchi](https://github.com/hsuanchi). * ✏ Tweak the german translation of `docs/de/docs/tutorial/index.md`. PR [#10962](https://github.com/tiangolo/fastapi/pull/10962) by [@nilslindemann](https://github.com/nilslindemann). * ✏ Fix typo error in `docs/ko/docs/tutorial/path-params.md`. PR [#10758](https://github.com/tiangolo/fastapi/pull/10758) by [@2chanhaeng](https://github.com/2chanhaeng). From 62e6c888b79e0ad93656dbdfc0b8310de06ae7b5 Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Mon, 22 Jan 2024 13:43:10 -0500 Subject: [PATCH 049/222] =?UTF-8?q?=F0=9F=94=A7=20Update=20config=20in=20`?= =?UTF-8?q?label-approved.yml`=20to=20accept=20translations=20with=201=20r?= =?UTF-8?q?eviewer=20(#11007)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/label-approved.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml index 62daf2608..51be2413d 100644 --- a/.github/workflows/label-approved.yml +++ b/.github/workflows/label-approved.yml @@ -17,3 +17,11 @@ jobs: - uses: docker://tiangolo/label-approved:0.0.4 with: token: ${{ secrets.FASTAPI_LABEL_APPROVED }} + config: > + { + "approved-1": + { + "number": 1, + "await_label": "awaiting-review" + } + } From 60ea8f85a1fdac21f907ba5e21a09d935829b79a Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 18:43:31 +0000 Subject: [PATCH 050/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7ca9c17a5..270d5e46a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -72,6 +72,7 @@ hide: ### Internal +* 🔧 Update config in `label-approved.yml` to accept translations with 1 reviewer. PR [#11007](https://github.com/tiangolo/fastapi/pull/11007) by [@alejsdev](https://github.com/alejsdev). * 👷 Add changes-requested handling in GitHub Action issue manager. PR [#10971](https://github.com/tiangolo/fastapi/pull/10971) by [@tiangolo](https://github.com/tiangolo). * 🔧 Group dependencies on dependabot updates. PR [#10952](https://github.com/tiangolo/fastapi/pull/10952) by [@Kludex](https://github.com/Kludex). * ⬆ Bump actions/setup-python from 4 to 5. PR [#10764](https://github.com/tiangolo/fastapi/pull/10764) by [@dependabot[bot]](https://github.com/apps/dependabot). From 2fe1a1387b1c9bbcbb7f701e15472e491295bf59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 22 Jan 2024 20:26:14 +0100 Subject: [PATCH 051/222] =?UTF-8?q?=F0=9F=94=A8=20Verify=20`mkdocs.yml`=20?= =?UTF-8?q?languages=20in=20CI,=20update=20`docs.py`=20(#11009)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-docs.yml | 4 ++-- docs/en/mkdocs.yml | 6 ++++-- scripts/build-docs.sh | 2 +- scripts/docs.py | 32 +++++++++++++++++++++++++++++++- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index abf2b90f6..7783161b9 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -57,8 +57,8 @@ jobs: pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git - - name: Verify README - run: python ./scripts/docs.py verify-readme + - name: Verify Docs + run: python ./scripts/docs.py verify-docs - name: Export Language Codes id: show-langs run: | diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index fcac555eb..e965f4f28 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -242,7 +242,7 @@ markdown_extensions: format: !!python/name:pymdownx.superfences.fence_code_format '' pymdownx.tabbed: alternate_style: true - pymdownx.tilde: + pymdownx.tilde: null attr_list: null md_in_html: null extra: @@ -267,6 +267,8 @@ extra: alternate: - link: / name: en - English + - link: /bn/ + name: bn - àŠ¬àŠŸàŠ‚àŠ²àŠŸ - link: /de/ name: de - Deutsch - link: /es/ @@ -304,7 +306,7 @@ extra: - link: /zh/ name: zh - 汉语 - link: /zh-hant/ - name: zh - 繁體䞭文 + name: zh-hant - 繁體䞭文 - link: /em/ name: 😉 extra_css: diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index ebf864afa..7aa0a9a47 100755 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -4,5 +4,5 @@ set -e set -x # Check README.md is up to date -python ./scripts/docs.py verify-readme +python ./scripts/docs.py verify-docs python ./scripts/docs.py build-all diff --git a/scripts/docs.py b/scripts/docs.py index 0643e414f..59578a820 100644 --- a/scripts/docs.py +++ b/scripts/docs.py @@ -266,7 +266,7 @@ def live( mkdocs.commands.serve.serve(dev_addr="127.0.0.1:8008") -def update_config() -> None: +def get_updated_config_content() -> Dict[str, Any]: config = get_en_config() languages = [{"en": "/"}] new_alternate: List[Dict[str, str]] = [] @@ -294,12 +294,42 @@ def update_config() -> None: new_alternate.append({"link": url, "name": use_name}) new_alternate.append({"link": "/em/", "name": "😉"}) config["extra"]["alternate"] = new_alternate + return config + + +def update_config() -> None: + config = get_updated_config_content() en_config_path.write_text( yaml.dump(config, sort_keys=False, width=200, allow_unicode=True), encoding="utf-8", ) +@app.command() +def verify_config() -> None: + """ + Verify main mkdocs.yml content to make sure it uses the latest language names. + """ + typer.echo("Verifying mkdocs.yml") + config = get_en_config() + updated_config = get_updated_config_content() + if config != updated_config: + typer.secho( + "docs/en/mkdocs.yml outdated from docs/language_names.yml, " + "update language_names.yml and run " + "python ./scripts/docs.py update-languages", + color=typer.colors.RED, + ) + raise typer.Abort() + typer.echo("Valid mkdocs.yml ✅") + + +@app.command() +def verify_docs(): + verify_readme() + verify_config() + + @app.command() def langs_json(): langs = [] From 896f171aa2836765f359418742a416086021afc0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:26:37 +0000 Subject: [PATCH 052/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 270d5e46a..133ca03b3 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -72,6 +72,7 @@ hide: ### Internal +* 🔚 Verify `mkdocs.yml` languages in CI, update `docs.py`. PR [#11009](https://github.com/tiangolo/fastapi/pull/11009) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update config in `label-approved.yml` to accept translations with 1 reviewer. PR [#11007](https://github.com/tiangolo/fastapi/pull/11007) by [@alejsdev](https://github.com/alejsdev). * 👷 Add changes-requested handling in GitHub Action issue manager. PR [#10971](https://github.com/tiangolo/fastapi/pull/10971) by [@tiangolo](https://github.com/tiangolo). * 🔧 Group dependencies on dependabot updates. PR [#10952](https://github.com/tiangolo/fastapi/pull/10952) by [@Kludex](https://github.com/Kludex). From 01d774d38cb653504e6b1a9b942c9d2dc7238e1d Mon Sep 17 00:00:00 2001 From: Spike Ho Yeol Lee Date: Tue, 23 Jan 2024 04:31:27 +0900 Subject: [PATCH 053/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/body-nested-models.md`=20(#25?= =?UTF-8?q?06)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/body-nested-models.md | 243 ++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 docs/ko/docs/tutorial/body-nested-models.md diff --git a/docs/ko/docs/tutorial/body-nested-models.md b/docs/ko/docs/tutorial/body-nested-models.md new file mode 100644 index 000000000..7b41aa35b --- /dev/null +++ b/docs/ko/docs/tutorial/body-nested-models.md @@ -0,0 +1,243 @@ +# 볞묞 - 쀑첩 몚덞 + +**FastAPI**륌 읎용하멎 (Pydantic 덕분에) 닚독윌로 깊읎 쀑첩된 몚덞을 정의, 검슝, 묞서화하며 사용할 수 있습니닀. +## 늬슀튞 필드 + +얎튞늬뷰튞륌 서람타입윌로 정의할 수 있습니닀. 예륌 듀얎 파읎썬 `list`는: + +```Python hl_lines="14" +{!../../../docs_src/body_nested_models/tutorial001.py!} +``` + +읎는 `tags`륌 항목 늬슀튞로 만듭니닀. 각 항목의 타입을 선얞하지 않더띌도요. + +## 타입 맀개변수가 있는 늬슀튞 필드 + +하지만 파읎썬은 낎부의 타입읎나 "타입 맀개변수"륌 ì„ ì–ží•  수 있는 특정 방법읎 있습니닀: + +### typing의 `List` 임포튞 + +뚌저, 파읎썬 표쀀 `typing` 몚듈에서 `List`륌 임포튞합니닀: + +```Python hl_lines="1" +{!../../../docs_src/body_nested_models/tutorial002.py!} +``` + +### 타입 맀개변수로 `List` ì„ ì–ž + +`list`, `dict`, `tuple`곌 같은 타입 맀개변수(낎부 타입)륌 갖는 타입을 선얞하렀멎: + +* `typing` 몚듈에서 임포튞 +* 대ꎄ혞륌 사용하여 "타입 맀개변수"로 낎부 타입 전달: `[` 및 `]` + +```Python +from typing import List + +my_list: List[str] +``` + +읎 몚든 것은 타입 선얞을 위한 표쀀 파읎썬 묞법입니닀. + +낎부 타입을 갖는 몚덞 얎튞늬뷰튞에 대핮 동음한 표쀀 묞법을 사용하섞요. + +마찬가지로 예제에서 `tags`륌 구첎적윌로 "묞자엎의 늬슀튞"로 만듀 수 있습니닀: + +```Python hl_lines="14" +{!../../../docs_src/body_nested_models/tutorial002.py!} +``` + +## 집합 타입 + +귞런데 생각핎볎니 태귞는 반복되멎 안 돌고, 고유한(Unique) 묞자엎읎얎알 할 것 같습니닀. + +귞늬고 파읎썬은 집합을 위한 특별한 데읎터 타입 `set`읎 있습니닀. + +귞렇닀멎 `Set`을 임포튞 하고 `tags`륌 `str`의 `set`윌로 ì„ ì–ží•  수 있습니닀: + +```Python hl_lines="1 14" +{!../../../docs_src/body_nested_models/tutorial003.py!} +``` + +덕분에 쀑복 데읎터가 있는 요청을 수신하더띌도 고유한 항목듀의 집합윌로 변환됩니닀. + +귞늬고 핎당 데읎터륌 출력 할 때마닀 소슀에 쀑복읎 있더띌도 고유한 항목듀의 집합윌로 출력됩니닀. + +또한 귞에 따띌 죌석읎 생Ʞ고 묞서화됩니닀. + +## 쀑첩 몚덞 + +Pydantic 몚덞의 각 얎튞늬뷰튞는 타입을 갖습니닀. + +귞런데 핎당 타입 자첎로 또닀륞 Pydantic 몚덞의 타입읎 될 수 있습니닀. + +귞러므로 특정한 얎튞늬뷰튞의 읎늄, 타입, 검슝을 사용하여 깊게 쀑첩된 JSON "객첎"륌 ì„ ì–ží•  수 있습니닀. + +몚든 것읎 닚독윌로 쀑첩됩니닀. + +### 서람몚덞 정의 + +예륌 듀얎, `Image` 몚덞을 ì„ ì–ží•  수 있습니닀: + +```Python hl_lines="9-11" +{!../../../docs_src/body_nested_models/tutorial004.py!} +``` + +### 서람몚듈을 타입윌로 사용 + +귞늬고 얎튞늬뷰튞의 타입윌로 사용할 수 있습니닀: + +```Python hl_lines="20" +{!../../../docs_src/body_nested_models/tutorial004.py!} +``` + +읎는 **FastAPI**가 닀음곌 유사한 볞묞을 Ʞ대한닀는 것을 의믞합니닀: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": ["rock", "metal", "bar"], + "image": { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + } +} +``` + +닀시 한번, **FastAPI**륌 사용하여 핎당 선얞을 핚윌로썚 얻는 것은: + +* 쀑첩 몚덞도 펞집Ʞ 지원(자동완성 등) +* 데읎터 변환 +* 데읎터 검슝 +* 자동 묞서화 + +## 특별한 타입곌 검슝 + +`str`, `int`, `float` 등곌 같은 닚음 타입곌는 별개로, `str`을 상속하는 더 복잡한 닚음 타입을 사용할 수 있습니닀. + +몚든 옵션을 볎렀멎, Pydantic's exotic types 묞서륌 확읞하섞요. 닀음 장에서 몇가지 예제륌 볌 수 있습니닀. + +예륌 듀얎 `Image` 몚덞 안에 `url` 필드륌 `str` 대신 Pydantic의 `HttpUrl`로 ì„ ì–ží•  수 있습니닀: + +```Python hl_lines="4 10" +{!../../../docs_src/body_nested_models/tutorial005.py!} +``` + +읎 묞자엎읎 유횚한 URL읞지 검사하고 JSON 슀킀마/OpenAPI로 묞서화 됩니닀. + +## 서람몚덞 늬슀튞륌 갖는 얎튞늬뷰튞 + +`list`, `set` 등의 서람타입윌로 Pydantic 몚덞을 사용할 수도 있습니닀: + +```Python hl_lines="20" +{!../../../docs_src/body_nested_models/tutorial006.py!} +``` + +아래와 같은 JSON 볞묞윌로 예상(변환, 검슝, 묞서화 등을)합니닀: + +```JSON hl_lines="11" +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": [ + "rock", + "metal", + "bar" + ], + "images": [ + { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + }, + { + "url": "http://example.com/dave.jpg", + "name": "The Baz" + } + ] +} +``` + +!!! info "정볎" + `images` 킀가 얎떻게 읎믞지 객첎 늬슀튞륌 갖는지 죌목하섞요. + +## 깊게 쀑첩된 몚덞 + +닚독윌로 깊게 쀑첩된 몚덞을 정의할 수 있습니닀: + +```Python hl_lines="9 14 20 23 27" +{!../../../docs_src/body_nested_models/tutorial007.py!} +``` + +!!! info "정볎" + `Offer`가 선택사항 `Image` 늬슀튞륌 찚례로 갖는 `Item` 늬슀튞륌 얎떻게 가지고 있는지 죌목하섞요 + +## 순수 늬슀튞의 볞묞 + +예상되는 JSON 볞묞의 최상위 값읎 JSON `array`(파읎썬 `list`)멎, Pydantic 몚덞에서와 마찬가지로 핚수의 맀개변수에서 타입을 ì„ ì–ží•  수 있습니닀: + +```Python +images: List[Image] +``` + +읎륌 아래처럌: + +```Python hl_lines="15" +{!../../../docs_src/body_nested_models/tutorial008.py!} +``` + +## 얎디서나 펞집Ʞ 지원 + +귞늬고 얎디서나 펞집Ʞ 지원을 받을수 있습니닀. + +늬슀튞 낎부 항목의 겜우에도: + + + +Pydantic 몚덞 대신에 `dict`륌 직접 사용하여 작업할 겜우, 읎러한 펞집Ʞ 지원을 받을수 없습니닀. + +하지만 수신한 딕셔너늬가 자동윌로 변환되고 출력도 자동윌로 JSON윌로 변환되므로 걱정할 필요는 없습니닀. + +## 당독 `dict`의 볞묞 + +음부 타입의 킀와 닀륞 타입의 값을 사용하여 `dict`로 볞묞을 ì„ ì–ží•  수 있습니닀. + +(Pydantic을 사용한 겜우처럌) 유횚한 필드/얎튞늬뷰튞 읎늄읎 묎엇읞지 알 필요가 없습니닀. + +아직 몚륎는 킀륌 받윌렀는 겜우 유용합니닀. + +--- + +닀륞 유용한 겜우는 닀륞 타입의 킀륌 가질 때입니닀. 예. `int`. + +여Ʞ서 ê·ž 겜우륌 볌 것입니닀. + +읎 겜우, `float` 값을 가진 `int` 킀가 있는 몚든 `dict`륌 받아듀입니닀: + +```Python hl_lines="15" +{!../../../docs_src/body_nested_models/tutorial009.py!} +``` + +!!! tip "팁" + JSON은 였직 `str`형 킀만 지원한닀는 것을 엌두에 두섞요. + + 하지만 Pydantic은 자동 데읎터 변환읎 있습니닀. + + 슉, API 큎띌읎얞튞가 묞자엎을 킀로 볎낎더띌도 핎당 묞자엎읎 순수한 정수륌 포핚하는한 Pydantic은 읎륌 변환하고 검슝합니닀. + + 귞러므로 `weights`로 받은 `dict`는 싀제로 `int` 킀와 `float` 값을 가집니닀. + +## 요앜 + +**FastAPI**륌 사용하멎 Pydantic 몚덞읎 제공하는 최대 유연성을 확볎하멎서 윔드륌 간닚하고 짧게, 귞늬고 우아하게 유지할 수 있습니닀. + +묌론 아래의 읎점도 있습니닀: + +* 펞집Ʞ 지원 (자동완성읎 얎디서나!) +* 데읎터 변환 (음명 파싱/직렬화) +* 데읎터 검슝 +* 슀킀마 묞서화 +* 자동 묞서 From 5fb87313e20c68146c653cdb249e28fead4c7dd4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:31:48 +0000 Subject: [PATCH 054/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 133ca03b3..0e4da3b9f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#2506](https://github.com/tiangolo/fastapi/pull/2506) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/learn/index.md`. PR [#10977](https://github.com/tiangolo/fastapi/pull/10977) by [@KaniKim](https://github.com/KaniKim). * 🌐 Initialize translations for Traditional Chinese. PR [#10505](https://github.com/tiangolo/fastapi/pull/10505) by [@hsuanchi](https://github.com/hsuanchi). * ✏ Tweak the german translation of `docs/de/docs/tutorial/index.md`. PR [#10962](https://github.com/tiangolo/fastapi/pull/10962) by [@nilslindemann](https://github.com/nilslindemann). From 2a8f8d1ac0edd0f021094d1afd82cbd690565d4c Mon Sep 17 00:00:00 2001 From: JRIM Date: Tue, 23 Jan 2024 04:34:47 +0900 Subject: [PATCH 055/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/python-types.md`=20(#2267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/python-types.md | 315 +++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 docs/ko/docs/python-types.md diff --git a/docs/ko/docs/python-types.md b/docs/ko/docs/python-types.md new file mode 100644 index 000000000..16b93a7a9 --- /dev/null +++ b/docs/ko/docs/python-types.md @@ -0,0 +1,315 @@ +# 파읎썬 타입 소개 + +파읎썬은 선택적윌로 "타입 힌튾(type hints)"륌 지원합니닀. + +읎러한 **타입 힌튾**듀은 변수의 타입을 ì„ ì–ží•  수 있게 핎죌는 특수한 구묞입니닀. + +변수의 타입을 지정하멎 에디터와 툎읎 더 많은 도움을 쀄 수 있게 됩니닀. + +읎 묞서는 파읎썬 타입 힌튞에 대한 **빠륞 자습서 / 낎용환Ʞ** 수쀀의 묞서입니닀. 여Ʞ서는 **FastAPI**륌 ì“°êž° 위한 최소한의 낎용만을 닀룹니닀. + +**FastAPI**는 타입 힌튞에 Ʞ반을 두고 있윌며, 읎는 많은 장점곌 읎익읎 있습니닀. + +비록 **FastAPI**륌 쓰지 않는닀고 하더띌도, 조ꞈ읎띌도 알아두멎 도움읎 될 것입니닀. + +!!! note "ì°žê³ " + 파읎썬에 능숙하셔서 타입 힌튞에 대핮 몚두 아신닀멎, 닀음 챕터로 걎너뛰섞요. + +## 동Ʞ 부여 + +간닚한 예제부터 시작핎뎅시닀: + +```Python +{!../../../docs_src/python_types/tutorial001.py!} +``` + +읎 프로귞랚을 싀행한 결곌값: + +``` +John Doe +``` + +핚수는 아래와 같읎 싀행됩니닀: + +* `first_name`곌 `last_name`륌 받습니닀. +* `title()`로 각 첫 묞자륌 대묞자로 변환시킵니닀. +* 두 닚얎륌 쀑간에 공백을 두고 연결합니닀. + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial001.py!} +``` + +### 윔드 수정 + +읎걎 맀우 간닚한 프로귞랚입니닀. + +귞런데 처음부터 작성한닀고 생각을 핎뎅시닀. + +여러분은 맀개변수륌 쀀비했고, 핚수륌 정의하Ʞ 시작했을 겁니닀. + +읎때 "첫 Ꞁ자륌 대묞자로 바꟞는 핚수"륌 혞출핎알 합니닀. + +`upper`였나? 아니멎 `uppercase`? `first_uppercase`? `capitalize`? + +귞때 개발자듀의 였랜 친구, 에디터 자동완성을 시도핎뎅니닀. + +당신은 `first_name`륌 입력한 ë’€ 점(`.`)을 입력하고 자동완성을 쌜Ʞ 위핎서 `Ctrl+Space`륌 눌렀습니닀. + +하지만 슬프게도 아묎런 도움읎 되지 않습니닀: + + + +### 타입 추가하Ʞ + +읎전 버전에서 한 쀄만 수정핎뎅시닀. + +저희는 읎 핚수의 맀개변수 부분: + +```Python + first_name, last_name +``` + +을 아래와 같읎 바꿀 겁니닀: + +```Python + first_name: str, last_name: str +``` + +읎게 닀입니닀. + +읎게 "타입 힌튾"입니닀: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial002.py!} +``` + +타입힌튞는 닀음곌 같읎 Ʞ볞 값을 선얞하는 것곌는 닀늅니닀: + +```Python + first_name="john", last_name="doe" +``` + +읎는 닀륞 것입니닀. + +등혞(`=`) 대신 윜론(`:`)을 쓰고 있습니닀. + +음반적윌로 타입힌튞륌 추가한닀고 핎서 특별하게 ì–Žë–€ 음읎 음얎나지도 않습니닀. + +귞렇지만 읎제, 닀시 핚수륌 만드는 도쀑읎띌고 생각핎뎅시닀. 닀만 읎번엔 타입 힌튞가 있습니닀. + +같은 상황에서 `Ctrl+Space`로 자동완성을 작동시킀멎, + + + +아래와 같읎 "귞렇지!"하는 옵션읎 나올때까지 슀크례을 낎렀서 볌 수 있습니닀: + + + +## 더 큰 동Ʞ부여 + +아래 핚수륌 볎멎, 읎믞 타입 힌튞가 적용되얎 있는 걞 볌 수 있습니닀: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial003.py!} +``` + +펞집Ʞ가 변수의 타입을 알고 있Ʞ 때묞에, 자동완성 뿐 아니띌 에러도 확읞할 수 있습니닀: + + + +읎제 고쳐알하는 걞 알Ʞ 때묞에, `age`륌 `str(age)`곌 같읎 묞자엎로 바꟞게 됩니닀: + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial004.py!} +``` + +## 타입 ì„ ì–ž + +방ꞈ 핚수의 맀개변수로썚 타입 힌튞륌 선얞하는 죌요 장소륌 볎았습니닀. + +읎 위치는 여러분읎 **FastAPI**와 핚께 읎륌 사용하는 죌요 장소입니닀. + +### Simple 타입 + +`str`뿐 아니띌 몚든 파읎썬 표쀀 타입을 ì„ ì–ží•  수 있습니닀. + +예륌 듀멎: + +* `int` +* `float` +* `bool` +* `bytes` + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial005.py!} +``` + +### 타입 맀개변수륌 활용한 Generic(제넀늭) 타입 + +`dict`, `list`, `set`, `tuple`곌 같은 값을 저장할 수 있는 데읎터 구조가 있고, 낎부의 값은 각자의 타입을 가질 수도 있습니닀. + +타입곌 낎부 타입을 선얞하Ʞ 위핎서는 파읎썬 표쀀 몚듈읞 `typing`을 읎용핎알 합니닀. + +구첎적윌로는 아래 타입 힌튞륌 지원합니닀. + +#### `List` + +예륌 듀멎, `str`의 `list`읞 변수륌 정의핎뎅시닀. + +`typing`에서 `List`(대묞자 `L`)륌 import 합니닀. + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +윜론(`:`) 묞법을 읎용하여 변수륌 선얞합니닀. + +타입윌로는 `List`륌 넣얎쀍니닀. + +읎때 배엎은 낎부 타입을 포핚하는 타입읎Ʞ 때묞에 대ꎄ혞 안에 넣얎쀍니닀. + +```Python hl_lines="4" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +!!! tip "팁" + 대ꎄ혞 안의 낎부 타입은 "타입 맀개변수(type paramters)"띌고 합니닀. + + 읎번 예제에서는 `str`읎 `List`에 듀얎간 타입 맀개변수 입니닀. + +읎는 "`items`은 `list`읞데, 배엎에 듀얎있는 아읎템 각각은 `str`읎닀"띌는 뜻입니닀. + +읎렇게 핚윌로썚, 에디터는 배엎에 듀얎있는 아읎템을 처늬할때도 도움을 쀄 수 있게 됩니닀: + + + +타입읎 없윌멎 읎걎 거의 불가능읎나 닀늄 없습니닀. + +변수 `item`은 `items`의 개별 요소띌는 사싀을 알아두섞요. + +귞늬고 에디터는 계속 `str`띌는 사싀을 알고 도와쀍니닀. + +#### `Tuple`곌 `Set` + +`tuple`곌 `set`도 동음하게 ì„ ì–ží•  수 있습니닀. + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial007.py!} +``` + +읎 뜻은 아래와 같습니닀: + +* 변수 `items_t`는, 찚례대로 `int`, `int`, `str`읞 `tuple`읎닀. +* 변수 `items_s`는, 각 아읎템읎 `bytes`읞 `set`읎닀. + +#### `Dict` + +`dict`륌 선얞하렀멎 컎마로 구분된 2개의 파띌믞터가 필요합니닀. + +첫 번짞 맀개변수는 `dict`의 í‚€(key)읎고, + +두 번짞 맀개변수는 `dict`의 값(value)입니닀. + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial008.py!} +``` + +읎 뜻은 아래와 같습니닀: + +* 변수 `prices`는 `dict`읎닀: + * `dict`의 í‚€(key)는 `str`타입읎닀. (각 아읎템의 읎늄(name)) + * `dict`의 값(value)는 `float`타입읎닀. (각 아읎템의 가격(price)) + +#### `Optional` + +`str`곌 같읎 타입을 ì„ ì–ží•  때 `Optional`을 쓞 수도 있는데, "선택적(Optional)"읎Ʞ때묞에 `None`도 될 수 있습니닀: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009.py!} +``` + +`Optional[str]`을 `str` 대신 쓰게 되멎, 특정 값읎 싀제로는 `None`읎 될 수도 있는데 항상 `str`읎띌고 가정하는 상황에서 에디터가 에러륌 찟게 도와쀄 수 있습니닀. + +#### Generic(제넀늭) 타입 + +읎 타입은 대ꎄ혞 안에 맀개변수륌 가지며, 종류는: + +* `List` +* `Tuple` +* `Set` +* `Dict` +* `Optional` +* ...등등 + +위와 같은 타입은 **Generic(제넀늭) 타입** 혹은 **Generics(제넀늭슀)**띌고 불늜니닀. + +### 타입윌로서의 큎래슀 + +변수의 타입윌로 큎래슀륌 ì„ ì–ží•  수도 있습니닀. + +읎늄(name)을 가진 `Person` 큎래슀가 있닀고 핎뎅시닀. + +```Python hl_lines="1-3" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +귞렇게 하멎 변수륌 `Person`읎띌고 ì„ ì–ží•  수 있게 됩니닀. + +```Python hl_lines="6" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +귞늬고 역시나 몚든 에디터 도움을 받게 되겠죠. + + + +## Pydantic 몚덞 + +Pydantic은 데읎터 검슝(Validation)을 위한 파읎썬 띌읎람러늬입니닀. + +당신은 속성듀을 포핚한 큎래슀 형태로 "몚양(shape)"을 ì„ ì–ží•  수 있습니닀. + +귞늬고 각 속성은 타입을 가지고 있습니닀. + +읎 큎래슀륌 활용하여서 값을 가지고 있는 읞슀턎슀륌 만듀게 되멎, 필요한 겜우에는 적당한 타입윌로 변환까지 시킀Ʞ도 하여 데읎터가 포핚된 객첎륌 반환합니닀. + +귞늬고 결곌 객첎에 대핎서는 에디터의 도움을 받을 수 있게 됩니닀. + +Pydantic 공식 묞서 예시: + +```Python +{!../../../docs_src/python_types/tutorial011.py!} +``` + +!!! info "정볎" + Pydantic<에 대핮 더 배우고 싶닀멎 공식 묞서륌 찞고하섞요. + + +**FastAPI**는 몚두 Pydantic을 Ʞ반윌로 되얎 있습니닀. + +읎 몚든 것읎 싀제로 얎떻게 사용되는지에 대핎서는 [자습서 - 사용자 안낎서](tutorial/index.md){.internal-link target=_blank} 에서 더 많읎 확읞하싀 수 있습니닀. + +## **FastAPI**에서의 타입 힌튾 + +**FastAPI**는 여러 부분에서 타입 힌튞의 장점을 췚하고 있습니닀. + +**FastAPI**에서 타입 힌튞와 핚께 맀개변수륌 선얞하멎 장점은: + +* **에디터 도움**. +* **타입 확읞**. + +...귞늬고 **FastAPI**는 같은 정의륌 아래에도 적용합니닀: + +* **요구사항 정의**: 요청 겜로 맀개변수, 쿌늬 맀개변수, 헀더, 바디, 의졎성 등. +* **데읎터 변환**: 요청에서 요구한 타입윌로. +* **데읎터 검슝**: 각 요청마닀: + * 데읎터가 유횚하지 않은 겜우에는 **자동윌로 에러**륌 발생합니닀. +* OpenAPI륌 활용한 **API 묞서화**: + * 자동윌로 상혞작용하는 유저 읞터페읎슀에 쓰읎게 됩니닀. + +위 낎용읎 닀소 추상적음 수도 있지만, 걱정마섞요. [자습서 - 사용자 안낎서](tutorial/index.md){.internal-link target=_blank}에서 전부 확읞 가능합니닀. + +가장 쀑요한 걎, 표쀀 파읎썬 타입을 한 곳에서(큎래슀륌 더하거나, 데윔레읎터 사용하는 대신) 사용핚윌로썚 **FastAPI**가 당신을 위핎 많은 음을 핎쀀닀는 사싀읎죠. + +!!! info "정볎" + 만앜 몚든 자습서륌 ë‹€ 볎았음에도 타입에 대핎서 더 볎고자 방묞한 겜우에는 `mypy`에서 제공하는 "cheat sheet"읎 좋은 자료가 될 겁니닀. From eea7635713bdda4a2ad9393efe5a720d15a22122 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:36:25 +0000 Subject: [PATCH 056/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0e4da3b9f..2eb764e1e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/python-types.md`. PR [#2267](https://github.com/tiangolo/fastapi/pull/2267) by [@jrim](https://github.com/jrim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#2506](https://github.com/tiangolo/fastapi/pull/2506) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/learn/index.md`. PR [#10977](https://github.com/tiangolo/fastapi/pull/10977) by [@KaniKim](https://github.com/KaniKim). * 🌐 Initialize translations for Traditional Chinese. PR [#10505](https://github.com/tiangolo/fastapi/pull/10505) by [@hsuanchi](https://github.com/hsuanchi). From 87a4c9ef01afe9066678d655866c5f5cd8bc26c2 Mon Sep 17 00:00:00 2001 From: Spike Ho Yeol Lee Date: Tue, 23 Jan 2024 04:37:01 +0900 Subject: [PATCH 057/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/query-params-str-validations.?= =?UTF-8?q?md`=20(#2415)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/query-params-str-validations.md | 303 ++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 docs/ko/docs/tutorial/query-params-str-validations.md diff --git a/docs/ko/docs/tutorial/query-params-str-validations.md b/docs/ko/docs/tutorial/query-params-str-validations.md new file mode 100644 index 000000000..7ae100dcc --- /dev/null +++ b/docs/ko/docs/tutorial/query-params-str-validations.md @@ -0,0 +1,303 @@ +# 쿌늬 맀개변수와 묞자엎 검슝 + +**FastAPI**륌 사용하멎 맀개변수에 대한 추가 정볎 및 검슝을 ì„ ì–ží•  수 있습니닀. + +읎 응용 프로귞랚을 예로 듀얎볎겠습니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial001.py!} +``` + +쿌늬 맀개변수 `q`는 `Optional[str]` 자료형입니닀. 슉, `str` 자료형읎지만 `None` 역시 될 수 있음을 뜻하고, 싀제로 Ʞ볞값은 `None`읎Ʞ 때묞에 FastAPI는 읎 맀개변수가 필수가 아니띌는 것을 압니닀. + +!!! note "ì°žê³ " + FastAPI는 `q`의 Ʞ볞값읎 `= None`읎Ʞ 때묞에 필수가 아님을 압니닀. + + `Optional[str]`에 있는 `Optional`은 FastAPI가 사용하는게 아니지만, 펞집Ʞ에게 더 나은 지원곌 였류 탐지륌 제공하게 핎쀍니닀. + +## 추가 검슝 + +`q`가 선택적읎지만 값읎 죌얎질 때마닀 **값읎 50 Ꞁ자륌 쎈곌하지 않게** 강제하렀 합니닀. + +### `Query` 임포튞 + +읎륌 위핎 뚌저 `fastapi`에서 `Query`륌 임포튞합니닀: + +```Python hl_lines="3" +{!../../../docs_src/query_params_str_validations/tutorial002.py!} +``` + +## Ʞ볞값윌로 `Query` 사용 + +읎제 `Query`륌 맀개변수의 Ʞ볞값윌로 사용하여 `max_length` 맀개변수륌 50윌로 섀정합니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial002.py!} +``` + +Ʞ볞값 `None`을 `Query(None)`윌로 바꿔알 하므로, `Query`의 첫 번짞 맀개변수는 Ʞ볞값을 정의하는 것곌 같은 목적윌로 사용됩니닀. + +귞러므로: + +```Python +q: Optional[str] = Query(None) +``` + +...위 윔드는 아래와 동음하게 맀개변수륌 선택적윌로 만듭니닀: + +```Python +q: Optional[str] = None +``` + +하지만 명시적윌로 쿌늬 맀개변수륌 선얞합니닀. + +!!! info "정볎" + FastAPI는 닀음 부분에 ꎀ심읎 있습니닀: + + ```Python + = None + ``` + + 또는: + + ```Python + = Query(None) + ``` + + 귞늬고 `None`을 사용하여 쿌띌 맀개변수가 필수적읎지 않닀는 것을 파악합니닀. + + `Optional` 부분은 펞집Ʞ에게 더 나은 지원을 제공하Ʞ 위핎서만 사용됩니닀. + +또한 `Query`로 더 많은 맀개변수륌 전달할 수 있습니닀. 지ꞈ의 겜우 묞자엎에 적용되는 `max_length` 맀개변수입니닀: + +```Python +q: str = Query(None, max_length=50) +``` + +읎는 데읎터륌 검슝할 것읎고, 데읎터가 유횚하지 않닀멎 명백한 였류륌 볎여죌며, OpenAPI 슀킀마 *겜로 동작*에 맀개변수륌 묞서화 합니닀. + +## 검슝 추가 + +맀개변수 `min_length` 또한 추가할 수 있습니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial003.py!} +``` + +## 정규식 추가 + +맀개변수와 음치핎알 하는 정규표현식을 정의할 수 있습니닀: + +```Python hl_lines="10" +{!../../../docs_src/query_params_str_validations/tutorial004.py!} +``` + +읎 특정 정규표현식은 전달 받은 맀개변수 값을 검사합니닀: + +* `^`: 읎전에 묞자가 없고 뒀따륎는 묞자로 시작합니닀. +* `fixedquery`: 정확히 `fixedquery` 값을 갖습니닀. +* `$`: 여Ʞ서 끝나고 `fixedquery` 읎후로 아묎 묞자도 갖지 않습니닀. + +**"정규표현식"** 개념에 대핮 상싀감을 느ꌈ닀멎 걱정하지 않아도 됩니닀. 많은 사람에게 얎렀욎 죌제입니닀. 아직은 정규표현식 없읎도 많은 작업듀을 할 수 있습니닀. + +하지만 얞제든지 가서 배욞수 있고, **FastAPI**에서 직접 사용할 수 있닀는 사싀을 알고 있얎알 합니닀. + +## Ʞ볞값 + +Ʞ볞값윌로 사용하는 첫 번짞 읞자로 `None`을 전달하듯읎, 닀륞 값을 전달할 수 있습니닀. + +`min_length`가 `3`읎고, Ʞ볞값읎 `"fixedquery"`읞 쿌늬 맀개변수 `q`륌 선얞핎뎅시닀: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial005.py!} +``` + +!!! note "ì°žê³ " + Ʞ볞값을 갖는 것만윌로 맀개변수는 선택적읎 됩니닀. + +## 필수로 만듀Ʞ + +더 많은 검슝읎나 메타데읎터륌 ì„ ì–ží•  필요가 없는 겜우, 닀음곌 같읎 Ʞ볞값을 선얞하지 않고 쿌늬 맀개변수 `q`륌 필수로 만듀 수 있습니닀: + +```Python +q: str +``` + +아래 대신: + +```Python +q: Optional[str] = None +``` + +귞러나 읎제 닀음곌 같읎 `Query`로 선얞합니닀: + +```Python +q: Optional[str] = Query(None, min_length=3) +``` + +귞래서 `Query`륌 필수값윌로 만듀얎알 할 때멎, 첫 번짞 읞자로 `...`륌 사용할 수 있습니닀: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial006.py!} +``` + +!!! info "정볎" + 읎전에 `...`륌 볞적읎 없닀멎: 특별한 닚음값윌로, 파읎썬의 음부읎며 "Ellipsis"띌 부늅니닀. + +읎렇게 하멎 **FastAPI**가 읎 맀개변수는 필수임을 알 수 있습니닀. + +## 쿌늬 맀개변수 늬슀튞 / 닀쀑값 + +쿌늬 맀개변수륌 `Query`와 핚께 명시적윌로 ì„ ì–ží•  때, 값듀의 늬슀튞나 닀륞 방법윌로 여러 값을 받도록 ì„ ì–ž 할 수도 있습니닀. + +예륌 듀얎, URL에서 여러번 나였는 `q` 쿌늬 맀개변수륌 선얞하렀멎 닀음곌 같읎 작성할 수 있습니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial011.py!} +``` + +아래와 같은 URL을 사용합니닀: + +``` +http://localhost:8000/items/?q=foo&q=bar +``` + +여러 `q` *쿌늬 맀개변수* 값듀을 (`foo` 및 `bar`) 파읎썬 `list`로 *겜로 작동 핚수* 낮 *핚수 맀개변수* `q`로 전달 받습니닀. + +따띌서 핎당 URL에 대한 응답은 닀음곌 같습니닀: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +!!! tip "팁" + 위의 예와 같읎 `list` 자료형윌로 쿌늬 맀개변수륌 선얞하렀멎 `Query`륌 명시적윌로 사용핎알 합니닀. 귞렇지 않윌멎 요청 볞묞윌로 핎석됩니닀. + +대화형 API 묞서는 여러 값을 허용하도록 수정 됩니닀: + + + +### 쿌늬 맀개변수 늬슀튞 / Ʞ볞값을 사용하는 닀쀑값 + +귞늬고 제공된 값읎 없윌멎 Ʞ볞 `list` 값을 정의할 수도 있습니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial012.py!} +``` + +아래로 읎동한닀멎: + +``` +http://localhost:8000/items/ +``` + +`q`의 Ʞ볞값은: `["foo", "bar"]`읎며 응답은 닀음읎 됩니닀: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +#### `list` 사용하Ʞ + +`List[str]` 대신 `list`륌 직접 사용할 수도 있습니닀: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial013.py!} +``` + +!!! note "ì°žê³ " + 읎 겜우 FastAPI는 늬슀튞의 낎용을 검사하지 않음을 명심하Ʞ 바랍니닀. + + 예륌 듀얎, `List[int]`는 늬슀튞 낎용읎 정수읞지 검사(및 묞서화)합니닀. 하지만 `list` 닚독음 겜우는 아닙니닀. + +## 더 많은 메타데읎터 ì„ ì–ž + +맀개변수에 대한 정볎륌 추가할 수 있습니닀. + +핎당 정볎는 생성된 OpenAPI에 포핚되고 묞서 사용자 읞터페읎슀 및 왞부 도구에서 사용됩니닀. + +!!! note "ì°žê³ " + 도구에 따띌 OpenAPI 지원 수쀀읎 닀륌 수 있음을 명심하Ʞ 바랍니닀. + + 음부는 아직 선얞된 추가 정볎륌 몚두 표시하지 않을 수 있지만, 대부분의 겜우 누띜된 Ʞ능은 읎믞 개발 계획읎 있습니닀. + +`title`을 추가할 수 있습니닀: + +```Python hl_lines="10" +{!../../../docs_src/query_params_str_validations/tutorial007.py!} +``` + +귞늬고 `description`도 추가할 수 있습니닀: + +```Python hl_lines="13" +{!../../../docs_src/query_params_str_validations/tutorial008.py!} +``` + +## 별칭 맀개변수 + +맀개변수가 `item-query`읎Ꞟ 원한닀고 가정핎 뎅시닀. + +마치 닀음곌 같습니닀: + +``` +http://127.0.0.1:8000/items/?item-query=foobaritems +``` + +귞러나 `item-query`은 유횚한 파읎썬 변수 읎늄읎 아닙니닀. + +가장 가까욎 것은 `item_query`음 겁니닀. + +하지만 정확히`item-query`읎Ꞟ 원합니닀... + +읎럎 겜우 `alias`륌 ì„ ì–ží•  수 있윌며, 핎당 별칭은 맀개변수 값을 찟는 데 사용됩니닀: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial009.py!} +``` + +## 맀개변수 사용하지 않게 하Ʞ + +읎제는 더읎상 읎 맀개변수륌 마음에 듀얎하지 않는닀고 가정핎 뎅시닀. + +읎 맀개변수륌 사용하는 큎띌읎얞튞가 있Ʞ 때묞에 한동안은 낚겚둬알 하지만, 사용되지 않는닀(deprecated)ê³  확싀하게 묞서에서 볎여죌고 싶습니닀. + +귞렇닀멎 `deprecated=True` 맀개변수륌 `Query`로 전달합니닀: + +```Python hl_lines="18" +{!../../../docs_src/query_params_str_validations/tutorial010.py!} +``` + +묞서가 아래와 같읎 볎음겁니닀: + + + +## 요앜 + +맀개변수에 검슝곌 메타데읎터륌 추가 ì„ ì–ží•  수 있습니닀. + +제넀늭 검슝곌 메타데읎터: + +* `alias` +* `title` +* `description` +* `deprecated` + +특정 묞자엎 검슝: + +* `min_length` +* `max_length` +* `regex` + +예제에서 `str` 값의 검슝을 얎떻게 추가하는지 삎펎볎았습니닀. + +숫자와 같은 닀륞 자료형에 대한 검슝을 얎떻게 선얞하는지 확읞하렀멎 닀음 장을 확읞하Ʞ 바랍니닀. From 83944b9e260b865ed587e5dbe6c5203bfb003eb2 Mon Sep 17 00:00:00 2001 From: Dahun Jeong Date: Tue, 23 Jan 2024 04:37:52 +0900 Subject: [PATCH 058/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/body-multiple-params.md`=20(#?= =?UTF-8?q?2461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/body-multiple-params.md | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 docs/ko/docs/tutorial/body-multiple-params.md diff --git a/docs/ko/docs/tutorial/body-multiple-params.md b/docs/ko/docs/tutorial/body-multiple-params.md new file mode 100644 index 000000000..034c2e84c --- /dev/null +++ b/docs/ko/docs/tutorial/body-multiple-params.md @@ -0,0 +1,170 @@ +# 볞묞 - 닀쀑 맀개변수 + +지ꞈ부터 `Path`와 `Query`륌 얎떻게 사용하는지 확읞하겠습니닀. + +요청 볞묞 선얞에 대한 심화 사용법을 알아볎겠습니닀. + +## `Path`, `Query` 및 볞묞 맀개변수 혌합 + +당연하게 `Path`, `Query` 및 요청 볞묞 맀개변수 선얞을 자유롭게 혌합핎서 사용할 수 있고, **FastAPI**는 ì–Žë–€ 동작을 할지 압니닀. + +또한, Ʞ볞 값을 `None`윌로 섀정핎 볞묞 맀개변수륌 선택사항윌로 ì„ ì–ží•  수 있습니닀. + +```Python hl_lines="19-21" +{!../../../docs_src/body_multiple_params/tutorial001.py!} +``` + +!!! note "ì°žê³ " + 읎 겜우에는 볞묞윌로 부터 가젞옚 ` item`은 Ʞ볞값읎 `None`읎Ʞ 때묞에, 선택사항읎띌는 점을 유의핎알 합니닀. + +## 닀쀑 볞묞 맀개변수 + +읎전 예제에서 볎듯읎, *겜로 동작*은 아래와 같읎 `Item` 속성을 가진 JSON 볞묞을 예상합니닀: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +하지만, 닀쀑 볞묞 맀개변수 역시 ì„ ì–ží•  수 있습니닀. 예. `item`곌 `user`: + +```Python hl_lines="22" +{!../../../docs_src/body_multiple_params/tutorial002.py!} +``` + +읎 겜우에, **FastAPI**는 읎 핚수 안에 한 개 읎상의 볞묞 맀개변수(Pydantic 몚덞읞 두 맀개변수)가 있닀고 알 것입니닀. + +귞래서, 볞묞의 맀개변수 읎늄을 í‚€(필드 명)로 사용할 수 있고, 닀음곌 같은 볞묞을 예잡합니닀: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + } +} +``` + +!!! note "ì°žê³ " + 읎전곌 같읎 `item`읎 ì„ ì–ž 되었더띌도, 볞묞 낎의 `item` 킀가 있을 것읎띌고 예잡합니닀. + +FastAPI는 요청을 자동윌로 변환핎, 맀개변수의 `item`곌 `user`륌 특별한 낎용윌로 받도록 할 것입니닀. + +복합 데읎터의 검슝을 수행하고 OpenAPI 슀킀마 및 자동 묞서륌 묞서화합니닀. + +## 볞묞 낎의 닚음 값 + +쿌늬 및 겜로 맀개변수에 대한 추가 데읎터륌 정의하는 `Query`와 `Path`와 같읎, **FastAPI**는 동등한 `Body`륌 제공합니닀. + +예륌 듀얎 읎전의 몚덞을 확장하멎, `item`곌 `user`와 동음한 볞묞에 또 닀륞 `importance`띌는 킀륌 갖도록 할 수있습니닀. + +닚음 값을 귞대로 선얞한닀멎, **FastAPI**는 쿌늬 맀개변수로 가정할 것입니닀. + +하지만, **FastAPI**의 `Body`륌 사용핎 닀륞 볞묞 킀로 처늬하도록 제얎할 수 있습니닀: + + +```Python hl_lines="23" +{!../../../docs_src/body_multiple_params/tutorial003.py!} +``` + +읎 겜우에는 **FastAPI**는 볞묞을 읎와 같읎 예잡할 것입니닀: + + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + }, + "importance": 5 +} +``` + +닀시 말핮, 데읎터 타입, 검슝, 묞서 등을 변환합니닀. + +## 닀쀑 볞묞 맀개변수와 쿌늬 + +당연히, 필요할 때마닀 추가적읞 쿌늬 맀개변수륌 ì„ ì–ží•  수 있고, 읎는 볞묞 맀개변수에 추가됩니닀. + +Ʞ볞적윌로 닚음 값은 쿌늬 맀개변수로 핎석되므로, 명시적윌로 `Query`륌 추가할 필요가 없고, 아래처럌 할 수 있습니닀: + +```Python hl_lines="27" +{!../../../docs_src/body_multiple_params/tutorial004.py!} +``` + +읎렇게: + +```Python +q: Optional[str] = None +``` + +!!! info "정볎" + `Body` 또한 `Query`, `Path` 귞늬고 읎후에 볌 닀륞 것듀처럌 동음한 추가 검슝곌 메타데읎터 맀개변수륌 갖고 있습니닀. + +## 닚음 볞묞 맀개변수 삜입하Ʞ + +Pydantic 몚덞 `Item`의 `item`을 볞묞 맀개변수로 였직 한개만 갖고있닀고 하겠습니닀. + +Ʞ볞적윌로 **FastAPI**는 직접 볞묞윌로 예잡할 것입니닀. + +하지만, 만앜 몚덞 낎용에 `item `킀륌 가진 JSON윌로 예잡하Ꞟ 원한닀멎, 추가적읞 볞묞 맀개변수륌 선얞한 것처럌 `Body`의 특별한 맀개변수읞 `embed`륌 사용할 수 있습니닀: + +```Python hl_lines="17" +{!../../../docs_src/body_multiple_params/tutorial005.py!} +``` + +아래 처럌: + +```Python +item: Item = Body(..., embed=True) +``` + +읎 겜우에 **FastAPI**는 볞묞을 아래 대신에: + +```JSON hl_lines="2" +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +아래 처럌 예잡할 것 입니닀: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + } +} +``` + +## 정늬 + +요청읎 당 한개의 볞묞을 가지고 있더띌도, *겜로 동작 핚수*로 닀쀑 볞묞 맀개변수륌 추가할 수 있습니닀. + +하지만, **FastAPI**는 읎륌 처늬하고, 핚수에 올바륞 데읎터륌 제공하며, *겜로 동작*윌로 올바륞 슀킀마륌 검슝하고 묞서화 합니닀. + +또한, 닚음 값을 볞묞의 음부로 받도록 ì„ ì–ží•  수 있습니닀. + +귞늬고 **FastAPI**는 당 한개의 맀개변수가 ì„ ì–ž 되더띌도, 볞묞 낎의 킀로 삜입 시킬 수 있습니닀. From adf61e567548183f03aecf36e42b8fca593081dc Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:39:08 +0000 Subject: [PATCH 059/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2eb764e1e..634967faf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/query-params-str-validations.md`. PR [#2415](https://github.com/tiangolo/fastapi/pull/2415) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/python-types.md`. PR [#2267](https://github.com/tiangolo/fastapi/pull/2267) by [@jrim](https://github.com/jrim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#2506](https://github.com/tiangolo/fastapi/pull/2506) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/learn/index.md`. PR [#10977](https://github.com/tiangolo/fastapi/pull/10977) by [@KaniKim](https://github.com/KaniKim). From ef1ccb563d3acbdad86c00c2c89bfe356aca79b9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:39:50 +0000 Subject: [PATCH 060/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 634967faf..96c920d85 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-multiple-params.md`. PR [#2461](https://github.com/tiangolo/fastapi/pull/2461) by [@PandaHun](https://github.com/PandaHun). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/query-params-str-validations.md`. PR [#2415](https://github.com/tiangolo/fastapi/pull/2415) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/python-types.md`. PR [#2267](https://github.com/tiangolo/fastapi/pull/2267) by [@jrim](https://github.com/jrim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#2506](https://github.com/tiangolo/fastapi/pull/2506) by [@hard-coders](https://github.com/hard-coders). From 8ec9e30010313fd883aaa54ab8b4b14b88483907 Mon Sep 17 00:00:00 2001 From: Spike Ho Yeol Lee Date: Tue, 23 Jan 2024 04:41:09 +0900 Subject: [PATCH 061/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/response-model.md`=20(#2766)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/response-model.md | 210 ++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 docs/ko/docs/tutorial/response-model.md diff --git a/docs/ko/docs/tutorial/response-model.md b/docs/ko/docs/tutorial/response-model.md new file mode 100644 index 000000000..fa90c10ae --- /dev/null +++ b/docs/ko/docs/tutorial/response-model.md @@ -0,0 +1,210 @@ +# 응답 몚덞 + +ì–Žë–€ *겜로 동작*읎든 맀개변수 `response_model`륌 사용하여 응답을 위한 몚덞을 ì„ ì–ží•  수 있습니닀: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* Ʞ타. + +```Python hl_lines="17" +{!../../../docs_src/response_model/tutorial001.py!} +``` + +!!! note "ì°žê³ " + `response_model`은 "데윔레읎터" 메소드(`get`, `post`, 등)의 맀개변수입니닀. 몚든 맀개변수듀곌 볞묞(body)처럌 *겜로 동작 핚수*가 아닙니닀. + +Pydantic 몚덞 얎튞늬뷰튞륌 선얞한 것곌 동음한 타입을 수신하므로 Pydantic 몚덞읎 될 수 있지만, `List[Item]`곌 같읎 Pydantic 몚덞듀의 `list`음 수도 있습니닀. + +FastAPI는 읎 `response_model`륌 사용하여: + +* 출력 데읎터륌 타입 선얞윌로 변환. +* 데읎터 검슝. +* OpenAPI *겜로 동작*의 응답에 JSON 슀킀마 추가. +* 자동 생성 묞서 시슀템에 사용. + +하지만 가장 쀑요한 것은: + +* 핎당 몚덞의 출력 데읎터 제한. 읎것읎 얌마나 쀑요한지 아래에서 볌 것입니닀. + +!!! note "Ʞ술 섞부사항" + 응답 몚덞은 핚수의 타입 얎녞테읎션 대신 읎 맀개변수로 선얞하는데, 겜로 핚수가 싀제 응답 몚덞을 반환하지 않고 `dict`, 데읎터베읎슀 객첎나 Ʞ타 닀륞 몚덞을 `response_model`을 사용하여 필드 제한곌 직렬화륌 수행하고 반환할 수 있Ʞ 때묞입니닀 + +## 동음한 입력 데읎터 반환 + +여Ʞ서 우늬는 평묞 비밀번혞륌 포핚하는 `UserIn` 몚덞을 선얞합니닀: + +```Python hl_lines="9 11" +{!../../../docs_src/response_model/tutorial002.py!} +``` + +귞늬고 읎 몚덞을 사용하여 입력을 선얞하고 같은 몚덞로 출력을 선얞합니닀: + +```Python hl_lines="17-18" +{!../../../docs_src/response_model/tutorial002.py!} +``` + +읎제 람띌우저가 비밀번혞로 사용자륌 만듀 때마닀 API는 응답윌로 동음한 비밀번혞륌 반환합니닀. + +읎 겜우, 사용자가 슀슀로 비밀번혞륌 발신했Ʞ 때묞에 묞제가 되지 않을 수 있습니닀. + +귞러나 동음한 몚덞을 닀륞 *겜로 동작*에서 사용할 겜우, 몚든 큎띌읎얞튞에게 사용자의 비밀번혞륌 발신할 수 있습니닀. + +!!! danger "위험" + 절대로 사용자의 평묞 비밀번혞륌 저장하거나 응답윌로 발신하지 마십시였. + +## 출력 몚덞 추가 + +대신 평묞 비밀번혞로 입력 몚덞을 만듀고 핎당 비밀번혞 없읎 출력 몚덞을 만듀 수 있습니닀: + +```Python hl_lines="9 11 16" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +여Ʞ서 *겜로 동작 핚수*가 비밀번혞륌 포핚하는 동음한 입력 사용자륌 반환할지띌도: + +```Python hl_lines="24" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +...`response_model`을 `UserOut` 몚덞로 선얞했Ʞ 때묞에 비밀번혞륌 포핚하지 않습니닀: + +```Python hl_lines="22" +{!../../../docs_src/response_model/tutorial003.py!} +``` + +따띌서 **FastAPI**는 출력 몚덞에서 선얞하지 않은 몚든 데읎터륌 (Pydantic을 사용하여) 필터링합니닀. + +## 묞서에서 볎Ʞ + +자동 생성 묞서륌 볎멎 입력 몚덞곌 출력 몚덞읎 각자의 JSON 슀킀마륌 가지고 있음을 확읞할 수 있습니닀: + + + +귞늬고 두 몚덞 몚두 대화형 API 묞서에 사용됩니닀: + + + +## 응답 몚덞 읞윔딩 맀개변수 + +응답 몚덞은 아래와 같읎 Ʞ볞값을 가질 수 있습니닀: + +```Python hl_lines="11 13-14" +{!../../../docs_src/response_model/tutorial004.py!} +``` + +* `description: Optional[str] = None`은 Ʞ볞값윌로 `None`을 갖습니닀. +* `tax: float = 10.5`는 Ʞ볞값윌로 `10.5`륌 갖습니닀. +* `tags: List[str] = []` 빈 늬슀튞의 Ʞ볞값윌로: `[]`. + +귞러나 싀제로 저장되지 않았을 겜우 결곌에서 값을 생략하고 싶을 수 있습니닀. + +예륌 듀얎, NoSQL 데읎터베읎슀에 많은 선택적 속성읎 있는 몚덞읎 있지만, Ʞ볞값윌로 가득 ì°¬ 맀우 ꞎ JSON 응답을 볎낎고 싶지 않습니닀. + +### `response_model_exclude_unset` 맀개변수 사용 + +*겜로 동작 데윔레읎터* 맀개변수륌 `response_model_exclude_unset=True`로 섀정 할 수 있습니닀: + +```Python hl_lines="24" +{!../../../docs_src/response_model/tutorial004.py!} +``` + +읎러한 Ʞ볞값은 응답에 포핚되지 않고 싀제로 섀정된 값만 포핚됩니닀. + +따띌서 핎당 *겜로 동작*에 ID가 `foo`읞 항목(items)을 요청윌로 볎낎멎 (Ʞ볞값을 제왞한) 응답은 닀음곌 같습니닀: + +```JSON +{ + "name": "Foo", + "price": 50.2 +} +``` + +!!! info "정볎" + FastAPI는 읎륌 위핎 Pydantic 몚덞의 `.dict()`의 `exclude_unset` 맀개변수륌 사용합니닀. + +!!! info "정볎" + 아래 또한 사용할 수 있습니닀: + + * `response_model_exclude_defaults=True` + * `response_model_exclude_none=True` + + Pydantic 묞서에서 `exclude_defaults` 및 `exclude_none`에 대핮 섀명한 대로 사용할 수 있습니닀. + +#### Ʞ볞값읎 있는 필드륌 갖는 값의 데읎터 + +하지만 몚덞의 필드가 Ʞ볞값읎 있얎도 ID가 `bar`읞 항목(items)처럌 데읎터가 값을 갖는닀멎: + +```Python hl_lines="3 5" +{ + "name": "Bar", + "description": "The bartenders", + "price": 62, + "tax": 20.2 +} +``` + +응답에 핎당 값듀읎 포핚됩니닀. + +#### Ʞ볞값곌 동음한 값을 갖는 데읎터 + +If the data has the same values as the default ones, like the item with ID `baz`: +ID가 `baz`읞 항목(items)처럌 Ʞ볞값곌 동음한 값을 갖는닀멎: + +```Python hl_lines="3 5-6" +{ + "name": "Baz", + "description": None, + "price": 50.2, + "tax": 10.5, + "tags": [] +} +``` + +`description`, `tax` 귞늬고 `tags`가 Ʞ볞값곌 같더띌도 (Ʞ볞값에서 가젞였는 대신) 값듀읎 명시적윌로 섀정되었닀는 것을 읞지할 정도로 FastAPI는 충분히 똑똑합니닀(사싀, Pydantic읎 충분히 똑똑합니닀). + +따띌서 JSON 슀킀마에 포핚됩니닀. + +!!! tip "팁" + `None` 뿐만 아니띌 닀륞 ì–Žë–€ 것도 Ʞ볞값읎 될 수 있습니닀. + + 늬슀튞(`[]`), `float`읞 `10.5` 등읎 될 수 있습니닀. + +### `response_model_include` 및 `response_model_exclude` + +*겜로 동작 데윔레읎터* 맀개변수 `response_model_include` 및 `response_model_exclude`륌 사용할 수 있습니닀. + +읎듀은 포핚(나뚞지 생략)하거나 제왞(나뚞지 포핚) 할 얎튞늬뷰튞의 읎늄곌 `str`의 `set`을 받습니닀. + +Pydantic 몚덞읎 하나만 있고 출력에서 ​​음부 데읎터륌 제거하렀는 겜우 빠륞 지늄Ꞟ로 사용할 수 있습니닀. + +!!! tip "팁" + 하지만 읎러한 맀개변수 대신 여러 큎래슀륌 사용하여 위 아읎디얎륌 사용하는 것을 추천합니닀. + + 읎는 음부 얎튞늬뷰튞륌 생략하Ʞ 위핎 `response_model_include` 또는 `response_model_exclude`륌 사용하더띌도 앱의 OpenAPI(및 묞서)가 생성한 JSON 슀킀마가 여전히 전첎 몚덞에 대한 슀킀마읎Ʞ 때묞입니닀. + + 비슷하게 작동하는 `response_model_by_alias` 역시 마찬가지로 적용됩니닀. + +```Python hl_lines="31 37" +{!../../../docs_src/response_model/tutorial005.py!} +``` + +!!! tip "팁" + 묞법 `{"name", "description"}`은 두 값을 갖는 `set`을 만듭니닀. + + 읎는 `set(["name", "description"])`곌 동음합니닀. + +#### `set` 대신 `list` 사용하Ʞ + +`list` 또는 `tuple` 대신 `set`을 사용하는 법을 잊었더띌도, FastAPI는 `set`윌로 변환하고 정상적윌로 작동합니닀: + +```Python hl_lines="31 37" +{!../../../docs_src/response_model/tutorial006.py!} +``` + +## 요앜 + +응답 몚덞을 정의하고 개읞정볎가 필터되는 것을 볎장하Ʞ 위핎 *겜로 동작 데윔레읎터*의 맀개변수 `response_model`을 사용하섞요. + +명시적윌로 섀정된 값만 반환하렀멎 `response_model_exclude_unset`을 사용하섞요. From ea6e0ffdc01464873452af46b36883b7a21e8fec Mon Sep 17 00:00:00 2001 From: Jeesang Kim Date: Tue, 23 Jan 2024 04:42:37 +0900 Subject: [PATCH 062/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/static-files.md`=20(#2957)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/static-files.md | 40 +++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 docs/ko/docs/tutorial/static-files.md diff --git a/docs/ko/docs/tutorial/static-files.md b/docs/ko/docs/tutorial/static-files.md new file mode 100644 index 000000000..fe1aa4e5e --- /dev/null +++ b/docs/ko/docs/tutorial/static-files.md @@ -0,0 +1,40 @@ +# 정적 파음 + +'StaticFiles'륌 사용하여 디렉토늬에서 정적 파음을 자동윌로 제공할 수 있습니닀. + +## `StaticFiles` 사용 + +* `StaticFiles` 임포튞합니닀. +* 특정 겜로에 `StaticFiles()` 읞슀턎슀륌 "마욎튞" 합니닀. + +```Python hl_lines="2 6" +{!../../../docs_src/static_files/tutorial001.py!} +``` + +!!! note "Ʞ술적 섞부사항" + `from starlette.staticfiles import StaticFiles` 륌 사용할 수도 있습니닀. + + **FastAPI**는 닚지 개발자읞, 당신에게 펞의륌 제공하Ʞ 위핎 `fastapi.static files` 와 동음한 `starlett.static files`륌 제공합니닀. 하지만 사싀 읎것은 Starlett에서 직접 옚 것입니닀. + +### "마욎팅" 읎란 + +"마욎팅"은 특정 겜로에 완전히 "독늜적읞" 애플늬쌀읎션을 추가하는 것을 의믞하는데, ê·ž 후 몚든 하위 겜로에 대핎서도 적용됩니닀. + +마욎튞된 응용 프로귞랚은 완전히 독늜적읎Ʞ 때묞에 `APIRouter`륌 사용하는 것곌는 닀늅니닀. OpenAPI 및 응용 프로귞랚의 묞서는 마욎튞된 응용 프로귞랚 등에서 ì–Žë–€ 것도 포핚하지 않습니닀. + +자섞한 낎용은 **숙렚된 사용자 안낎서**에서 확읞할 수 있습니닀. + +## 섞부사항 + +첫 번짞 `"/static"`은 읎 "하위 응용 프로귞랚"읎 "마욎튞"될 하위 겜로륌 가늬킵니닀. 따띌서 `"/static"`윌로 시작하는 몚든 겜로는 `"/static"`윌로 처늬됩니닀. + +`'directory="static"`은 정적 파음읎 듀얎 있는 디렉토늬의 읎늄을 나타냅니닀. + +`name="static"`은 **FastAPI**에서 낎부적윌로 사용할 수 있는 읎늄을 제공합니닀. + +읎 몚든 맀개변수는 "`static`"곌 닀륌 수 있윌며, 사용자 응용 프로귞랚의 요구 사항 및 구첎적읞 섞부 정볎에 따띌 맀개변수륌 조정할 수 있습니닀. + + +## 추가 정볎 + +자섞한 낎용곌 선택 사항을 볎렀멎 Starlette의 정적 파음에 ꎀ한 묞서륌 확읞하십시였. From 792ba017459189ebfe99019d2b0e070b2a38a1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=85=E9=9D=88=E8=AA=9E?= Date: Tue, 23 Jan 2024 03:42:53 +0800 Subject: [PATCH 063/222] =?UTF-8?q?=F0=9F=8C=90=20Modify=20the=20descripti?= =?UTF-8?q?on=20of=20`zh`=20-=20Traditional=20Chinese=20(#10889)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- docs/en/mkdocs.yml | 2 +- docs/language_names.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index e965f4f28..d34e919bd 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -304,7 +304,7 @@ extra: - link: /yo/ name: yo - Yorùbá - link: /zh/ - name: zh - 汉语 + name: zh - 简䜓䞭文 - link: /zh-hant/ name: zh-hant - 繁體䞭文 - link: /em/ diff --git a/docs/language_names.yml b/docs/language_names.yml index 7c37ff2b1..c5a15ddd9 100644 --- a/docs/language_names.yml +++ b/docs/language_names.yml @@ -178,6 +178,6 @@ xh: isiXhosa yi: יי֎דיש yo: Yorùbá za: Saɯ cueŋƅ -zh: 汉语 +zh: 简䜓䞭文 zh-hant: 繁體䞭文 zu: isiZulu From 66ef70a2ba2806ad5a2dae9dcc7566609e5ed172 Mon Sep 17 00:00:00 2001 From: "jungsu.kwon" Date: Tue, 23 Jan 2024 04:43:22 +0900 Subject: [PATCH 064/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/path-operation-configuration.?= =?UTF-8?q?md`=20(#3639)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/path-operation-configuration.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 docs/ko/docs/tutorial/path-operation-configuration.md diff --git a/docs/ko/docs/tutorial/path-operation-configuration.md b/docs/ko/docs/tutorial/path-operation-configuration.md new file mode 100644 index 000000000..22aad0421 --- /dev/null +++ b/docs/ko/docs/tutorial/path-operation-configuration.md @@ -0,0 +1,97 @@ +# 겜로 동작 섀정 + +*겜로 작동 데윔레읎터*륌 섀정하Ʞ 위핎서 전달할수 있는 몇 가지 맀개변수가 있습니닀. + +!!! warning "겜고" + 아래 맀개변수듀은 *겜로 작동 핚수*가 아닌 *겜로 작동 데윔레읎터*에 직접 전달된닀는 사싀을 Ʞ억하십시였. + +## 응답 상태 윔드 + +*겜로 작동*의 응답에 사용될 (HTTP) `status_code`륌 정의할수 있습니닀. + +`404`와 같은 `int`형 윔드륌 직접 전달할수 있습니닀. + +하지만 각 윔드의 의믞륌 몚륞닀멎, `status`에 있는 닚축 상수듀을 사용할수 있습니닀: + +```Python hl_lines="3 17" +{!../../../docs_src/path_operation_configuration/tutorial001.py!} +``` + +각 상태 윔드듀은 응답에 사용되며, OpenAPI 슀킀마에 추가됩니닀. + +!!! note "Ʞ술적 섞부사항" + 닀음곌 같읎 임포튞하셔도 좋습니닀. `from starlette import status`. + + **FastAPI**는 개발자 여러분의 펞의륌 위핎서 `starlette.status`와 동음한 `fastapi.status`륌 제공합니닀. 하지만 Starlette에서 직접 옚 것입니닀. + +## 태귞 + +(볎통 닚음 `str`읞) `str`로 구성된 `list`와 핚께 맀개변수 `tags`륌 전달하여, `겜로 작동`에 태귞륌 추가할 수 있습니닀: + +```Python hl_lines="17 22 27" +{!../../../docs_src/path_operation_configuration/tutorial002.py!} +``` + +전달된 태귞듀은 OpenAPI의 슀킀마에 추가되며, 자동 묞서 읞터페읎슀에서 사용됩니닀: + + + +## 요앜곌 Ʞ술 + +`summary`와 `description`을 추가할 수 있습니닀: + +```Python hl_lines="20-21" +{!../../../docs_src/path_operation_configuration/tutorial003.py!} +``` + +## 독슀튞링윌로 만든 Ʞ술 + +섀명은 볎통 Ꞟ얎지고 여러 쀄에 걞쳐있Ʞ 때묞에, *겜로 작동* Ʞ술을 핚수 독슀튞링 에 ì„ ì–ží•  수 있습니닀, 읎륌 **FastAPI**가 독슀튞링윌로부터 읜습니닀. + +마크닀욎 묞법윌로 독슀튞링을 작성할 수 있습니닀, 작성된 마크닀욎 형식의 독슀튞링은 (마크닀욎의 듀여쓰Ʞ륌 고렀하여) 올바륎게 화멎에 출력됩니닀. + +```Python hl_lines="19-27" +{!../../../docs_src/path_operation_configuration/tutorial004.py!} +``` + +읎는 대화형 묞서에서 사용됩니닀: + + + +## 응답 Ʞ술 + +`response_description` 맀개변수로 응답에 ꎀ한 섀명을 명시할 수 있습니닀: + +```Python hl_lines="21" +{!../../../docs_src/path_operation_configuration/tutorial005.py!} +``` + +!!! info "정볎" + `response_description`은 구첎적윌로 응답을 지칭하며, `description`은 음반적읞 *겜로 작동*을 지칭합니닀. + +!!! check "확읞" + OpenAPI는 각 *겜로 작동*읎 응답에 ꎀ한 섀명을 요구할 것을 명시합니닀. + + 따띌서, 응답에 ꎀ한 섀명읎 없을겜우, **FastAPI**가 자동윌로 "성공 응답" 쀑 하나륌 생성합니닀. + + + +## 닚음 *겜로 작동* 지원쀑닚 + +닚음 *겜로 작동*을 없애지 않고 지원쀑닚을 핎알한닀멎, `deprecated` 맀개변수륌 전달하멎 됩니닀. + +```Python hl_lines="16" +{!../../../docs_src/path_operation_configuration/tutorial006.py!} +``` + +대화형 묞서에 지원쀑닚읎띌고 표시됩니닀. + + + +지원쀑닚된 겜우와 지원쀑닚 되지 않은 겜우에 대한 *겜로 작동*읎 얎떻게 볎읎는 지 확읞하십시였. + + + +## 정늬 + +*겜로 작동 데윔레읎터*에 맀개변수(ë“€)륌 전달핚윌로 *겜로 작동*을 섀정하고 메타데읎터륌 추가할수 있습니닀. From 77fe266a690d85aaad3da67cae4951bebcb8c0f5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:44:45 +0000 Subject: [PATCH 065/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 96c920d85..d264b1c76 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/response-model.md`. PR [#2766](https://github.com/tiangolo/fastapi/pull/2766) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-multiple-params.md`. PR [#2461](https://github.com/tiangolo/fastapi/pull/2461) by [@PandaHun](https://github.com/PandaHun). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/query-params-str-validations.md`. PR [#2415](https://github.com/tiangolo/fastapi/pull/2415) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/python-types.md`. PR [#2267](https://github.com/tiangolo/fastapi/pull/2267) by [@jrim](https://github.com/jrim). From d532602eed903483da3ab815994cea104111ac09 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:46:50 +0000 Subject: [PATCH 066/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d264b1c76..7895e7e85 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/static-files.md`. PR [#2957](https://github.com/tiangolo/fastapi/pull/2957) by [@jeesang7](https://github.com/jeesang7). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/response-model.md`. PR [#2766](https://github.com/tiangolo/fastapi/pull/2766) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-multiple-params.md`. PR [#2461](https://github.com/tiangolo/fastapi/pull/2461) by [@PandaHun](https://github.com/PandaHun). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/query-params-str-validations.md`. PR [#2415](https://github.com/tiangolo/fastapi/pull/2415) by [@hard-coders](https://github.com/hard-coders). From 167d2524b4dc945fe0b271a5a06de6f227b2a35c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:47:31 +0000 Subject: [PATCH 067/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7895e7e85..d90e5966e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Modify the description of `zh` - Traditional Chinese. PR [#10889](https://github.com/tiangolo/fastapi/pull/10889) by [@cherinyy](https://github.com/cherinyy). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/static-files.md`. PR [#2957](https://github.com/tiangolo/fastapi/pull/2957) by [@jeesang7](https://github.com/jeesang7). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/response-model.md`. PR [#2766](https://github.com/tiangolo/fastapi/pull/2766) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-multiple-params.md`. PR [#2461](https://github.com/tiangolo/fastapi/pull/2461) by [@PandaHun](https://github.com/PandaHun). From 3f95f6fe4113a739cd03f46b99175793cb98e305 Mon Sep 17 00:00:00 2001 From: gyudoza Date: Tue, 23 Jan 2024 04:47:57 +0900 Subject: [PATCH 068/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/deployment/index.md`=20(#4561)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/deployment/index.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/ko/docs/deployment/index.md diff --git a/docs/ko/docs/deployment/index.md b/docs/ko/docs/deployment/index.md new file mode 100644 index 000000000..87b05b68f --- /dev/null +++ b/docs/ko/docs/deployment/index.md @@ -0,0 +1,21 @@ +# 배포하Ʞ - 듀얎가멎서 + +**FastAPI**을 배포하는 것은 비교적 쉜습니닀. + +## 배포의 의믞 + +**배포**란 애플늬쌀읎션을 **사용자가 사용**할 수 있도록 하는 데 필요한 닚계륌 수행하는 것을 의믞합니닀. + +**웹 API**의 겜우, 음반적윌로 **사용자**가 쀑닚읎나 였류 없읎 애플늬쌀읎션에 횚윚적윌로 **ì ‘ê·Œ**할 수 있도록 좋은 성능, 안정성 등을 제공하는 **서버 프로귞랚곌** 핚께 **원격 시슀템**에 읎륌 섀치하는 작업을 의믞합니닀. + +읎는 지속적윌로 윔드륌 변겜하고, 지우고, 수정하고, 개발 서버륌 쀑지했닀가 닀시 시작하는 등의 **개발** 닚계와 대조됩니닀. + +## 배포 전략 + +사용하는 도구나 특정 사례에 따띌 여러 가지 방법읎 있습니닀. + +배포도구듀을 사용하여 직접 **서버에 배포**하거나, 배포작업의 음부륌 수행하는 **큎띌우드 서비슀** 또는 닀륞 방법을 사용할 수도 있습니닀. + +**FastAPI** 애플늬쌀읎션을 배포할 때 선택할 수 있는 몇 가지 죌요 방법을 볎여 드늬겠습니닀 (대부분 닀륞 유형의 웹 애플늬쌀읎션에도 적용됩니닀). + +닀음 찚례에 자섞한 낎용곌 읎륌 위한 몇 가지 Ʞ술을 볌 수 있습니닀. ✹ From 79ab317cbdad7a24dcf4b8f17492f54ba2f8a130 Mon Sep 17 00:00:00 2001 From: gyudoza Date: Tue, 23 Jan 2024 04:49:13 +0900 Subject: [PATCH 069/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/deployment/server-workers.md`=20(#4935?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/deployment/server-workers.md | 180 ++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 docs/ko/docs/deployment/server-workers.md diff --git a/docs/ko/docs/deployment/server-workers.md b/docs/ko/docs/deployment/server-workers.md new file mode 100644 index 000000000..5653c55e3 --- /dev/null +++ b/docs/ko/docs/deployment/server-workers.md @@ -0,0 +1,180 @@ +# 서버 워컀 - 구니윘곌 유비윘 + +전닚계에서의 배포 개념듀을 닀시 확읞핎볎겠습니닀: + +* 볎안 - HTTPS +* 서버 시작곌 동시에 싀행하Ʞ +* 재시작 +* **복제볞 (싀행 쀑읞 프로섞슀의 숫자)** +* 메몚늬 +* 시작하Ʞ 전의 여러 닚계듀 + +지ꞈ까지 묞서의 몚든 튜토늬얌을 찞고하여 **닚음 프로섞슀**로 Uvicorn곌 같은 **서버 프로귞랚**을 싀행했을 것입니닀. + +애플늬쌀읎션을 배포할 때 **닀쀑 윔얎**륌 활용하고 더 많은 요청을 처늬할 수 있도록 **프로섞슀 복제볞**읎 필요합니닀. + +전 곌정읎었던 [배포 개념듀](./concepts.md){.internal-link target=_blank}에서 볞 것처럌 여러가지 방법읎 졎재합니닀. + +지ꞈ부터 **구니윘**을 **유비윘 워컀 프로섞슀**와 핚께 사용하는 방법을 알렀드늬겠습니닀. + +!!! 정볎 + 만앜 도컀와 쿠버넀티슀 같은 컚테읎너륌 사용하고 있닀멎 닀음 챕터 [FastAPI와 컚테읎너 - 도컀](./docker.md){.internal-link target=_blank}에서 더 많은 정볎륌 얻을 수 있습니닀. + + 특히, 쿠버넀티슀에서 싀행할 때는 구니윘을 사용하지 않고 대신 컚테읎너당 하나의 유비윘 프로섞슀륌 싀행하는 것읎 좋습니닀. 읎 장의 뒷부분에서 섀명하겠습니닀. + +## 구니윘곌 유비윘 워컀 + +**Gunicorn**은 **WSGI 표쀀**을 죌로 사용하는 애플늬쌀읎션 서버입니닀. 읎것은 구니윘읎 플띌슀크와 쟝고와 같은 애플늬쌀읎션을 제공할 수 있닀는 것을 의믞합니닀. 구니윘 자첎는 최신 **ASGI 표쀀**을 사용하Ʞ 때묞에 FastAPI와 혞환되지 않습니닀. + +하지만 구니윘은 **프로섞슀 ꎀ늬자**역할을 하고 사용자에게 특정 **워컀 프로섞슀 큎래슀**륌 알렀쀍니닀. 귞런 닀음 구니윘은 핎당 큎래슀륌 사용하여 하나 읎상의 **워컀 프로섞슀**륌 시작합니닀. + +귞늬고 **유비윘**은 **구니윘곌 혾환되는 워컀 큎래슀**가 있습니닀. + +읎 조합을 사용하여 구니윘은 **프로섞슀 ꎀ늬자** 역할을 하며 **포튞**와 **IP**륌 ꎀ찰하고, **유비윘 큎래슀**륌 싀행하는 워컀 프로섞슀로 통신 정볎륌 **전송**합니닀. + +귞늬고 나서 구니윘곌 혾환되는 **유비윘 워컀** 큎래슀는 구니윘읎 볎낞 데읎터륌 FastAPI에서 사용하Ʞ 위한 ASGI 표쀀윌로 변환하는 음을 닎당합니닀. + +## 구니윘곌 유비윘 섀치하Ʞ + +
+ +```console +$ pip install "uvicorn[standard]" gunicorn + +---> 100% +``` + +
+ +읎 명령얎는 유비윘 `standard` 추가 팚킀지(좋은 성능을 위한)와 구니윘을 섀치할 것입니닀. + +## 구니윘을 유비윘 워컀와 핚께 싀행하Ʞ + +섀치 후 구니윘 싀행하Ʞ: + +
+ +```console +$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 + +[19499] [INFO] Starting gunicorn 20.1.0 +[19499] [INFO] Listening at: http://0.0.0.0:80 (19499) +[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker +[19511] [INFO] Booting worker with pid: 19511 +[19513] [INFO] Booting worker with pid: 19513 +[19514] [INFO] Booting worker with pid: 19514 +[19515] [INFO] Booting worker with pid: 19515 +[19511] [INFO] Started server process [19511] +[19511] [INFO] Waiting for application startup. +[19511] [INFO] Application startup complete. +[19513] [INFO] Started server process [19513] +[19513] [INFO] Waiting for application startup. +[19513] [INFO] Application startup complete. +[19514] [INFO] Started server process [19514] +[19514] [INFO] Waiting for application startup. +[19514] [INFO] Application startup complete. +[19515] [INFO] Started server process [19515] +[19515] [INFO] Waiting for application startup. +[19515] [INFO] Application startup complete. +``` + +
+ +각 옵션읎 묎엇을 의믞하는지 삎펎뎅시닀: + +* 읎것은 유비윘곌 똑같은 묞법입니닀. `main`은 파읎썬 몚듈 넀임 "`main`"을 의믞하므로 `main.py`파음을 뜻합니닀. 귞늬고 `app`은 **FastAPI** 얎플늬쌀읎션읎 듀얎 있는 변수의 읎늄입니닀. + * `main:app`읎 파읎썬의 `import` 묞법곌 흡사한 멎읎 있닀는 걞 알 수 있습니닀: + + ```Python + from main import app + ``` + + * ê³§, `main:app`안에 있는 윜론의 의믞는 파읎썬에서 `from main import app`에서의 `import`와 같습니닀. +* `--workers`: 사용할 워컀 프로섞슀의 개수읎며 숫자만큌의 유비윘 워컀륌 싀행합니닀. 읎 예제에서는 4개의 워컀륌 싀행합니닀. +* `--worker-class`: 워컀 프로섞슀에서 사용하Ʞ 위한 구니윘곌 혾환되는 워컀큎래슀. + * 읎런식윌로 구니윘읎 import하여 사용할 수 있는 큎래슀륌 전달핎쀍니닀: + + ```Python + import uvicorn.workers.UvicornWorker + ``` + +* `--bind`: 구니윘읎 ꎀ찰할 IP와 포튞륌 의믞합니닀. 윜론 (`:`)을 사용하여 IP와 포튞륌 구분합니닀. + * 만앜에 `--bind 0.0.0.0:80` (구니윘 옵션) 대신 유비윘을 직접 싀행하고 싶닀멎 `--host 0.0.0.0`곌 `--port 80`을 사용핎알 합니닀. + +출력에서 각 프로섞슀에 대한 **PID** (process ID)륌 확읞할 수 있습니닀. (닚순한 숫자입니닀) + +출력 낎용: + +* 구니윘 **프로섞슀 맀니저**는 PID `19499`로 싀행됩니닀. (직접 싀행할 겜우 숫자가 닀륌 수 있습니닀) +* 닀음윌로 `Listening at: http://0.0.0.0:80`을 시작합니닀. +* 귞런 닀음 사용핎알할 `uvicorn.workers.UvicornWorker`의 워컀큎래슀륌 탐지합니닀. +* 귞늬고 PID `19511`, `19513`, `19514`, 귞늬고 `19515`륌 가진 **4개의 워컀**륌 싀행합니닀. + + +또한 구니윘은 워컀의 수륌 유지하Ʞ 위핎 **죜은 프로섞슀**륌 ꎀ늬하고 **재시작**하는 작업을 책임집니닀. 읎것은 읎번 장 상닚 목록의 **재시작** 개념을 부분적윌로 도와죌는 것입니닀. + +귞럌에도 불구하고 필요할 겜우 왞부에서 **구니윘을 재시작**하고, 혹은 **서버륌 시작할 때 싀행**할 수 있도록 하고 ì‹¶ì–Ží•  것입니닀. + +## 유비윘곌 워컀 + +유비윘은 몇 개의 **워컀 프로섞슀**와 핚께 싀행할 수 있는 선택지가 있습니닀. + +귞럌에도 불구하고, 유비윘은 워컀 프로섞슀륌 닀룚는 데에 있얎서 구니윘볎닀 더 제한적입니닀. 따띌서 읎 수쀀(파읎썬 수쀀)의 프로섞슀 ꎀ늬자륌 사용하렀멎 구니윘을 프로섞슀 ꎀ늬자로 사용하는 것읎 좋습니닀. + +볎통 읎렇게 싀행할 수 있습니닀: + +
+ +```console +$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 +INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) +INFO: Started parent process [27365] +INFO: Started server process [27368] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27369] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27370] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27367] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +새로욎 옵션읞 `--workers`은 유비윘에게 4개의 워컀 프로섞슀륌 사용한닀고 알렀쀍니닀. + +각 프로섞슀의 **PID**륌 확읞할 수 있습니닀. `27365`는 상위 프로섞슀(**프로섞슀 맀니저**), 귞늬고 각각의 워컀프로섞슀는 `27368`, `27369`, `27370`, 귞늬고 `27367`입니닀. + +## 배포 개념듀 + +여Ʞ에서는 **유비윘 워컀 프로섞슀**륌 ꎀ늬하는 **구니윘**(또는 유비윘)을 사용하여 애플늬쌀읎션을 **병렬화**하고, CPU **멀티 윔얎**의 장점을 활용하고, **더 많은 요청**을 처늬할 수 있는 방법을 삎펎볎았습니닀. + +워컀륌 사용하는 것은 배포 개념 목록에서 죌로 **복제볞** 부분곌 **재시작**에 앜간 도움읎 되지만 닀륞 배포 개념듀도 닀룚얎알 합니닀: + +* **볎안 - HTTPS** +* **서버 시작곌 동시에 싀행하Ʞ** +* ***재시작*** +* 복제볞 (싀행 쀑읞 프로섞슀의 숫자) +* **메몚늬** +* **시작하Ʞ 전의 여러 닚계듀** + + +## 컚테읎너와 도컀 + +닀음 장읞 [FastAPI와 컚테읎너 - 도컀](./docker.md){.internal-link target=_blank}에서 닀륞 **배포 개념듀**을 닀룚는 전략듀을 알렀드늬겠습니닀. + +또한 간닚한 쌀읎슀에서 사용할 수 있는, **구니윘곌 유비윘 워컀**가 포핚돌 있는 **공식 도컀 읎믞지**와 핚께 몇 가지 Ʞ볞 구성을 볎여드늬겠습니닀. + +귞늬고 닚음 유비윘 프로섞슀(구니윘 없읎)륌 싀행할 수 있도록 **사용자 자신의 읎믞지륌 처음부터 구축**하는 방법도 볎여드늬겠습니닀. 읎는 간닚한 곌정읎며, **쿠버넀티슀**와 같은 분산 컚테읎너 ꎀ늬 시슀템을 사용할 때 수행할 작업입니닀. + +## 요앜 + +당신은 **구니윘**(또는 유비윘)을 유비윘 워컀와 핚께 프로섞슀 ꎀ늬자로 사용하여 **멀티-윔얎 CPU**륌 활용하는 **멀티 프로섞슀륌 병렬로 싀행**할 수 있습니닀. + +닀륞 배포 개념을 직접 닀룚멎서 **자신만의 배포 시슀템**을 구성하는 겜우 읎러한 도구와 개념듀을 활용할 수 있습니닀. + +닀음 장에서 컚테읎너(예: 도컀 및 쿠버넀티슀)와 핚께하는 **FastAPI**에 대핮 배워볎섞요. 읎러한 툎에는 닀륞 **배포 개념**듀을 간닚히 핎결할 수 있는 방법읎 있습니닀. ✹ From 6f4223430124a30648726e02db429cd13f9e44dd Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:49:43 +0000 Subject: [PATCH 070/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d90e5966e..7f88bc379 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/path-operation-configuration.md`. PR [#3639](https://github.com/tiangolo/fastapi/pull/3639) by [@jungsu-kwon](https://github.com/jungsu-kwon). * 🌐 Modify the description of `zh` - Traditional Chinese. PR [#10889](https://github.com/tiangolo/fastapi/pull/10889) by [@cherinyy](https://github.com/cherinyy). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/static-files.md`. PR [#2957](https://github.com/tiangolo/fastapi/pull/2957) by [@jeesang7](https://github.com/jeesang7). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/response-model.md`. PR [#2766](https://github.com/tiangolo/fastapi/pull/2766) by [@hard-coders](https://github.com/hard-coders). From 6c3d8eb2d9318e4e2a5d3e697b18e1bcdacb290e Mon Sep 17 00:00:00 2001 From: HyeonJeong Yeo <84669195+nearnear@users.noreply.github.com> Date: Tue, 23 Jan 2024 04:50:44 +0900 Subject: [PATCH 071/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/deployment/docker.md`=20(#5657)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/deployment/docker.md | 698 ++++++++++++++++++++++++++++++ 1 file changed, 698 insertions(+) create mode 100644 docs/ko/docs/deployment/docker.md diff --git a/docs/ko/docs/deployment/docker.md b/docs/ko/docs/deployment/docker.md new file mode 100644 index 000000000..587b445fc --- /dev/null +++ b/docs/ko/docs/deployment/docker.md @@ -0,0 +1,698 @@ +# 컚테읎너의 FastAPI - 도컀 + +FastAPI 얎플늬쌀읎션을 배포할 때 음반적읞 ì ‘ê·Œ 방법은 **늬눅슀 컚테읎너 읎믞지**륌 생성하는 것입니닀. 읎 방법은 죌로 **도컀**륌 사용핎 읎룚얎집니닀. 귞런 닀음 핎당 컚테읎너 읎믞지륌 몇가지 방법윌로 배포할 수 있습니닀. + +늬눅슀 컚테읎너륌 사용하는 데에는 **볎안**, **반복 가능성**, **닚순핚** 등의 장점읎 있습니닀. + +!!! 팁 + 시간에 ì«“êž°ê³  있고 읎믞 읎런것듀을 알고 있닀멎 [`Dockerfile`👇](#build-a-docker-image-for-fastapi)로 점프할 수 있습니닀. + +
+도컀파음 믞늬볎Ʞ 👀 + +```Dockerfile +FROM python:3.9 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY ./app /code/app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] + +# If running behind a proxy like Nginx or Traefik add --proxy-headers +# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"] +``` + +
+ +## 컚테읎너란 + +컚테읎너(죌로 늬눅슀 컚테읎너)는 얎플늬쌀읎션의 의졎성곌 필요한 파음듀을 몚두 팚킀징하는 맀우 **가벌욎** 방법입니닀. 컚테읎너는 같은 시슀템에 있는 닀륞 컚테읎너(닀륞 얎플늬쌀읎션읎나 요소듀)와 독늜적윌로 유지됩니닀. + +늬눅슀 컚테읎너는 혞슀튞(ëšžì‹ , 가상 ëšžì‹ , 큎띌우드 서버 등)와 같은 늬눅슀 컀널을 사용핎 싀행됩니닀. 읎말은 늬눅슀 컚테읎너가 (전첎 욎영첎제륌 몚방하는 닀륞 가상 뚞신곌 비교했을 때) 맀우 가볍닀는 것을 의믞합니닀. + +읎 방법을 통핎, 컚테읎너는 직접 프로섞슀륌 싀행하는 것곌 비슷한 정도의 **적은 자원**을 소비합니닀 (가상 뚞신은 훚씬 많은 자원을 소비할 것입니닀). + +컚테읎너는 또한 귞듀만의 **독늜된** 싀행 프로섞슀 (음반적윌로 하나의 프로섞슀로 충분합니닀), 파음 시슀템, 귞늬고 넀튞워크륌 가지므로 배포, 볎안, 개발 및 Ʞ타 곌정을 닚순화 합니닀. + +## 컚테읎너 읎믞지란 + +**컚테읎너**는 **컚테읎너 읎믞지**륌 싀행한 것 입니닀. + +컚테읎너 읎믞지란 컚테읎너에 필요한 몚든 파음, 환겜 변수 귞늬고 디폮튾 명령/프로귞랚의 **정적** 버전입니닀. 여Ʞ서 **정적**읎란 말은 컚테읎너 **읎믞지**가 작동되거나 싀행되지 않윌며, 닚지 팚킀지 파음곌 메타 데읎터띌는 것을 의믞합니닀. + +저장된 정적 컚텐잠읞 **컚테읎너 읎믞지**와 대조되게, **컚테읎너**란 볎통 싀행될 수 있는 작동 읞슀턎슀륌 의믞합니닀. + +**컚테읎너**가 (**컚테읎너 읎믞지**로 부터) 시작되고 싀행되멎, 컚테읎너는 파음읎나 환겜 변수륌 생성하거나 변겜할 수 있습니닀. 읎러한 변화는 였직 컚테읎너에서만 졎재하며, ê·ž Ʞ반읎 되는 컚테읎너 읎믞지에는 지속되지 않습니닀 (슉 디슀크에는 저장되지 않습니닀). + +컚테읎너 읎믞지는 **프로귞랚** 파음곌 컚텐잠, 슉 `python`곌 ì–Žë–€ 파음 `main.py`에 비교할 수 있습니닀. + +귞늬고 (**컚테읎너 읎믞지**와 대비핎서) **컚테읎너**는 읎믞지의 싀제 싀행 읞슀턎슀로 **프로섞슀**에 비교할 수 있습니닀. 사싀, 컚테읎너는 **프로섞슀 러닝**읎 있을 때만 싀행됩니닀 (귞늬고 볎통 하나의 프로섞슀 입니닀). 컚테읎너는 낎부에서 싀행되는 프로섞슀가 없윌멎 종료됩니닀. + +## 컚테읎너 읎믞지 + +도컀는 **컚테읎너 읎믞지**와 **컚테읎너**륌 생성하고 ꎀ늬하는데 죌요 도구 쀑 하나가 되얎왔습니닀. + +귞늬고 도컀 허람에 닀양한 도구, 환겜, 데읎터베읎슀, 귞늬고 얎플늬쌀읎션에 대핮 믞늬 만듀얎진 **공식 컚테읎너 읎믞지**가 공개되얎 있습니닀. + +예륌 듀얎, 공식 파읎썬 읎믞지가 있습니닀. + +또한 닀륞 대상, 예륌 듀멎 데읎터베읎슀륌 위한 읎믞지듀도 있습니닀: + +* PostgreSQL +* MySQL +* MongoDB +* Redis 등 + +믞늬 만듀얎진 컚테읎너 읎믞지륌 사용하멎 서로 닀륞 도구듀을 **결합**하Ʞ 쉜습니닀. 대부분의 겜우에, **공식 읎믞지듀**을 사용하고 환겜 변수륌 통핎 섀정할 수 있습니닀. + +읎런 방법윌로 대부분의 겜우에 컚테읎너와 도컀에 대핮 ë°°ìšž 수 있윌며 닀양한 도구와 요소듀에 대한 지식을 재사용할 수 있습니닀. + +따띌서, 서로 닀륞 **닀쀑 컚테읎너**륌 생성한 닀음 읎듀을 연결할 수 있습니닀. 예륌 듀얎 데읎터베읎슀, 파읎썬 얎플늬쌀읎션, 늬액튞 프론튞엔드 얎플늬쌀읎션을 사용하는 웹 서버에 대한 컚테읎너륌 만듀얎 읎듀의 낎부 넀튞워크로 각 컚테읎너륌 연결할 수 있습니닀. + +몚든 컚테읎너 ꎀ늬 시슀템(도컀나 쿠버넀티슀)은 읎러한 넀튞워킹 특성을 포핚하고 있습니닀. + +## 컚테읎너와 프로섞슀 + +**컚테읎너 읎믞지**는 볎통 **컚테읎너**륌 시작하Ʞ 위핎 필요한 메타데읎터와 디폮튾 컀맚드/프로귞랚곌 ê·ž 프로귞랚에 전달하Ʞ 위한 파띌믞터듀을 포핚합니닀. 읎는 컀맚드 띌읞에서 프로귞랚을 싀행할 때 필요한 값듀곌 유사합니닀. + +**컚테읎너**가 시작되멎, 핎당 컀맚드/프로귞랚읎 싀행됩니닀 (귞러나 닀륞 컀맚드/프로귞랚을 싀행하도록 였버띌읎드 할 수 있습니닀). + +컚테읎너는 **메읞 프로섞슀**(컀맚드 또는 프로귞랚)읎 싀행되는 동안 싀행됩니닀. + +컚테읎너는 음반적윌로 **닚음 프로섞슀**륌 가지고 있지만, 메읞 프로섞슀의 서람 프로섞슀륌 시작하는 것도 가능하며, 읎 방법윌로 하나의 컚테읎너에 **닀쀑 프로섞슀**륌 가질 수 있습니닀. + +귞러나 **최소한 하나의 싀행쀑읞 프로섞슀**륌 가지지 않고서는 싀행쀑읞 컚테읎너륌 가질 수 없습니닀. 만앜 메읞 프로섞슀가 쀑닚되멎, 컚테읎너도 쀑닚됩니닀. + +## FastAPI륌 위한 도컀 읎믞지 빌드하Ʞ + +읎제 묎얞가륌 만듀얎 뎅시닀! 🚀 + +**공식 파읎썬** 읎믞지에 Ʞ반하여, FastAPI륌 위한 **도컀 읎믞지**륌 **ë§š 처음부터** 생성하는 방법을 볎읎겠습니닀. + +**대부분의 겜우**에 닀음곌 같은 것듀을 하게 됩니닀. 예륌 듀멎: + +* **쿠버넀티슀** 또는 유사한 도구 사용하Ʞ +* **띌슈베늬 파읎**로 싀행하Ʞ +* 컚테읎너 읎믞지륌 싀행할 큎띌우드 서비슀 사용하Ʞ 등 + +### 요구 팚킀지 + +음반적윌로는 얎플늬쌀읎션의 특정 파음을 위한 **팚킀지 요구 조걎**읎 있을 것입니닀. + +ê·ž 요구 조걎을 **섀치**하는 방법은 여러분읎 사용하는 도구에 따띌 닀륌 것입니닀. + +가장 음반적읞 방법은 팚킀지 읎늄곌 버전읎 쀄 별로 Ʞ록된 `requirements.txt` 파음을 만드는 것입니닀. + +버전의 범위륌 섀정하Ʞ 위핎서는 [FastAPI 버전듀에 대하여](./versions.md){.internal-link target=_blank}에 쓰여진 것곌 같은 아읎디얎륌 사용합니닀. + +예륌 듀얎, `requirements.txt` 파음은 닀음곌 같을 수 있습니닀: + +``` +fastapi>=0.68.0,<0.69.0 +pydantic>=1.8.0,<2.0.0 +uvicorn>=0.15.0,<0.16.0 +``` + +귞늬고 음반적윌로 팚킀지 종속성은 `pip`로 섀치합니닀. 예륌 듀얎: + +
+ +```console +$ pip install -r requirements.txt +---> 100% +Successfully installed fastapi pydantic uvicorn +``` + +
+ +!!! 정볎 + 팚킀지 종속성을 정의하고 섀치하Ʞ 위한 방법곌 도구는 닀양합니닀. + + 나쀑에 아래 섞션에서 Poetry륌 사용한 예시륌 볎읎겠습니닀. 👇 + +### **FastAPI** 윔드 생성하Ʞ + +* `app` 디렉터늬륌 생성하고 읎동합니닀. +* 빈 파음 `__init__.py`을 생성합니닀. +* 닀음곌 같은 `main.py`을 생성합니닀: + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +### 도컀파음 + +읎제 같은 프로젝튞 디렉터늬에 닀음곌 같은 파음 `Dockerfile`을 생성합니닀: + +```{ .dockerfile .annotate } +# (1) +FROM python:3.9 + +# (2) +WORKDIR /code + +# (3) +COPY ./requirements.txt /code/requirements.txt + +# (4) +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (5) +COPY ./app /code/app + +# (6) +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. 공식 파읎썬 베읎슀 읎믞지에서 시작합니닀. + +2. 현재 워킹 디렉터늬륌 `/code`로 섀정합니닀. + + 여Ʞ에 `requirements.txt` 파음곌 `app` 디렉터늬륌 위치시킬 것입니닀. + +3. 요구 조걎곌 파음을 `/code` 디렉터늬로 복사합니닀. + + 처음에는 **였직** 요구 조걎읎 필요한 파음만 복사하고, 읎왞의 윔드는 귞대로 둡니닀. + + 읎 파음읎 **자죌 바뀌지 않Ʞ 때묞에**, 도컀는 파음을 탐지하여 읎 닚계의 **캐시**륌 사용하여 닀음 닚계에서도 캐시륌 사용할 수 있도록 합니닀. + +4. 요구 조걎 파음에 있는 팚킀지 종속성을 섀치합니닀. + + `--no-cache-dir` 옵션은 `pip`에게 닀욎로드한 팚킀지듀을 로컬 환겜에 저장하지 않도록 전달합니닀. 읎는 마치 같은 팚킀지륌 섀치하Ʞ 위핎 였직 `pip`만 닀시 싀행하멎 될 것 같지만, 컚테읎너로 작업하는 겜우 귞렇지는 않습니닀. + + !!! 녾튾 + `--no-cache-dir` 는 였직 `pip`와 ꎀ렚되얎 있윌며, 도컀나 컚테읎너와는 묎ꎀ합니닀. + + `--upgrade` 옵션은 `pip`에게 섀치된 팚킀지듀을 업데읎튞하도록 합니닀. + + 읎전 닚계에서 파음을 복사한 것읎 **도컀 캐시**에 의핎 탐지되Ʞ 때묞에, 읎 닚계에서도 가능한 한 **도컀 캐시**륌 사용하게 됩니닀. + + 읎 닚계에서 캐시륌 사용하멎 **맀번** 몚든 종속성을 닀욎로드 받고 섀치할 필요가 없얎, 개발 곌정에서 읎믞지륌 지속적윌로 생성하는 데에 드는 **시간**을 많읎 **절앜**할 수 있습니닀. + +5. `/code` 디렉터늬에 `./app` 디렉터늬륌 복사합니닀. + + **자죌 변겜되는** 몚든 윔드륌 포핚하고 있Ʞ 때묞에, 도컀 **캐시**는 읎 닚계나 **읎후의 닚계에서** 잘 사용되지 않습니닀. + + 귞러므로 컚테읎너 읎믞지 빌드 시간을 최적화하Ʞ 위핎 `Dockerfile`의 **거의 끝 부분**에 입력하는 것읎 쀑요합니닀. + +6. `uvicorn` 서버륌 싀행하Ʞ 위핎 **컀맚드**륌 섀정합니닀. + + `CMD`는 묞자엎 늬슀튞륌 입력받고, 각 묞자엎은 컀맚드 띌읞의 각 쀄에 입력할 묞자엎입니닀. + + 읎 컀맚드는 **현재 워킹 디렉터늬**에서 싀행되며, 읎는 위에서 `WORKDIR /code`로 섀정한 `/code` 디렉터늬와 같습니닀. + + 프로귞랚읎 `/code`에서 시작하고 ê·ž 속에 `./app` 디렉터늬가 여러분의 윔드와 핚께 듀얎있Ʞ 때묞에, **Uvicorn**은 읎륌 볎고 `app`을 `app.main`윌로부터 **불러 올** 것입니닀. + +!!! 팁 + 각 윔드 띌읞을 윔드의 숫자 버랔을 큎늭하여 늬뷰할 수 있습니닀. 👆 + +읎제 여러분은 닀음곌 같은 디렉터늬 구조륌 가지고 있을 것입니닀: + +``` +. +├── app +│   ├── __init__.py +│ └── main.py +├── Dockerfile +└── requirements.txt +``` + +#### TLS 종료 프록시의 배후 + +만앜 여러분읎 컚테읎너륌 Nginx 또는 Traefik곌 같은 TLS 종료 프록시 (로드 밞런서) 뒀에서 싀행하고 있닀멎, `--proxy-headers` 옵션을 더하는 것읎 좋습니닀. 읎 옵션은 Uvicorn에게 얎플늬쌀읎션읎 HTTPS 등의 뒀에서 싀행되고 있윌므로 프록시에서 전송된 헀더륌 신뢰할 수 있닀고 알늜니닀. + +```Dockerfile +CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] +``` + +#### 도컀 캐시 + +읎 `Dockerfile`에는 쀑요한 튞늭읎 있는데, 처음에는 **의졎성읎 있는 파음만** 복사하고, 나뚞지 윔드는 귞대로 둡니닀. 왜 읎런 방법을 썚알하는지 섀명하겠습니닀. + +```Dockerfile +COPY ./requirements.txt /code/requirements.txt +``` + +도컀와 닀륞 도구듀은 컚테읎너 읎믞지륌 **슝가하는 방식윌로 빌드**합니닀. `Dockerfile`의 ë§š 윗 부분부터 시작핎, 레읎얎 위에 새로욎 레읎얎륌 더하는 방식윌로, `Dockerfile`의 각 지시 사항윌로 부터 생성된 ì–Žë–€ 파음읎든 더핎갑니닀. + +도컀 귞늬고 읎와 유사한 도구듀은 읎믞지 생성 시에 **낎부 캐시**륌 사용합니닀. 만앜 ì–Žë–€ 파음읎 마지막윌로 컚테읎너 읎믞지륌 빌드한 때로부터 바뀌지 않았닀멎, 파음을 닀시 복사하여 새로욎 레읎얎륌 처음부터 생성하는 것읎 아니띌, 마지막에 생성했던 **같은 레읎얎륌 재사용**합니닀. + +닚지 파음 복사륌 지양하는 것윌로 횚윚읎 많읎 향상되는 것은 아니지만, ê·ž 닚계에서 캐시륌 사용했Ʞ 때묞에, **닀음 닚계에서도 마찬가지로 캐시륌 사용**할 수 있습니닀. 예륌 듀얎, 닀음곌 같은 의졎성을 섀치하는 지시 사항을 위한 캐시륌 사용할 수 있습니닀: + +```Dockerfile +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt +``` + +팚킀지륌 포핚하는 파음은 **자죌 변겜되지 않습니닀**. 따띌서 핎당 파음만 복사하므로서, 도컀는 ê·ž 닚계의 **캐시륌 사용**할 수 있습니닀. + +ê·ž 닀음윌로, 도컀는 **닀음 닚계에서** 의졎성을 닀욎로드하고 섀치하는 **캐시륌 사용**할 수 있게 됩니닀. 바로 읎 곌정에서 우늬는 **많은 시간을 절앜**하게 됩니닀. ✹ ...귞늬고 Ʞ닀늬는 지룚핚도 플할 수 있습니닀. 😪😆 + +팚킀지 의졎성을 닀욎로드 받고 섀치하는 데읎는 **수 분읎 걞늎 수 있지만**, **캐시**륌 사용하멎 최대 **수 쎈만에** 끝낌 수 있습니닀. + +또한 여러분읎 개발 곌정에서 윔드의 변겜 사항읎 반영되었는지 확읞하Ʞ 위핎 컚테읎너 읎믞지륌 계속핎서 빌드하멎, 절앜된 시간은 축적되얎 더욱 컀질 것입니닀. + +귞늬고 나서 `Dockerfile`의 거의 끝 부분에서, 몚든 윔드륌 복사합니닀. 읎것읎 **가장 빈번하게 변겜**되는 부분읎며, 대부분의 겜우에 읎 닀음 닚계에서는 캐시륌 사용할 수 없Ʞ 때묞에 가장 마지막에 둡니닀. + +```Dockerfile +COPY ./app /code/app +``` + +### 도컀 읎믞지 생성하Ʞ + +읎제 몚든 파음읎 제자늬에 있윌니, 컚테읎너 읎믞지륌 빌드합니닀. + +* (여러분의 `Dockerfile`곌 `app` 디렉터늬가 위치한) 프로젝튞 디렉터늬로 읎동합니닀. +* FastAPI 읎믞지륌 빌드합니닀: + +
+ +```console +$ docker build -t myimage . + +---> 100% +``` + +
+ +!!! 팁 + ë§š 끝에 있는 `.` 에 죌목합시닀. 읎는 `./`와 동등하며, 도컀에게 컚테읎너 읎믞지륌 빌드하Ʞ 위한 디렉터늬륌 알렀쀍니닀. + + 읎 겜우에는 현재 디렉터늬(`.`)와 같습니닀. + +### 도컀 컚테읎너 시작하Ʞ + +* 여러분의 읎믞지에 Ʞ반하여 컚테읎너륌 싀행합니닀: + +
+ +```console +$ docker run -d --name mycontainer -p 80:80 myimage +``` + +
+ +## 첎크하Ʞ + +여러분의 도컀 컚테읎너 URL에서 싀행 사항을 첎크할 수 있습니닀. 예륌 듀얎: http://192.168.99.100/items/5?q=somequery 또는 http://127.0.0.1/items/5?q=somequery (또는 동음하게, 여러분의 도컀 혞슀튞륌 읎용핎서 첎크할 수도 있습니닀). + +아래와 비슷한 것을 볎게 될 것입니닀: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +## 읞터랙티람 API 묞서 + +읎제 여러분은 http://192.168.99.100/docs 또는 http://127.0.0.1/docs로 읎동할 수 있습니닀(또는, 여러분의 도컀 혞슀튞륌 읎용할 수 있습니닀). + +여러분은 자동윌로 생성된 읞터랙티람 API(Swagger UI에서 제공된)륌 볌 수 있습니닀: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +## 대안 API 묞서 + +또한 여러분은 http://192.168.99.100/redoc 또는 http://127.0.0.1/redoc윌로 읎동할 수 있습니닀(또는, 여러분의 도컀 혞슀튞륌 읎용할 수 있습니닀). + +여러분은 자동윌로 생성된 대안 묞서(ReDoc에서 제공된)륌 볌 수 있습니닀: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## 닚음 파음 FastAPI로 도컀 읎믞지 생성하Ʞ + +만앜 여러분의 FastAPI가 하나의 파음읎띌멎, 예륌 듀얎 `./app` 디렉터늬 없읎 `main.py` 파음만윌로 읎룚얎젞 있닀멎, 파음 구조는 닀음곌 유사할 것입니닀: + +``` +. +├── Dockerfile +├── main.py +└── requirements.txt +``` + +귞러멎 여러분듀은 `Dockerfile` 낎에 있는 파음을 복사하Ʞ 위핎 ê·žì € 상응하는 겜로륌 바꟞Ʞ만 하멎 됩니닀: + +```{ .dockerfile .annotate hl_lines="10 13" } +FROM python:3.9 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (1) +COPY ./main.py /code/ + +# (2) +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. `main.py` 파음을 `/code` 디렉터늬로 곧바로 복사합니닀(`./app` 디렉터늬는 고렀하지 않습니닀). + +2. Uvicorn을 싀행핎 `app` 객첎륌 (`app.main` 대신) `main`윌로 부터 불러였도록 합니닀. + +ê·ž 닀음 Uvicorn 컀맚드륌 조정핎서 FastAPI 객첎륌 불러였는데 `app.main` 대신에 새로욎 몚듈 `main`을 사용하도록 합니닀. + +## 배포 개념 + +읎제 컚테읎너의 잡멎에서 [배포 개념](./concepts.md){.internal-link target=_blank}에서 닀룚었던 것곌 같은 배포 개념에 대핮 읎알Ʞ핎 볎겠습니닀. + +컚테읎너는 죌로 얎플늬쌀읎션을 빌드하고 배포하Ʞ 위한 곌정을 닚순화하는 도구읎지만, **배포 개념**에 대한 특정한 접귌법을 강요하지 않Ʞ 때묞에 가능한 배포 전략에는 여러가지가 있습니닀. + +**좋은 소식**은 서로 닀륞 전략듀을 포ꎄ하는 배포 개념읎 있닀는 점입니닀. 🎉 + +컚테읎너 잡멎에서 **배포 개념**을 늬뷰핎 볎겠습니닀: + +* HTTPS +* 구동하Ʞ +* 재시작 +* 복제 (싀행 쀑읞 프로섞슀 개수) +* 메몚늬 +* 시작하Ʞ 전 닚계듀 + +## HTTPS + +만앜 우늬가 FastAPI 얎플늬쌀읎션을 위한 **컚테읎너 읎믞지**에만 집쀑한닀멎 (귞늬고 나쀑에 싀행될 **컚테읎너**에), HTTPS는 음반적윌로 닀륞 도구에 의핎 **왞부적윌로** 닀룚얎질 것 입니닀. + +**HTTPS**와 **읞슝서**의 **자동** 췚득을 닀룚는 것은 닀륞 컚테읎너가 될 수 있는데, 예륌 듀얎 Traefik을 사용하는 것입니닀. + +!!! 팁 + Traefik은 도컀, 쿠버넀티슀, 귞늬고 닀륞 도구와 통합되얎 있얎 여러분의 컚테읎너륌 포핚하는 HTTPS륌 셋업하고 섀정하는 것읎 맀우 쉜습니닀. + +대안적윌로, HTTPS는 큎띌우드 제공자에 의핎 서비슀의 음환윌로 닀룚얎질 수도 있습니닀 (읎때도 얎플늬쌀읎션은 여전히 컚테읎너에서 싀행될 것입니닀). + +## 구동곌 재시작 + +여러분의 컚테읎너륌 **시작하고 싀행하는** 데에 음반적윌로 사용되는 도구는 따로 있습니닀. + +읎는 **도컀** 자첎음 수도 있고, **도컀 컎포슈**, **쿠버넀티슀**, **큎띌우드 서비슀** 등읎 될 수 있습니닀. + +대부분 (또는 전첎) 겜우에, 컚테읎너륌 구동하거나 고장시에 재시작하도록 하는 간닚한 옵션읎 있습니닀. 예륌 듀얎, 도컀에서는, 컀맚드 띌읞 옵션 `--restart` 입니닀. + +컚테읎너륌 사용하지 않고서는, 얎플늬쌀읎션을 구동하고 재시작하는 것읎 맀우 번거롭고 얎렀욞 수 있습니닀. 하지만 **컚테읎너륌 사용한닀멎** 대부분의 겜우에 읎런 Ʞ능은 Ʞ볞적윌로 포핚되얎 있습니닀. ✹ + +## 복제 - 프로섞슀 개수 + +만앜 여러분읎 **쿠버넀티슀**와 ëšžì‹  큎러슀터, 도컀 슀왐 몚드, 녾마드, 또는 닀륞 여러 ëšžì‹  위에 분산 컚테읎너륌 ꎀ늬하는 복잡한 시슀템을 닀룚고 있닀멎, 여러분은 각 컚테읎너에서 (워컀와 핚께 사용하는 Gunicorn 같은) **프로섞슀 맀니저** 대신 **큎러슀터 레벚**에서 **복제륌 닀룚**ê³  싶을 것입니닀. + +쿠버넀티슀와 같은 분산 컚테읎너 ꎀ늬 시슀템 쀑 음부는 음반적윌로 듀얎였는 요청에 대한 **로드 밞런싱**을 지원하멎서 **컚테읎너 복제**륌 닀룚는 통합된 방법을 가지고 있습니닀. 몚두 **큎러슀터 레벚**에서 말읎죠. + +읎런 겜우에, 여러분은 [위에서 묘사된 것](#dockerfile)처럌 **처음부터 도컀 읎믞지륌** 빌드핎서, 의졎성을 섀치하고, Uvicorn 워컀륌 ꎀ늬하는 Gunicorn 대신 **닚음 Uvicorn 프로섞슀**륌 싀행하고 싶을 것입니닀. + +### 로드 밞런서 + +컚테읎너로 작업할 때, 여러분은 음반적윌로 **메읞 포튞의 상황을 감지하는** 요소륌 가지고 있을 것입니닀. 읎는 **HTTPS**륌 닀룚는 **TLS 종료 프록시**와 같은 닀륞 컚테읎너음 수도 있고, 유사한 닀륞 도구음 수도 있습니닀. + +읎 요소가 요청듀의 **로드**륌 읜얎듀읎고 각 워컀에게 (바띌걎대) **균형적윌로** 분배한닀멎, 읎 요소는 음반적윌로 **로드 밞런서**띌고 불늜니닀. + +!!! 팁 + HTTPS륌 위핎 사용된 **TLS 종료 프록시** 요소 또한 **로드 밞런서**가 될 수 있습니닀. + +또한 컚테읎너로 작업할 때, 컚테읎너륌 시작하고 ꎀ늬하Ʞ 위핎 사용한 것곌 동음한 시슀템은 읎믞 핎당 **로드 밞런서**로 부터 여러분의 앱에 핎당하는 컚테읎너로 **넀튞워크 통신**(예륌 듀얎, HTTP 요청)을 전송하는 낎부적읞 도구륌 가지고 있을 것입니닀 (여Ʞ서도 로드 밞런서는 **TLS 종료 프록시**음 수 있습니닀). + +### 하나의 로드 밞런서 - 닀쀑 워컀 컚테읎너 + +**쿠버넀티슀**나 또는 닀륞 분산 컚테읎너 ꎀ늬 시슀템윌로 작업할 때, 시슀템 낎부의 넀튞워킹 메컀니슘을 읎용핚윌로썚 메읞 **포튞**륌 감지하고 있는 닚음 **로드 밞런서**는 여러분의 앱에서 싀행되고 있는 **여러개의 컚테읎너**에 통신(요청듀)을 전송할 수 있게 됩니닀. + +여러분의 앱에서 싀행되고 있는 각각의 컚테읎너는 음반적윌로 **하나의 프로섞슀**만 가질 것입니닀 (예륌 듀얎, FastAPI 얎플늬쌀읎션에서 싀행되는 하나의 Uvicorn 프로섞슀처럌). 읎 컚테읎너듀은 몚두 같은 것을 싀행하는 점에서 **동음한 컚테읎너**읎지만, 프로섞슀, 메몚늬 등은 공유하지 않습니닀. 읎 방식윌로 여러분은 CPU의 **서로 닀륞 윔얎듀** 또는 **서로 닀륞 ëšžì‹ ë“€**을 **병렬화**하는 읎점을 얻을 수 있습니닀. + +또한 **로드 밞런서**가 있는 분산 컚테읎너 시슀템은 여러분의 앱에 있는 컚테읎너 각각에 **찚례대로 요청을 분산**시킬 것 입니닀. 따띌서 각 요청은 여러분의 앱에서 싀행되는 여러개의 **복제된 컚테읎너듀** 쀑 하나에 의핎 닀룚얎질 것 입니닀. + +귞늬고 음반적윌로 **로드 밞런서**는 여러분의 큎러슀터에 있는 *닀륞* 앱윌로 가는 요청듀도 닀룰 수 있윌며 (예륌 듀얎, 닀륞 도메읞윌로 가거나 닀륞 URL 겜로 접두사륌 가지는 겜우), 읎 통신듀을 큎러슀터에 있는 *바로 ê·ž 닀륞* 얎플늬쌀읎션윌로 제대로 전송할 수 있습니닀. + +### 닚음 프로섞슀륌 가지는 컚테읎너 + +읎 시나늬였의 겜우, 여러분은 읎믞 큎러슀터 레벚에서 복제륌 닀룚고 있을 것읎므로 **컚테읎너 당 닚음 (Uvicorn) 프로섞슀**륌 가지고자 할 것입니닀. + +따띌서, 여러분은 Gunicorn 읎나 Uvicorn 워컀, 또는 Uvicorn 워컀륌 사용하는 Uvicorn 맀니저와 같은 프로섞슀 맀니저륌 가지고 싶얎하지 **않을** 것입니닀. 여러분은 컚테읎너 당 **닚음 Uvicorn 프로섞슀**륌 가지고 ì‹¶ì–Ží•  것입니닀 (귞러나 아마도 닀쀑 컚테읎너륌 가질 것입니닀). + +읎믞 여러분읎 큎러슀터 시슀템을 ꎀ늬하고 있윌므로, (Uvicorn 워컀륌 ꎀ늬하는 Gunicorn 읎나 Uvicorn 처럌) 컚테읎너 낎에 닀륞 프로섞슀 맀니저륌 가지는 것은 **불필요한 복잡성**만 더하게 될 것입니닀. + +### 닀쀑 프로섞슀륌 가지는 컚테읎너와 특수한 겜우듀 + +당연한 말읎지만, 여러분읎 낎부적윌로 **Uvicorn 워컀 프로섞슀듀**륌 시작하는 **Gunicorn 프로섞슀 맀니저**륌 가지는 닚음 컚테읎너륌 원하는 **특수한 겜우**도 있을 것입니닀. + +귞런 겜우에, 여러분듀은 **Gunicorn**을 프로섞슀 맀니저로 포핚하는 **공식 도컀 읎믞지**륌 사용할 수 있습니닀. 읎 프로섞슀 맀니저는 닀쀑 **Uvicorn 워컀 프로섞슀듀**을 싀행하며, 디폮튾 섞팅윌로 현재 CPU 윔얎에 Ʞ반하여 자동윌로 워컀 개수륌 조정합니닀. 읎 사항에 대핎서는 아래의 [Gunicorn곌 핚께하는 공식 도컀 읎믞지 - Uvicorn](#official-docker-image-with-gunicorn-uvicorn)에서 더 닀룚겠습니닀. + +읎런 겜우에 핎당하는 몇가지 예시가 있습니닀: + +#### 닚순한 앱 + +만앜 여러분의 얎플늬쌀읎션읎 **충분히 닚순**핎서 (적얎도 아직은) 프로섞슀 개수륌 파읞-튠 할 필요가 없거나 큎러슀터가 아닌 **닚음 서버**에서 싀행하고 있닀멎, 여러분은 컚테읎너 낎에 프로섞슀 맀니저륌 사용하거나 (공식 도컀 읎믞지에서) 자동윌로 섀정되는 디폮튾 값을 사용할 수 있습니닀. + +#### 도컀 구성 + +여러분은 **도컀 컎포슈**로 (큎러슀터가 아닌) **닚음 서버로** 배포할 수 있윌며, 읎 겜우에 공유된 넀튞워크와 **로드 밞런싱**을 포핚하는 (도컀 컎포슈로) 컚테읎너의 복제륌 ꎀ늬하는 닚순한 방법읎 없을 수도 있습니닀. + +귞렇닀멎 여러분은 **프로섞슀 맀니저**와 핚께 낎부에 **몇개의 워컀 프로섞슀듀**을 시작하는 **닚음 컚테읎너**륌 필요로 할 수 있습니닀. + +#### Prometheus와 닀륞 읎유듀 + +여러분은 **닚음 프로섞슀**륌 가지는 **닀쀑 컚테읎너** 대신 **닀쀑 프로섞슀**륌 가지는 **닚음 컚테읎너**륌 채택하는 **닀륞 읎유**가 있을 수 있습니닀. + +예륌 듀얎 (여러분의 장치 섀정에 따띌) Prometheus 익슀포터와 같읎 같은 컚테읎너에 듀얎였는 **각 요청에 대핮** 접귌권한을 가지는 도구륌 사용할 수 있습니닀. + +읎 겜우에 여러분읎 **여러개의 컚테읎너듀**을 가지고 있닀멎, Prometheus가 **메튞늭을 읜얎 듀음 때**, 디폎튞로 **맀번 하나의 컚테읎너**(특정 늬퀘슀튞륌 ꎀ늬하는 바로 ê·ž 컚테읎너)로 부터 읜얎듀음 것입니닀. 읎는 몚든 복제된 컚테읎너에 대핮 **축적된 메튞늭듀**을 읜얎듀읎는 것곌 대비됩니닀. + +귞렇닀멎 읎 겜우에는 **닀쀑 프로섞슀**륌 가지는 **하나의 컚테읎너**륌 두얎서 같은 컚테읎너에서 몚든 낎부 프로섞슀에 대한 Prometheus 메튞늭을 수집하는 로컬 도구(예륌 듀얎 Prometheus 익슀포터 같은)륌 두얎서 읎 메귞늭듀을 하나의 컚테읎너에 낎에서 공유하는 방법읎 더 닚순할 것입니닀. + +--- + +요점은, 읎 쀑의 **얎느것도** 여러분듀읎 반드시 따띌알하는 **확정된 사싀**읎 아니띌는 것입니닀. 여러분은 읎 아읎디얎듀을 **여러분의 고유한 읎용 사례륌 평가**하는데 사용하고, 여러분의 시슀템에 가장 적합한 접귌법읎 ì–Žë–€ 것읞지 결정하며, 닀음의 개념듀을 ꎀ늬하는 방법을 확읞할 수 있습니닀: + +* 볎안 - HTTPS +* 구동하Ʞ +* 재시작 +* 복제 (싀행 쀑읞 프로섞슀 개수) +* 메몚늬 +* 시작하Ʞ 전 닚계듀 + +## 메몚늬 + +만앜 여러분읎 **컚테읎너 당 닚음 프로섞슀**륌 싀행한닀멎, 여러분은 각 컚테읎너(복제된 겜우에는 여러개의 컚테읎너듀)에 대핮 잘 정의되고, 안정적읎며, 제한된 용량의 메몚늬 소비량을 가지고 있을 것입니닀. + +귞러멎 여러분의 컚테읎너 ꎀ늬 시슀템(예륌 듀얎 **쿠버넀티슀**) 섀정에서 앞서 정의된 것곌 같은 메몚늬 제한곌 요구사항을 섀정할 수 있습니닀. 읎런 방법윌로 **가용 ëšžì‹ **읎 필요로하는 메몚늬와 큎러슀터에 있는 가용 뚞신듀을 엌두에 두고 **컚테읎너륌 복제**할 수 있습니닀. + +만앜 여러분의 얎플늬쌀읎션읎 **닚순**하닀멎, 읎것은 **묞제가 되지 않을** 것읎고, 고정된 메몚늬 제한을 구첎화할 필요도 없을 것입니닀. 하지만 여러분의 얎플늬쌀읎션읎 (예륌 듀얎 **ëšžì‹  러닝** 몚덞같읎) **많은 메몚늬륌 소요한닀멎**, 얎플늬쌀읎션읎 얌마나 많은 양의 메몚늬륌 사용하는지 확읞하고 **각 뚞신에서** 사용하는 **컚테읎너의 수**륌 조정할 필요가 있습니닀 (귞늬고 필요에 따띌 여러분의 큎러슀터에 뚞신을 추가할 수 있습니닀). + +만앜 여러분읎 **컚테읎너 당 여러개의 프로섞슀**륌 싀행한닀멎 (예륌 듀얎 공식 도컀 읎믞지 처럌), 여러분은 시작된 프로섞슀 개수가 가용한 것 볎닀 **더 많은 메몚늬륌 소비**하지 않는지 확읞핎알 합니닀. + +## 시작하Ʞ 전 닚계듀곌 컚테읎너 + +만앜 여러분읎 컚테읎너(예륌 듀얎 도컀, 쿠버넀티슀)륌 사용한닀멎, 여러분읎 접귌할 수 있는 죌요 방법은 크게 두가지가 있습니닀. + +### 닀쀑 컚테읎너 + +만앜 여러분읎 **여러개의 컚테읎너**륌 가지고 있닀멎, 아마도 각각의 컚테읎너는 **하나의 프로섞슀**륌 가지고 있을 것입니닀(예륌 듀얎, **쿠버넀티슀** 큎러슀터에서). 귞러멎 여러분은 복제된 워컀 컚테읎너륌 싀행하Ʞ **읎전에**, 하나의 컚테읎너에 있는 **읎전의 닚계듀을** 수행하는 닚음 프로섞슀륌 가지는 **별도의 컚테읎너듀**을 가지고 싶을 것입니닀. + +!!! 정볎 + 만앜 여러분읎 쿠버넀티슀륌 사용하고 있닀멎, 아마도 읎는 Init Container음 것입니닀. + +만앜 여러분의 읎용 사례에서 읎전 닚계듀을 **병렬적윌로 여러번** 수행하는데에 묞제가 없닀멎 (예륌 듀얎 데읎터베읎슀 읎전을 싀행하지 않고 데읎터베읎슀가 쀀비되었는지 확읞만 하는 겜우), 메읞 프로섞슀륌 시작하Ʞ 전에 읎 닚계듀을 각 컚테읎너에 넣을 수 있습니닀. + +### 닚음 컚테읎너 + +만앜 여러분의 셋업읎 **닀쀑 프로섞슀**(또는 하나의 프로섞슀)륌 시작하는 **하나의 컚테읎너**륌 가지는 닚순한 셋업읎띌멎, 사전 닚계듀을 앱을 포핚하는 프로섞슀륌 시작하Ʞ 직전에 같은 컚테읎너에서 싀행할 수 있습니닀. 공식 도컀 읎믞지는 읎륌 낎부적윌로 지원합니닀. + +## Gunicorn곌 핚께하는 공식 도컀 읎믞지 - Uvicorn + +앞 챕터에서 자섞하게 섀명된 것 처럌, Uvicorn 워컀와 같읎 싀행되는 Gunicorn을 포핚하는 공식 도컀 읎믞지가 있습니닀: [서버 워컀 - Uvicorn곌 핚께하는 Gunicorn](./server-workers.md){.internal-link target=_blank}. + +읎 읎믞지는 죌로 위에서 섀명된 상황에서 유용할 것입니닀: [닀쀑 프로섞슀륌 가지는 컚테읎너와 특수한 겜우듀](#containers-with-multiple-processes-and-special-cases). + +* tiangolo/uvicorn-gunicorn-fastapi. + +!!! 겜고 + 여러분읎 읎 베읎슀 읎믞지 또는 닀륞 유사한 읎믞지륌 필요로 하지 **않을** 높은 가능성읎 있윌며, [위에서 섀명된 것처럌: FastAPI륌 위한 도컀 읎믞지 빌드하Ʞ](#build-a-docker-image-for-fastapi) 처음부터 읎믞지륌 빌드하는 것읎 더 나을 수 있습니닀. + +읎 읎믞지는 가능한 CPU 윔얎에 Ʞ반한 **몇개의 워컀 프로섞슀**륌 섀정하는 **자동-튜닝** 메컀니슘을 포핚하고 있습니닀. + +읎 읎믞지는 **믌감한 디폮튾** 값을 가지고 있지만, 여러분듀은 여전히 **환겜 변수** 또는 섀정 파음을 통핎 섀정값을 수정하고 업데읎튞 할 수 있습니닀. + +또한 슀크늜튞륌 통핎 **시작하Ʞ 전 사전 닚계**륌 싀행하는 것을 지원합니닀. + +!!! 팁 + 몚든 섀정곌 옵션을 볎렀멎, 도컀 읎믞지 페읎지로 읎동합니닀: tiangolo/uvicorn-gunicorn-fastapi. + +### 공식 도컀 읎믞지에 있는 프로섞슀 개수 + +읎 읎믞지에 있는 **프로섞슀 개수**는 가용한 CPU **윔얎듀**로 부터 **자동윌로 계산**됩니닀. + +읎것읎 의믞하는 바는 읎믞지가 CPU로부터 **최대한의 성능**을 **쥐얎짜낞닀**는 것입니닀. + +여러분은 읎 섀정 값을 **환겜 변수**나 Ʞ타 방법듀로 조정할 수 있습니닀. + +귞러나 프로섞슀의 개수가 컚테읎너가 싀행되고 있는 CPU에 의졎한닀는 것은 또한 **소요되는 메몚늬의 크Ʞ** 또한 읎에 의졎한닀는 것을 의믞합니닀. + +귞렇Ʞ 때묞에, 만앜 여러분의 얎플늬쌀읎션읎 많은 메몚늬륌 요구하고 (예륌 듀얎 뚞신러닝 몚덞처럌), 여러분의 서버가 CPU 윔얎 수는 많지만 **적은 메몚늬**륌 가지고 있닀멎, 여러분의 컚테읎너는 가용한 메몚늬볎닀 많은 메몚늬륌 사용하렀고 시도할 수 있윌며, ê²°êµ­ 퍌포뚌슀륌 크게 떚얎뜚늎 수 있습니닀(심지얎 고장읎 날 수도 있습니닀). 🚚 + +### `Dockerfile` 생성하Ʞ + +읎 읎믞지에 Ʞ반핎 `Dockerfile`을 생성하는 방법은 닀음곌 같습니닀: + +```Dockerfile +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./app /app +``` + +### 더 큰 얎플늬쌀읎션 + +만앜 여러분읎 [닀쀑 파음을 가지는 더 큰 얎플늬쌀읎션](../tutorial/bigger-applications.md){.internal-link target=_blank}을 생성하는 섹션을 따랐닀멎, 여러분의 `Dockerfile`은 대신 읎렇게 생게을 것입니닀: + +```Dockerfile hl_lines="7" +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./app /app/app +``` + +### ì–žì œ 사용할까 + +여러분듀읎 **쿠버넀티슀**(또는 유사한 닀륞 도구) 사용하거나 큎러슀터 레벚에서 닀쀑 컚테읎너륌 읎용핎 읎믞 **사볞**을 섀정하고 있닀멎, 공식 베읎슀 읎믞지(또는 유사한 닀륞 읎믞지)륌 사용하지 **않는** 것 좋습니닀. 귞런 겜우에 여러분은 닀음에 섀명된 것 처럌 **처음부터 읎믞지륌 빌드하는 것**읎 더 낫습니닀: [FastAPI륌 위한 도컀 읎믞지 빌드하Ʞ](#build-a-docker-image-for-fastapi). + +읎 읎믞지는 위의 [닀쀑 프로섞슀륌 가지는 컚테읎너와 특수한 겜우듀](#containers-with-multiple-processes-and-special-cases)에서 섀명된 특수한 겜우에 대핎서만 죌로 유용할 것입니닀. 예륌 듀얎, 만앜 여러분의 얎플늬쌀읎션읎 **충분히 닚순**핎서 CPU에 Ʞ반한 디폮튾 프로섞슀 개수륌 섀정하는 것읎 잘 작동한닀멎, 큎러슀터 레벚에서 수동윌로 사볞을 섀정할 필요가 없을 것읎고, 여러분의 앱에서 하나 읎상의 컚테읎너륌 싀행하지도 않을 것입니닀. 또는 만앜에 여러분읎 **도컀 컎포슈**로 배포하거나, 닚음 서버에서 싀행하거나 하는 겜우에도 마찬가지입니닀. + +## 컚테읎너 읎믞지 배포하Ʞ + +컚테읎너 (도컀) 읎믞지륌 완성한 뒀에 읎륌 배포하는 방법에는 여러가지 방법읎 있습니닀. + +예륌 듀얎: + +* 닚음 서버에서 **도컀 컎포슈**로 배포하Ʞ +* **쿠버넀티슀** 큎러슀터로 배포하Ʞ +* 도컀 슀왐 몚드 큎러슀터로 배포하Ʞ +* 녾마드 같은 닀륞 도구로 배포하Ʞ +* 여러분의 컚테읎너 읎믞지륌 배포핎죌는 큎띌우드 서비슀로 배포하Ʞ + +## Poetry의 도컀 읎믞지 + +만앜 여러분듀읎 프로젝튞 의졎성을 ꎀ늬하Ʞ 위핎 Poetry륌 사용한닀멎, 도컀의 멀티-슀테읎지 빌딩을 사용할 수 있습니닀: + +```{ .dockerfile .annotate } +# (1) +FROM python:3.9 as requirements-stage + +# (2) +WORKDIR /tmp + +# (3) +RUN pip install poetry + +# (4) +COPY ./pyproject.toml ./poetry.lock* /tmp/ + +# (5) +RUN poetry export -f requirements.txt --output requirements.txt --without-hashes + +# (6) +FROM python:3.9 + +# (7) +WORKDIR /code + +# (8) +COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt + +# (9) +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (10) +COPY ./app /code/app + +# (11) +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. 첫 슀테읎지로, `requirements-stage`띌고 읎늄 붙였습니닀. + +2. `/tmp`륌 현재의 워킹 디렉터늬로 섀정합니닀. + + 읎 위치에 우늬는 `requirements.txt` 파음을 생성할 것입니닀. + +3. 읎 도컀 슀테읎지에서 Poetry륌 섀치합니닀. + +4. 파음 `pyproject.toml`와 `poetry.lock`륌 `/tmp` 디렉터늬로 복사합니닀. + + `./poetry.lock*` (`*`로 끝나는) 파음을 사용하Ʞ 때묞에, 파음읎 아직 사용가능하지 않더띌도 고장나지 않을 것입니닀. + +5. `requirements.txt` 파음을 생성합니닀. + +6. 읎것읎 마지막 슀테읎지로, 여Ʞ에 위치한 몚든 것읎 마지막 컚테읎너 읎믞지에 포핚될 것입니닀. + +7. 현재의 워킹 디렉터늬륌 `/code`로 섀정합니닀. + +8. 파음 `requirements.txt`륌 `/code` 디렉터늬로 복사합니닀. + + 읎 파음은 였직 읎전의 도컀 슀테읎지에만 졎재하며, 때묞에 복사하Ʞ 위핎서 `--from-requirements-stage` 옵션읎 필요합니닀. + +9. 생성된 `requirements.txt` 파음에 팚킀지 의졎성을 섀치합니닀. + +10. `app` 디렉터늬륌 `/code` 디렉터늬로 복사합니닀. + +11. `uvicorn` 컀맚드륌 싀행하여, `app.main`에서 불러옚 `app` 객첎륌 사용하도록 합니닀. + +!!! 팁 + 버랔 숫자륌 큮멭핮 각 쀄읎 하는 음을 알아볌 수 있습니닀. + +**도컀 슀테읎지**란 `Dockefile`의 음부로서 나쀑에 사용하Ʞ 위한 파음듀을 생성하Ʞ 위한 **음시적읞 컚테읎너 읎믞지**로 작동합니닀. + +첫 슀테읎지는 였직 **Poetry륌 섀치**하고 Poetry의 `pyproject.toml` 파음로부터 프로젝튞 의졎성을 위한 **`requirements.txt`륌 생성**하Ʞ 위핎 사용됩니닀. + +읎 `requirements.txt` 파음은 **닀음 슀테읎지**에서 `pip`로 사용될 것입니닀. + +마지막 컚테읎너 읎믞지에는 **였직 마지막 슀테읎지만** 볎졎됩니닀. 읎전 슀테읎지(ë“€)은 버렀집니닀. + +Poetry륌 사용할 때 **도컀 멀티-슀테읎지 빌드**륌 사용하는 것읎 좋은데, 여러분듀의 프로젝튞 의졎성을 섀치하Ʞ 위핎 마지막 컚테읎너 읎믞지에 **였직** `requirements.txt` 파음만 필요하지, Poetry와 ê·ž 의졎성은 있을 필요가 없Ʞ 때묞입니닀. + +읎 닀음 (또한 마지막) 슀테읎지에서 여러분듀은 읎전에 섀명된 것곌 비슷한 방식윌로 방식윌로 읎믞지륌 빌드할 수 있습니닀. + +### TLS 종료 프록시의 배후 - Poetry + +읎전에 얞꞉한 것곌 같읎, 만앜 여러분읎 컚테읎너륌 Nginx 또는 Traefik곌 같은 TLS 종료 프록시 (로드 밞런서) 뒀에서 싀행하고 있닀멎, 컀맚드에 `--proxy-headers` 옵션을 추가합니닀: + +```Dockerfile +CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] +``` + +## 요앜 + +컚테읎너 시슀템(예륌 듀얎 **도컀**나 **쿠버넀티슀**)을 사용하여 몚든 **배포 개념**을 닀룚는 것은 ꜀ 간닚합니닀: + +* HTTPS +* 구동하Ʞ +* 재시작 +* 복제 (싀행 쀑읞 프로섞슀 개수) +* 메몚늬 +* 시작하Ʞ 전 닚계듀 + +대부분의 겜우에서 여러분은 ì–Žë–€ 베읎슀 읎믞지도 사용하지 않고 공식 파읎썬 도컀 읎믞지에 Ʞ반핎 **처음부터 컚테읎너 읎믞지륌 빌드**할 것입니닀. + +`Dockerfile`에 있는 지시 사항을 **순서대로** 닀룚고 **도컀 캐시**륌 사용하는 것윌로 여러분은 **빌드 시간을 최소화**할 수 있윌며, 읎로썚 생산성을 최대화할 수 있습니닀 (귞늬고 지룚핚을 플할 수 있죠) 😎 + +특별한 겜우에는, FastAPI륌 위한 공식 도컀 읎믞지륌 사용할 수도 있습니닀. 🀓 From 22c34a39561e3c95eac73847e7279bc0e97912c2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:54:45 +0000 Subject: [PATCH 072/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7f88bc379..7407d7c0b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/deployment/index.md`. PR [#4561](https://github.com/tiangolo/fastapi/pull/4561) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/path-operation-configuration.md`. PR [#3639](https://github.com/tiangolo/fastapi/pull/3639) by [@jungsu-kwon](https://github.com/jungsu-kwon). * 🌐 Modify the description of `zh` - Traditional Chinese. PR [#10889](https://github.com/tiangolo/fastapi/pull/10889) by [@cherinyy](https://github.com/cherinyy). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/static-files.md`. PR [#2957](https://github.com/tiangolo/fastapi/pull/2957) by [@jeesang7](https://github.com/jeesang7). From f8e77fb64c358d44b71d5a77389ffac3b7ca0509 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:55:21 +0000 Subject: [PATCH 073/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7407d7c0b..37936f5ad 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/deployment/server-workers.md`. PR [#4935](https://github.com/tiangolo/fastapi/pull/4935) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/deployment/index.md`. PR [#4561](https://github.com/tiangolo/fastapi/pull/4561) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/path-operation-configuration.md`. PR [#3639](https://github.com/tiangolo/fastapi/pull/3639) by [@jungsu-kwon](https://github.com/jungsu-kwon). * 🌐 Modify the description of `zh` - Traditional Chinese. PR [#10889](https://github.com/tiangolo/fastapi/pull/10889) by [@cherinyy](https://github.com/cherinyy). From 0a105dc285ed5026d9fada2fe0105d005ec0db73 Mon Sep 17 00:00:00 2001 From: bilal alpaslan <47563997+BilalAlpaslan@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:55:41 +0300 Subject: [PATCH 074/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/project-generation.md`=20(#5192)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/project-generation.md | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/tr/docs/project-generation.md diff --git a/docs/tr/docs/project-generation.md b/docs/tr/docs/project-generation.md new file mode 100644 index 000000000..75e3ae339 --- /dev/null +++ b/docs/tr/docs/project-generation.md @@ -0,0 +1,84 @@ +# Proje oluşturma - Şablonlar + +Başlamak için bir proje oluşturucu kullanabilirsiniz, çÌnkÃŒ sizin için önceden yapılmış birçok başlangıç ​​kurulumu, gÃŒvenlik, veritabanı ve temel API endpoinlerini içerir. + +Bir proje oluşturucu, her zaman kendi ihtiyaçlarınıza göre gÃŒncellemeniz ve uyarlamanız gereken esnek bir kuruluma sahip olacaktır, ancak bu, projeniz için iyi bir başlangıç ​​noktası olabilir. + +## Full Stack FastAPI PostgreSQL + +GitHub: https://github.com/tiangolo/full-stack-fastapi-postgresql + +### Full Stack FastAPI PostgreSQL - Özellikler + +* Full **Docker** entegrasyonu (Docker based). +* Docker Swarm Mode ile deployment. +* **Docker Compose** entegrasyonu ve lokal geliştirme için optimizasyon. +* Uvicorn ve Gunicorn ile **Production ready** Python web server'ı. +* Python **FastAPI** backend: + * **Hızlı**: **NodeJS** ve **Go** ile eşit, çok yÃŒksek performans (Starlette ve Pydantic'e teşekkÃŒrler). + * **Sezgisel**: Editor desteğı. Otomatik tamamlama. Daha az debugging. + * **Kolay**: Kolay öğrenip kolay kullanmak için tasarlandı. Daha az dökÃŒman okuma daha çok iş. + * **Kısa**: Minimum kod tekrarı. Her parametre bildiriminde birden çok özellik. + * **GÌçlÃŒ**: Production-ready. Otomatik interaktif dökÃŒmantasyon. + * **Standartlara dayalı**: API'ler için açık standartlara dayanır (ve tamamen uyumludur): OpenAPI ve JSON Şeması. + * **Birçok diger özelliği** dahili otomatik doğrulama, serialization, interaktif dokÃŒmantasyon, OAuth2 JWT token ile authentication, vb. +* **GÃŒvenli şifreleme** . +* **JWT token** kimlik doğrulama. +* **SQLAlchemy** models (Flask dan bağımsızdır. Celery worker'ları ile kullanılabilir). +* Kullanıcılar için temel başlangıç ​​modeli (gerektiği gibi değiştirin ve kaldırın). +* **Alembic** migration. +* **CORS** (Cross Origin Resource Sharing). +* **Celery** worker'ları ile backend içerisinden seçilen işleri çalıştırabilirsiniz. +* **Pytest**'e dayalı, Docker ile entegre REST backend testleri ile veritabanından bağımsız olarak tam API etkileşimini test edebilirsiniz. Docker'da çalıştığı için her seferinde sıfırdan yeni bir veri deposu oluşturabilir (böylece ElasticSearch, MongoDB, CouchDB veya ne istersen kullanabilirsin ve sadece API'nin çalışıp çalışmadığını test edebilirsin). +* Atom Hydrogen veya Visual Studio Code Jupyter gibi uzantılarla uzaktan veya Docker içi geliştirme için **Jupyter Çekirdekleri** ile kolay Python entegrasyonu. +* **Vue** ile frontend: + * Vue CLI ile oluşturulmuş. + * Dahili **JWT kimlik doğrulama**. + * Dahili Login. + * Login sonrası, Kontrol paneli. + * Kullanıcı oluşturma ve dÃŒzenleme kontrol paneli + * Kendi kendine kullanıcı sÃŒrÃŒmÃŒ. + * **Vuex**. + * **Vue-router**. + * **Vuetify** gÃŒzel material design kompanentleri için. + * **TypeScript**. + * **Nginx** tabanlı Docker sunucusu (Vue-router için yapılandırılmış). + * Docker ile multi-stage yapı, böylece kodu derlemeniz, kaydetmeniz veya işlemeniz gerekmez. + * Derleme zamanında Frontend testi (devre dışı bırakılabilir). + * MÃŒmkÃŒn olduğu kadar modÃŒler yapılmıştır, bu nedenle kutudan çıktığı gibi çalışır, ancak Vue CLI ile yeniden oluşturabilir veya ihtiyaç duyduğunuz şekilde oluşturabilir ve istediğinizi yeniden kullanabilirsiniz. +* **PGAdmin** PostgreSQL database admin tool'u, PHPMyAdmin ve MySQL ile kolayca değiştirilebilir. +* **Flower** ile Celery job'larını monitörleme. +* **Traefik** ile backend ve frontend arasında yÃŒk dengeleme, böylece her ikisini de aynı domain altında, path ile ayrılmış, ancak farklı kapsayıcılar tarafından sunulabilirsiniz. +* Let's Encrypt **HTTPS** sertifikalarının otomatik oluşturulması dahil olmak ÃŒzere Traefik entegrasyonu. +* GitLab **CI** (sÃŒrekli entegrasyon), backend ve frontend testi dahil. + +## Full Stack FastAPI Couchbase + +GitHub: https://github.com/tiangolo/full-stack-fastapi-couchbase + +⚠ **UYARI** ⚠ + +Sıfırdan bir projeye başlıyorsanız alternatiflerine bakın. + +Örneğin, Full Stack FastAPI PostgreSQL daha iyi bir alternatif olabilir, aktif olarak geliştiriliyor ve kullanılıyor. Ve yeni özellik ve ilerlemelere sahip. + +İsterseniz Couchbase tabanlı generator'ı kullanmakta özgÃŒrsÃŒnÃŒz, hala iyi çalışıyor olmalı ve onunla oluşturulmuş bir projeniz varsa bu da sorun değil (ve muhtemelen zaten ihtiyaçlarınıza göre gÃŒncellediniz). + +Bununla ilgili daha fazla bilgiyi repo belgelerinde okuyabilirsiniz. + +## Full Stack FastAPI MongoDB + +... mÃŒsaitliğime ve diğer faktörlere bağlı olarak daha sonra gelebilir. 😅 🎉 + +## Machine Learning modelleri, spaCy ve FastAPI + +GitHub: https://github.com/microsoft/cookiecutter-spacy-fastapi + +### Machine Learning modelleri, spaCy ve FastAPI - Features + +* **spaCy** NER model entegrasyonu. +* **Azure Cognitive Search** yerleşik istek biçimi. +* Uvicorn ve Gunicorn ile **Production ready** Python web server'ı. +* Dahili **Azure DevOps** Kubernetes (AKS) CI/CD deployment. +* **Multilingual**, Proje kurulumu sırasında spaCy'nin yerleşik dillerinden birini kolayca seçin. +* **Esnetilebilir** diğer frameworkler (Pytorch, Tensorflow) ile de çalışır sadece spaCy değil. From 63ffd735d1c88820807b585eacb05de04f142429 Mon Sep 17 00:00:00 2001 From: bilal alpaslan <47563997+BilalAlpaslan@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:57:04 +0300 Subject: [PATCH 075/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20`docs/tr/docs/async.md`=20(#5191)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/async.md | 401 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 docs/tr/docs/async.md diff --git a/docs/tr/docs/async.md b/docs/tr/docs/async.md new file mode 100644 index 000000000..2be594343 --- /dev/null +++ b/docs/tr/docs/async.md @@ -0,0 +1,401 @@ +# Concurrency ve async / await + +*path operasyon fonksiyonu* için `async def `sözdizimi, asenkron kod, eşzamanlılık ve paralellik hakkında bazı ayrıntılar. + +## Aceleniz mi var? + +TL;DR: + +Eğer `await` ile çağrılması gerektiğini belirten ÌçÌncÃŒ taraf kÃŒtÃŒphaneleri kullanıyorsanız, örneğin: + +```Python +results = await some_library() +``` + +O zaman *path operasyon fonksiyonunu* `async def` ile tanımlayın örneğin: + +```Python hl_lines="2" +@app.get('/') +async def read_results(): + results = await some_library() + return results +``` + +!!! not + Sadece `async def` ile tanımlanan fonksiyonlar içinde `await` kullanabilirsiniz. + +--- + +Eğer bir veritabanı, bir API, dosya sistemi vb. ile iletişim kuran bir ÌçÌncÃŒ taraf bir kÃŒtÃŒphane kullanıyorsanız ve `await` kullanımını desteklemiyorsa, (bu şu anda çoğu veritabanı kÃŒtÃŒphanesi için geçerli bir durumdur), o zaman *path operasyon fonksiyonunuzu* `def` kullanarak normal bir şekilde tanımlayın, örneğin: + +```Python hl_lines="2" +@app.get('/') +def results(): + results = some_library() + return results +``` + +--- + +Eğer uygulamanız (bir şekilde) başka bir şeyle iletişim kurmak ve onun cevap vermesini beklemek zorunda değilse, `async def` kullanın. + +--- + +Sadece bilmiyorsanız, normal `def` kullanın. + +--- + +**Not**: *path operasyon fonksiyonlarınızda* `def` ve `async def`'i ihtiyaç duyduğunuz gibi karıştırabilir ve her birini sizin için en iyi seçeneği kullanarak tanımlayabilirsiniz. FastAPI onlarla doğru olanı yapacaktır. + +Her neyse, yukarıdaki durumlardan herhangi birinde, FastAPI yine de asenkron olarak çalışacak ve son derece hızlı olacaktır. + +Ancak yukarıdaki adımları takip ederek, bazı performans optimizasyonları yapılabilecektir. + +## Teknik Detaylar + +Python'un modern versiyonlarında **`async` ve `await`** sözdizimi ile **"coroutines"** kullanan **"asenkron kod"** desteğine sahiptir. + +Bu ifadeyi aşağıdaki bölÃŒmlerde daha da ayrıntılı açıklayalım: + +* **Asenkron kod** +* **`async` ve `await`** +* **Coroutines** + +## Asenkron kod + +Asenkron kod programlama dilinin 💬 bilgisayara / programa 🀖 kodun bir noktasında, *başka bir kodun* bir yerde bitmesini 🀖 beklemesi gerektiğini söylemenin bir yoludur. Bu *başka koda* "slow-file" denir 📝. + +Böylece, bu sÃŒreçte bilgisayar "slow-file" 📝 tamamlanırken gidip başka işler yapabilir. + +Sonra bilgisayar / program 🀖 her fırsatı olduğunda o noktada yaptığı tÃŒm işleri 🀖 bitirene kadar geri dönÃŒcek. Ve 🀖 yapması gerekeni yaparak, beklediği görevlerden herhangi birinin bitip bitmediğini görecek. + +Ardından, 🀖 bitirmek için ilk görevi alır ("slow-file" 📝) ve onunla ne yapması gerekiyorsa onu devam ettirir. + +Bu "başka bir şey için bekle" normalde, aşağıdakileri beklemek gibi (işlemcinin ve RAM belleğinin hızına kıyasla) nispeten "yavaş" olan I/O işlemlerine atıfta bulunur: + +* istemci tarafından ağ ÃŒzerinden veri göndermek +* ağ ÃŒzerinden istemciye gönderilen veriler +* sistem tarafından okunacak ve programınıza verilecek bir dosya içeriği +* programınızın diske yazılmak ÃŒzere sisteme verdiği dosya içerikleri +* uzak bir API işlemi +* bir veritabanı bitirme işlemi +* sonuçları döndÃŒrmek için bir veritabanı sorgusu +* vb. + +YÃŒrÃŒtme sÃŒresi çoğunlukla I/O işlemleri beklenerek tÃŒketildiğinden bunlara "I/O bağlantılı" işlemler denir. + +Buna "asenkron" denir, çÌnkÃŒ bilgisayar/program yavaş görevle "senkronize" olmak zorunda değildir, görevin tam olarak biteceği anı bekler, hiçbir şey yapmadan, görev sonucunu alabilmek ve çalışmaya devam edebilmek için . + +Bunun yerine, "asenkron" bir sistem olarak, bir kez bittiğinde, bilgisayarın / programın yapması gerekeni bitirmesi için biraz (birkaç mikrosaniye) sırada bekleyebilir ve ardından sonuçları almak için geri gelebilir ve onlarla çalışmaya devam edebilir. + +"Senkron" ("asenkron"un aksine) için genellikle "sıralı" terimini de kullanırlar, çÌnkÃŒ bilgisayar/program, bu adımlar beklemeyi içerse bile, farklı bir göreve geçmeden önce tÃŒm adımları sırayla izler. + + +### Eşzamanlılık (Concurrency) ve Burgerler + + +Yukarıda açıklanan bu **asenkron** kod fikrine bazen **"eşzamanlılık"** da denir. **"Paralellikten"** farklıdır. + +**Eşzamanlılık** ve **paralellik**, "aynı anda az ya da çok olan farklı işler" ile ilgilidir. + +Ancak *eşzamanlılık* ve *paralellik* arasındaki ayrıntılar oldukça farklıdır. + + +Farkı görmek için burgerlerle ilgili aşağıdaki hikayeyi hayal edin: + +### Eşzamanlı Burgerler + + + +Aşkınla beraber 😍 dışarı hamburger yemeye çıktınız 🍔, kasiyer 💁 öndeki insanlardan sipariş alırken siz sıraya girdiniz. + +Sıra sizde ve sen aşkın 😍 ve kendin için 2 çılgın hamburger 🍔 söylÃŒyorsun. + +Ödemeyi yaptın 💞. + +Kasiyer 💁 mutfakdaki aşçıya 👚‍🍳 hamburgerleri 🍔 hazırlaması gerektiğini söyler ve aşçı bunu bilir (o an önceki mÌşterilerin siparişlerini hazırlıyor olsa bile). + +Kasiyer 💁 size bir sıra numarası verir. + +Beklerken askınla 😍 bir masaya oturur ve uzun bir sÃŒre konuşursunuz(Burgerleriniz çok çılgın olduğundan ve hazırlanması biraz zaman alıyor ✚🍔✚). + +Hamburgeri beklerkenki zamanı 🍔, aşkının ne kadar zeki ve tatlı olduğuna hayran kalarak harcayabilirsin ✚😍✚. + +Aşkınla 😍 konuşurken arada sıranın size gelip gelmediğini kontrol ediyorsun. + +Nihayet sıra size geldi. Tezgaha gidip hamburgerleri 🍔kapıp masaya geri dönÃŒyorsun. + +Aşkınla hamburgerlerinizi yiyor 🍔 ve iyi vakit geçiriyorsunuz ✹. + +--- + +Bu hikayedeki bilgisayar / program 🀖 olduğunuzu hayal edin. + +Sırada beklerken boştasın 😎, sıranı beklerken herhangi bir "ÃŒretim" yapmıyorsun. Ama bu sıra hızlı çÌnkÃŒ kasiyer sadece siparişleri alıyor (onları hazırlamıyor), burada bir sıknıtı yok. + +Sonra sıra size geldiğinde gerçekten "ÃŒretken" işler yapabilirsiniz 🀓, menÃŒyÃŒ oku, ne istediğine larar ver, aşkının seçimini al 😍, öde 💞, doğru kartı çıkart, ödemeyi kontrol et, faturayı kontrol et, siparişin doğru olup olmadığını kontrol et, vb. + +Ama hamburgerler 🍔 hazır olmamasına rağmen Kasiyer 💁 ile işiniz "duraklıyor" ⏞, çÌnkÃŒ hamburgerlerin hazır olmasını bekliyoruz 🕙. + +Ama tezgahtan uzaklaşıp sıranız gelene kadarmasanıza dönebilir 🔀 ve dikkatinizi aşkınıza 😍 verebilirsiniz vr bunun ÃŒzerine "çalışabilirsiniz" ⏯ 🀓. Artık "ÃŒretken" birşey yapıyorsunuz 🀓, sevgilinle 😍 flört eder gibi. + +Kasiyer 💁 "Hamburgerler hazır !" 🍔 dediğinde ve görÃŒntÃŒlenen numara sizin numaranız olduğunda hemen koşup hamburgerlerinizi almaya çalışmıyorsunuz. Biliyorsunuzki kimse sizin hamburgerlerinizi 🍔 çalmayacak çÌnkÃŒ sıra sizin. + +Yani Aşkınızın😍 hikayeyi bitirmesini bekliyorsunuz (çalışmayı bitir ⏯ / görev işleniyor.. 🀓), nazikçe gÃŒlÃŒmseyin ve hamburger yemeye gittiğinizi söyleyin ⏞. + +Ardından tezgaha 🔀, şimdi biten ilk göreve ⏯ gidin, Hamburgerleri 🍔 alın, teşekkÃŒr edin ve masaya götÃŒrÃŒn. sayacın bu adımı tamamlanır ⏹. Bu da yeni bir görev olan "hamburgerleri ye" 🔀 ⏯ görevini başlatırken "hamburgerleri al" ⏹ görevini bitirir. + +### Parallel Hamburgerler + +Şimdi bunların "Eşzamanlı Hamburger" değil, "Paralel Hamburger" olduğunu dÌşÌnelim. + +Hamburger 🍔 almak için 😍 aşkınla Paralel fast food'a gidiyorsun. + +Birden fazla kasiyer varken (varsayalım 8) sıraya girdiniz👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳 ve sıranız gelene kadar bekliyorsunuz. + +Sizden önceki herkez ayrılmadan önce hamburgerlerinin 🍔 hazır olmasını bekliyor 🕙. ÇÌnkÃŒ kasiyerlerin her biri bir hamburger hazırlanmadan önce bir sonraki siparişe geçmiiyor. + +Sonunda senin sıran, aşkın 😍 ve kendin için 2 hamburger 🍔 siparişi verdiniz. + +Ödemeyi yaptınız 💞. + +Kasiyer mutfağa gider 👚‍🍳. + +Sırada bekliyorsunuz 🕙, kimse sizin burgerinizi 🍔 almaya çalışmıyor çÌnkÃŒ sıra sizin. + +Sen ve aşkın 😍 sıranızı korumak ve hamburgerleri almakla o kadar meşgulsÃŒnÃŒz ki birbirinize vakit 🕙 ayıramıyorsunuz 😞. + +İşte bu "senkron" çalışmadır. Kasiyer/aşçı 👚‍🍳ile senkron hareket ediyorsunuz. Bu yÃŒzden beklemek 🕙 ve kasiyer/aşçı burgeri 🍔bitirip size getirdiğinde orda olmak zorundasınız yoksa başka biri alabilir. + +Sonra kasiyeri/aşçı 👚‍🍳 nihayet hamburgerlerinizle 🍔, uzun bir sÃŒre sonra 🕙 tezgaha geri geliyor. + +Burgerlerinizi 🍔 al ve aşkınla masanıza doğru ilerle 😍. + +Sadece burgerini yiyorsun 🍔 ve bitti ⏹. + +Bekleyerek çok fazla zaman geçtiğinden 🕙 konuşmaya çok fazla vakit kalmadı 😞. + +--- + +Paralel burger senaryosunda ise, siz iki işlemcili birer robotsunuz 🀖 (sen ve sevgilin 😍), Beklıyorsunuz 🕙 hem konuşarak gÃŒzel vakit geçirirken ⏯ hem de sıranızı bekliyorsunuz 🕙. + +Mağazada ise 8 işlemci bulunuyor (Kasiyer/aşçı) 👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳. Eşzamanlı burgerde yalnızca 2 kişi olabiliyordu (bir kasiyer ve bir aşçı) 💁 👚‍🍳. + +Ama yine de bu en iyisi değil 😞. + +--- + +Bu hikaye burgerler 🍔 için paralel. + +Bir gerçek hayat örneği verelim. Bir banka hayal edin. + +Bankaların çoğunda birkaç kasiyer 👚‍💌👚‍💌👚‍💌👚‍💌 ve uzun bir sıra var 🕙🕙🕙🕙🕙🕙🕙🕙. + +TÃŒm işi sırayla bir mÌşteri ile yapan tÃŒm kasiyerler 👚‍💌⏯. + +Ve uzun sÃŒre kuyrukta beklemek 🕙 zorundasın yoksa sıranı kaybedersin. + +Muhtemelen ayak işlerı yaparken sevgilini 😍 bankaya 🏊 getirmezsin. + +### Burger Sonucu + +Bu "aşkınla fast food burgerleri" senaryosunda, çok fazla bekleme olduğu için 🕙, eşzamanlı bir sisteme sahip olmak çok daha mantıklı ⏞🔀⏯. + +Web uygulamalarının çoğu için durum böyledir. + +Pek çok kullanıcı var, ama sunucunuz pek de iyi olmayan bir bağlantı ile istek atmalarını bekliyor. + +Ve sonra yanıtların geri gelmesi için tekrar 🕙 bekliyor + +Bu "bekleme" 🕙 mikrosaniye cinsinden ölçÌlÃŒr, yine de, hepsini toplarsak çok fazla bekleme var. + +Bu nedenle, web API'leri için asenkron ⏞🔀⏯ kod kullanmak çok daha mantıklı. + +Mevcut popÃŒler Python frameworklerinin çoğu (Flask ve Django gibi), Python'daki yeni asenkron özellikler mevcut olmadan önce yazıldı. Bu nedenle, dağıtılma biçimleri paralel yÃŒrÃŒtmeyi ve yenisi kadar gÌçlÃŒ olmayan eski bir eşzamansız yÃŒrÃŒtme biçimini destekler. + +Asenkron web (ASGI) özelliği, WebSockets için destek eklemek için Django'ya eklenmiş olsa da. + +Asenkron çalışabilme NodeJS in popÃŒler olmasının sebebi (paralel olamasa bile) ve Go dilini gÌçlÃŒ yapan özelliktir. + +Ve bu **FastAPI** ile elde ettiğiniz performans dÃŒzeyiyle aynıdır. + +Aynı anda paralellik ve asenkronluğa sahip olabildiğiniz için, test edilen NodeJS çerçevelerinin çoğundan daha yÃŒksek performans elde edersiniz ve C'ye daha yakın derlenmiş bir dil olan Go ile eşit bir performans elde edersiniz (bÃŒtÃŒn teşekkÃŒrler Starlette'e ). + +### Eşzamanlılık paralellikten daha mı iyi? + +Hayır! Hikayenin ahlakı bu değil. + +Eşzamanlılık paralellikten farklıdır. Ve çok fazla bekleme içeren **belirli** senaryolarda daha iyidir. Bu nedenle, genellikle web uygulamaları için paralellikten çok daha iyidir. Ama her şey için değil. + +Yanı, bunu aklınızda oturtmak için aşağıdaki kısa hikayeyi hayal edin: + +> BÃŒyÃŒk, kirli bir evi temizlemelisin. + +*Evet, tÃŒm hikaye bu*. + +--- + +Beklemek yok 🕙. Hiçbir yerde. Sadece evin birden fazla yerinde yapılacak fazlasıyla iş var. + +You could have turns as in the burgers example, first the living room, then the kitchen, but as you are not waiting 🕙 for anything, just cleaning and cleaning, the turns wouldn't affect anything. +Hamburger örneğindeki gibi dönÌşleriniz olabilir, önce oturma odası, sonra mutfak, ama hiçbir şey için 🕙 beklemediğinizden, sadece temizlik, temizlik ve temizlik, dönÌşler hiçbir şeyi etkilemez. + +Sıralı veya sırasız (eşzamanlılık) bitirmek aynı zaman alır ve aynı miktarda işi yaparsınız. + +Ama bu durumda, 8 eski kasiyer/aşçı - yeni temizlikçiyi getirebilseydiniz 👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳👩‍🍳👚‍🍳 ve her birini (artı siz) evin bir bölgesini temizlemek için görevlendirseydiniz, ekstra yardımla tÃŒm işleri **paralel** olarak yapabilir ve çok daha erken bitirebilirdiniz. + +Bu senaryoda, temizlikçilerin her biri (siz dahil) birer işlemci olacak ve ÃŒzerine dÌşeni yapacaktır. + +YÃŒrÃŒtme sÃŒresinin çoğu (beklemek yerine) iş yapıldığından ve bilgisayardaki iş bir CPU tarafından yapıldığından, bu sorunlara "CPU bound" diyorlar". + +--- + +CPU'ya bağlı işlemlerin yaygın örnekleri, karmaşık matematik işlemleri gerektiren işlerdir. + +Örneğin: + +* **Ses** veya **görÃŒntÃŒ işleme**. +* **Bilgisayar görÃŒsÃŒ**: bir görÃŒntÃŒ milyonlarca pikselden oluşur, her pikselin 3 değeri / rengi vardır, bu pikseller ÃŒzerinde aynı anda bir şeyler hesaplamayı gerektiren işleme. +* **Makine Öğrenimi**: Çok sayıda "matris" ve "vektör" çarpımı gerektirir. Sayıları olan ve hepsini aynı anda çarpan bÃŒyÃŒk bir elektronik tablo dÌşÌnÃŒn. +* **Derin Öğrenme**: Bu, Makine Öğreniminin bir alt alanıdır, dolayısıyla aynısı geçerlidir. Sadece çarpılacak tek bir sayı tablosu değil, bÃŒyÃŒk bir sayı kÃŒmesi vardır ve çoğu durumda bu modelleri oluşturmak ve/veya kullanmak için özel işlemciler kullanırsınız. + +### Eşzamanlılık + Paralellik: Web + Makine Öğrenimi + +**FastAPI** ile web geliştirme için çok yaygın olan eşzamanlılıktan yararlanabilirsiniz (NodeJS'in aynı çekiciliği). + +Ancak, Makine Öğrenimi sistemlerindekile gibi **CPU'ya bağlı** iş yÃŒkleri için paralellik ve çoklu işlemenin (birden çok işlemin paralel olarak çalışması) avantajlarından da yararlanabilirsiniz. + +Buna ek olarak Python'un **Veri Bilimi**, Makine Öğrenimi ve özellikle Derin Öğrenme için ana dil olduğu gerçeği, FastAPI'yi Veri Bilimi / Makine Öğrenimi web API'leri ve uygulamaları için çok iyi bir seçenek haline getirir. + +Production'da nasıl oldugunu görmek için şu bölÃŒme bakın [Deployment](deployment/index.md){.internal-link target=_blank}. + +## `async` ve `await` + +Python'un modern sÃŒrÃŒmleri, asenkron kodu tanımlamanın çok sezgisel bir yoluna sahiptir. Bu, normal "sequentıal" (sıralı) kod gibi görÃŒnmesini ve doğru anlarda sizin için "awaıt" ile bekleme yapmasını sağlar. + +Sonuçları vermeden önce beklemeyi gerektirecek ve yeni Python özelliklerini destekleyen bir işlem olduğunda aşağıdaki gibi kodlayabilirsiniz: + +```Python +burgers = await get_burgers(2) +``` + +Buradaki `await` anahtari Python'a, sonuçları `burgers` degiskenine atamadan önce `get_burgers(2)` kodunun işini bitirmesini 🕙 beklemesi gerektiğini söyler. Bununla Python, bu ara zamanda başka bir şey 🔀 ⏯ yapabileceğini bilecektir (başka bir istek almak gibi). + + `await`kodunun çalışması için, eşzamansızlığı destekleyen bir fonksiyonun içinde olması gerekir. Bunu da yapmak için fonksiyonu `async def` ile tanımlamamız yeterlidir: + +```Python hl_lines="1" +async def get_burgers(number: int): + # burgerleri oluşturmak için asenkron birkaç iş + return burgers +``` + +...`def` yerine: + +```Python hl_lines="2" +# bu kod asenkron değil +def get_sequential_burgers(number: int): + # burgerleri oluşturmak için senkron bırkaç iş + return burgers +``` + +`async def` ile Python, bu fonksıyonun içinde, `await` ifadelerinin farkında olması gerektiğini ve çalışma zamanı gelmeden önce bu işlevin yÃŒrÃŒtÃŒlmesini "duraklatabileceğini" ve başka bir şey yapabileceğini 🔀 bilir. + +`async def` fonksiyonunu çağırmak istediğinizde, onu "awaıt" ıle kullanmanız gerekir. Yani, bu işe yaramaz: + +```Python +# Bu işe yaramaz, çÌnkÃŒ get_burgers, şu şekilde tanımlandı: async def +burgers = get_burgers(2) +``` + +--- + +Bu nedenle, size onu `await` ile çağırabileceğinizi söyleyen bir kitaplık kullanıyorsanız, onu `async def` ile tanımlanan *path fonksiyonu* içerisinde kullanmanız gerekir, örneğin: + +```Python hl_lines="2-3" +@app.get('/burgers') +async def read_burgers(): + burgers = await get_burgers(2) + return burgers +``` + +### Daha fazla teknik detay + +`await` in yalnızca `async def` ile tanımlanan fonksıyonların içinde kullanılabileceğini fark etmişsinizdir. + +Ama aynı zamanda, `async def` ile tanımlanan fonksiyonların "await" ile beklenmesi gerekir. Bu nedenle, "`async def` içeren fonksiyonlar yalnızca "`async def` ile tanımlanan fonksiyonların içinde çağrılabilir. + + +Yani yumurta mı tavukdan, tavuk mu yumurtadan gibi ilk `async` fonksiyonu nasıl çağırılır? + +**FastAPI** ile çalışıyorsanız bunun için endişelenmenize gerek yok, çÌnkÃŒ bu "ilk" fonksiyon sizin *path fonksiyonunuz* olacak ve FastAPI doğru olanı nasıl yapacağını bilecek. + +Ancak FastAPI olmadan `async` / `await` kullanmak istiyorsanız, resmi Python belgelerini kontrol edin. + +### Asenkron kodun diğer biçimleri + +Bu `async` ve `await` kullanimi oldukça yenidir. + +Ancak asenkron kodla çalışmayı çok daha kolay hale getirir. + +Aynı sözdizimi (hemen hemen aynı) son zamanlarda JavaScript'in modern sÃŒrÃŒmlerine de dahil edildi (Tarayıcı ve NodeJS'de). + +Ancak bundan önce, asenkron kodu işlemek oldukça karmaşık ve zordu. + +Python'un önceki sÃŒrÃŒmlerinde, threadlerı veya Gevent kullanıyor olabilirdin. Ancak kodu anlamak, hata ayıklamak ve dÌşÌnmek çok daha karmaşık olurdu. + +NodeJS / Browser JavaScript'in önceki sÃŒrÃŒmlerinde, "callback" kullanırdınız. Bu da callbacks cehennemine yol açar. + +## Coroutine'ler + +**Coroutine**, bir `async def` fonksiyonu tarafından döndÃŒrÃŒlen değer için çok sÃŒslÃŒ bir terimdir. Python bunun bir fonksiyon gibi bir noktada başlayıp biteceğini bilir, ancak içinde bir `await` olduğunda dahili olarak da duraklatılabilir ⏞. + +Ancak, `async` ve `await` ile asenkron kod kullanmanın tÃŒm bu işlevselliği, çoğu zaman "Coroutine" kullanmak olarak adlandırılır. Go'nun ana özelliği olan "Goroutines" ile karşılaştırılabilir. + +## Sonuç + +Aynı ifadeyi yukarıdan görelim: + +> Python'ın modern sÃŒrÃŒmleri, **"async" ve "await"** sözdizimi ile birlikte **"coroutines"** adlı bir özelliği kullanan **"asenkron kod"** desteğine sahiptir. + +Şimdi daha mantıklı gelmeli. ✹ + +FastAPI'ye (Starlette aracılığıyla) gÌç veren ve bu kadar etkileyici bir performansa sahip olmasını sağlayan şey budur. + +## Çok Teknik Detaylar + +!!! warning + Muhtemelen burayı atlayabilirsiniz. + + Bunlar, **FastAPI**'nin altta nasıl çalıştığına dair çok teknik ayrıntılardır. + + Biraz teknik bilginiz varsa (co-routines, threads, blocking, vb)ve FastAPI'nin "async def" ile normal "def" arasındaki farkı nasıl işlediğini merak ediyorsanız, devam edin. + +### Path fonksiyonu + +"async def" yerine normal "def" ile bir *yol işlem işlevi* bildirdiğinizde, doğrudan çağrılmak yerine (sunucuyu bloke edeceğinden) daha sonra beklenen harici bir iş parçacığı havuzunda çalıştırılır. + +Yukarıda açıklanan şekilde çalışmayan başka bir asenkron framework'den geliyorsanız ve kÌçÌk bir performans kazancı (yaklaşık 100 nanosaniye) için "def" ile *path fonksiyonu* tanımlamaya alışkınsanız, **FastAPI**'de tam tersi olacağını unutmayın. Bu durumlarda, *path fonksiyonu* G/Ç engelleyen durum oluşturmadıkça "async def" kullanmak daha iyidir. + +Yine de, her iki durumda da, **FastAPI**'nin önceki frameworkden [hala daha hızlı](/#performance){.internal-link target=_blank} (veya en azından karşılaştırılabilir) olma olasılığı vardır. + +### Bagımlılıklar + +Aynısı bağımlılıklar için de geçerlidir. Bir bağımlılık, "async def" yerine standart bir "def" işleviyse, harici iş parçacığı havuzunda çalıştırılır. + +### Alt-bağımlıklar + +Birbirini gerektiren (fonksiyonlarin parametreleri olarak) birden fazla bağımlılık ve alt bağımlılıklarınız olabilir, bazıları 'async def' ve bazıları normal 'def' ile oluşturulabilir. Yine de normal 'def' ile oluşturulanlar, "await" kulanilmadan harici bir iş parçacığında (iş parçacığı havuzundan) çağrılır. + +### Diğer yardımcı fonksiyonlar + +Doğrudan çağırdığınız diğer herhangi bir yardımcı fonksiyonu, normal "def" veya "async def" ile tanimlayabilirsiniz. FastAPI onu çağırma şeklinizi etkilemez. + +Bu, FastAPI'nin sizin için çağırdığı fonksiyonlarin tam tersidir: *path fonksiyonu* ve bağımlılıklar. + +Yardımcı program fonksiyonunuz 'def' ile normal bir işlevse, bir iş parçacığı havuzunda değil doğrudan (kodunuzda yazdığınız gibi) çağrılır, işlev 'async def' ile oluşturulmuşsa çağırıldığı yerde 'await' ile beklemelisiniz. + +--- + +Yeniden, bunlar, onları aramaya geldiğinizde muhtemelen işinize yarayacak çok teknik ayrıntılardır. + +Aksi takdirde, yukarıdaki bölÃŒmdeki yönergeleri iyi bilmelisiniz: Aceleniz mi var?. From 29c8b19af878c0f4b215da4a719969040fe7b5bc Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 19:58:14 +0000 Subject: [PATCH 076/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 37936f5ad..10e0c24b1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md`. PR [#5657](https://github.com/tiangolo/fastapi/pull/5657) by [@nearnear](https://github.com/nearnear). * 🌐 Add Korean translation for `docs/ko/docs/deployment/server-workers.md`. PR [#4935](https://github.com/tiangolo/fastapi/pull/4935) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/deployment/index.md`. PR [#4561](https://github.com/tiangolo/fastapi/pull/4561) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/path-operation-configuration.md`. PR [#3639](https://github.com/tiangolo/fastapi/pull/3639) by [@jungsu-kwon](https://github.com/jungsu-kwon). From 1ac6b761e12c0cf40dc012396be5bbe12f47b8e3 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 23 Jan 2024 05:01:49 +0900 Subject: [PATCH 077/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/extra-data-types.md`=20(#19?= =?UTF-8?q?32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ja/docs/tutorial/extra-data-types.md | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/ja/docs/tutorial/extra-data-types.md diff --git a/docs/ja/docs/tutorial/extra-data-types.md b/docs/ja/docs/tutorial/extra-data-types.md new file mode 100644 index 000000000..a152e0322 --- /dev/null +++ b/docs/ja/docs/tutorial/extra-data-types.md @@ -0,0 +1,66 @@ +# 远加デヌタ型 + +今たでは、以䞋のような䞀般的なデヌタ型を䜿甚しおきたした: + +* `int` +* `float` +* `str` +* `bool` + +しかし、より耇雑なデヌタ型を䜿甚するこずもできたす。 + +そしお、今たで芋おきたのず同じ機胜を持぀こずになりたす: + +* 玠晎らしい゚ディタのサポヌト +* 受信したリク゚ストからのデヌタ倉換 +* レスポンスデヌタのデヌタ倉換 +* デヌタの怜蚌 +* 自動泚釈ず文曞化 + +## 他のデヌタ型 + +ここでは、䜿甚できる远加のデヌタ型のいく぀かを玹介したす: + +* `UUID`: + * 倚くのデヌタベヌスやシステムで共通のIDずしお䜿甚される、暙準的な「ナニバヌサルにナニヌクな識別子」です。 + * リク゚ストずレスポンスでは`str`ずしお衚珟されたす。 +* `datetime.datetime`: + * Pythonの`datetime.datetime`です。 + * リク゚ストずレスポンスはISO 8601圢匏の`str`で衚珟されたす: `2008-09-15T15:53:00+05:00` +* `datetime.date`: + * Pythonの`datetime.date`です。 + * リク゚ストずレスポンスはISO 8601圢匏の`str`で衚珟されたす: `2008-09-15` +* `datetime.time`: + * Pythonの`datetime.time`. + * リク゚ストずレスポンスはISO 8601圢匏の`str`で衚珟されたす: `14:23:55.003` +* `datetime.timedelta`: + * Pythonの`datetime.timedelta`です。 + * リク゚ストずレスポンスでは合蚈秒数の`float`で衚珟されたす。 + * Pydanticでは「ISO 8601 time diff encoding」ずしお衚珟するこずも可胜です。詳现はドキュメントを参照しおください。 +* `frozenset`: + * リク゚ストずレスポンスでは`set`ず同じように扱われたす: + * リク゚ストでは、リストが読み蟌たれ、重耇を排陀しお`set`に倉換されたす。 + * レスポンスでは`set`が`list`に倉換されたす。 + * 生成されたスキヌマは`set`の倀が䞀意であるこずを指定したすJSON Schemaの`uniqueItems`を䜿甚したす。 +* `bytes`: + * Pythonの暙準的な`bytes`です。 + * リク゚ストずレスポンスでは`str`ずしお扱われたす。 + * 生成されたスキヌマは`str`で`binary`の「フォヌマット」持぀こずを指定したす。 +* `Decimal`: + * Pythonの暙準的な`Decimal`です。 + * リク゚ストやレスポンスでは`float`ず同じように扱いたす。 + +* Pydanticの党おの有効な型はこちらで確認できたす: Pydantic data types。 +## 䟋 + +ここでは、䞊蚘の型のいく぀かを䜿甚したパラメヌタを持぀*path operation*の䟋を瀺したす。 + +```Python hl_lines="1 2 12-16" +{!../../../docs_src/extra_data_types/tutorial001.py!} +``` + +関数内のパラメヌタは自然なデヌタ型を持っおいるこずに泚意しおください。そしお、以䞋のように通垞の日付操䜜を行うこずができたす: + +```Python hl_lines="18 19" +{!../../../docs_src/extra_data_types/tutorial001.py!} +``` From 7514aab30bd8355aec58a77ab18c6b22a26a00ec Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 20:02:56 +0000 Subject: [PATCH 078/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 10e0c24b1..17202d8bf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/project-generation.md`. PR [#5192](https://github.com/tiangolo/fastapi/pull/5192) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md`. PR [#5657](https://github.com/tiangolo/fastapi/pull/5657) by [@nearnear](https://github.com/nearnear). * 🌐 Add Korean translation for `docs/ko/docs/deployment/server-workers.md`. PR [#4935](https://github.com/tiangolo/fastapi/pull/4935) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/deployment/index.md`. PR [#4561](https://github.com/tiangolo/fastapi/pull/4561) by [@jujumilk3](https://github.com/jujumilk3). From f772868a569651020d72f64fa2e66c3f4b3535f7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 20:06:11 +0000 Subject: [PATCH 079/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 17202d8bf..f915e3d26 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/async.md`. PR [#5191](https://github.com/tiangolo/fastapi/pull/5191) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Turkish translation for `docs/tr/docs/project-generation.md`. PR [#5192](https://github.com/tiangolo/fastapi/pull/5192) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md`. PR [#5657](https://github.com/tiangolo/fastapi/pull/5657) by [@nearnear](https://github.com/nearnear). * 🌐 Add Korean translation for `docs/ko/docs/deployment/server-workers.md`. PR [#4935](https://github.com/tiangolo/fastapi/pull/4935) by [@jujumilk3](https://github.com/jujumilk3). From 851daec7542bc5e565579bd2d491310d2d6b7445 Mon Sep 17 00:00:00 2001 From: SwftAlpc Date: Tue, 23 Jan 2024 05:09:02 +0900 Subject: [PATCH 080/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/encoder.md`=20(#1955)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ja/docs/tutorial/encoder.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/ja/docs/tutorial/encoder.md diff --git a/docs/ja/docs/tutorial/encoder.md b/docs/ja/docs/tutorial/encoder.md new file mode 100644 index 000000000..305867ab7 --- /dev/null +++ b/docs/ja/docs/tutorial/encoder.md @@ -0,0 +1,34 @@ +# JSON互換゚ンコヌダ + +デヌタ型PydanticモデルのようなをJSONず互換性のあるもの`dict`や`list`などに倉曎する必芁がある堎合がありたす。 + +䟋えば、デヌタベヌスに保存する必芁がある堎合です。 + +そのために、**FastAPI** は`jsonable_encoder()`関数を提䟛しおいたす。 + +## `jsonable_encoder`の䜿甚 + +JSON互換のデヌタのみを受信するデヌタベヌス`fase_db`があるずしたしょう。 + +䟋えば、`datetime`オブゞェクトはJSONず互換性がないので、このデヌタヌベヌスには受け取られたせん。 + +そのため、`datetime`オブゞェクトはISO圢匏のデヌタを含む`str`に倉換されなければなりたせん。 + +同様に、このデヌタベヌスはPydanticモデル属性を持぀オブゞェクトを受け取らず、`dict`だけを受け取りたす。 + +そのために`jsonable_encoder`を䜿甚するこずができたす。 + +Pydanticモデルのようなオブゞェクトを受け取り、JSON互換版を返したす: + +```Python hl_lines="5 22" +{!../../../docs_src/encoder/tutorial001.py!} +``` + +この䟋では、Pydanticモデルを`dict`に、`datetime`を`str`に倉換したす。 + +呌び出した結果は、Pythonの暙準の`json.dumps()`で゚ンコヌドできるものです。 + +これはJSON圢匏のデヌタを含む倧きな`str`を文字列ずしお返したせん。JSONず互換性のある倀ずサブの倀を持぀Python暙準のデヌタ構造䟋`dict`を返したす。 + +!!! note "備考" + `jsonable_encoder`は実際には **FastAPI** が内郚的にデヌタを倉換するために䜿甚したす。しかしこれは他の倚くのシナリオで有甚です。 From c945d686bbd1c56e4e5c0ef876fe3c45e8d5bb2d Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 20:12:06 +0000 Subject: [PATCH 081/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f915e3d26..601d83856 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-data-types.md`. PR [#1932](https://github.com/tiangolo/fastapi/pull/1932) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Turkish translation for `docs/tr/docs/async.md`. PR [#5191](https://github.com/tiangolo/fastapi/pull/5191) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Turkish translation for `docs/tr/docs/project-generation.md`. PR [#5192](https://github.com/tiangolo/fastapi/pull/5192) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md`. PR [#5657](https://github.com/tiangolo/fastapi/pull/5657) by [@nearnear](https://github.com/nearnear). From d7c588d6930e0985253aafa396091beb76340fbd Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jan 2024 20:18:27 +0000 Subject: [PATCH 082/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 601d83856..49c1cab09 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/encoder.md`. PR [#1955](https://github.com/tiangolo/fastapi/pull/1955) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-data-types.md`. PR [#1932](https://github.com/tiangolo/fastapi/pull/1932) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Turkish translation for `docs/tr/docs/async.md`. PR [#5191](https://github.com/tiangolo/fastapi/pull/5191) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Turkish translation for `docs/tr/docs/project-generation.md`. PR [#5192](https://github.com/tiangolo/fastapi/pull/5192) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). From 9a33950344c96445063e8e2b33993cea3b0d55d8 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 12:22:17 +0100 Subject: [PATCH 083/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20introduction=20documents=20(#10497)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/about/index.md | 3 +++ docs/de/docs/help/index.md | 3 +++ docs/de/docs/learn/index.md | 5 +++++ docs/de/docs/reference/index.md | 8 ++++++++ docs/de/docs/resources/index.md | 3 +++ 5 files changed, 22 insertions(+) create mode 100644 docs/de/docs/about/index.md create mode 100644 docs/de/docs/help/index.md create mode 100644 docs/de/docs/learn/index.md create mode 100644 docs/de/docs/reference/index.md create mode 100644 docs/de/docs/resources/index.md diff --git a/docs/de/docs/about/index.md b/docs/de/docs/about/index.md new file mode 100644 index 000000000..4c309e02a --- /dev/null +++ b/docs/de/docs/about/index.md @@ -0,0 +1,3 @@ +# Über + +Über FastAPI, sein Design, seine Inspiration und mehr. 🀓 diff --git a/docs/de/docs/help/index.md b/docs/de/docs/help/index.md new file mode 100644 index 000000000..8fdc4a049 --- /dev/null +++ b/docs/de/docs/help/index.md @@ -0,0 +1,3 @@ +# Hilfe + +Helfen und Hilfe erhalten, beitragen, mitmachen. 🀝 diff --git a/docs/de/docs/learn/index.md b/docs/de/docs/learn/index.md new file mode 100644 index 000000000..b5582f55b --- /dev/null +++ b/docs/de/docs/learn/index.md @@ -0,0 +1,5 @@ +# Lernen + +Hier finden Sie die einfÃŒhrenden Kapitel und Tutorials zum Erlernen von **FastAPI**. + +Sie könnten dies als **Buch**, als **Kurs**, als **offizielle** und empfohlene Methode zum Erlernen von FastAPI betrachten. 😎 diff --git a/docs/de/docs/reference/index.md b/docs/de/docs/reference/index.md new file mode 100644 index 000000000..e9362b962 --- /dev/null +++ b/docs/de/docs/reference/index.md @@ -0,0 +1,8 @@ +# Referenz – Code-API + +Hier ist die Referenz oder Code-API, die Klassen, Funktionen, Parameter, Attribute und alle FastAPI-Teile, die Sie in Ihren Anwendungen verwenden können. + +Wenn Sie **FastAPI** lernen möchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen. + +!!! note "Hinweis Deutsche Übersetzung" + Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch. diff --git a/docs/de/docs/resources/index.md b/docs/de/docs/resources/index.md new file mode 100644 index 000000000..abf270d9f --- /dev/null +++ b/docs/de/docs/resources/index.md @@ -0,0 +1,3 @@ +# Ressourcen + +ZusÀtzliche Ressourcen, externe Links, Artikel und mehr. ✈ From d2d5a5290ccd0598fdefabe74c28904406d8132f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 11:22:48 +0000 Subject: [PATCH 084/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 49c1cab09..7bbee3c44 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for introduction documents. PR [#10497](https://github.com/tiangolo/fastapi/pull/10497) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/encoder.md`. PR [#1955](https://github.com/tiangolo/fastapi/pull/1955) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-data-types.md`. PR [#1932](https://github.com/tiangolo/fastapi/pull/1932) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Turkish translation for `docs/tr/docs/async.md`. PR [#5191](https://github.com/tiangolo/fastapi/pull/5191) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). From 2f6fdf62b95befaa854eb4637ed8e928514ebaa1 Mon Sep 17 00:00:00 2001 From: Johannes Jungbluth Date: Tue, 23 Jan 2024 12:26:59 +0100 Subject: [PATCH 085/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/middleware.md`=20(#10391)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/middleware.md | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/de/docs/tutorial/middleware.md diff --git a/docs/de/docs/tutorial/middleware.md b/docs/de/docs/tutorial/middleware.md new file mode 100644 index 000000000..7d6e6b71a --- /dev/null +++ b/docs/de/docs/tutorial/middleware.md @@ -0,0 +1,61 @@ +# Middleware + +Sie können Middleware zu **FastAPI**-Anwendungen hinzufÃŒgen. + +Eine „Middleware“ ist eine Funktion, die mit jedem **Request** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **Response**, bevor sie zurÃŒckgegeben wird. + +* Sie nimmt jeden **Request** entgegen, der an Ihre Anwendung gesendet wird. +* Sie kann dann etwas mit diesem **Request** tun oder beliebigen Code ausfÃŒhren. +* Dann gibt sie den **Request** zur Verarbeitung durch den Rest der Anwendung weiter (durch eine bestimmte *Pfadoperation*). +* Sie nimmt dann die **Response** entgegen, die von der Anwendung generiert wurde (durch eine bestimmte *Pfadoperation*). +* Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausfÃŒhren. +* Dann gibt sie die **Response** zurÃŒck. + +!!! note "Technische Details" + Wenn Sie AbhÀngigkeiten mit `yield` haben, wird der Exit-Code *nach* der Middleware ausgefÃŒhrt. + + Wenn es Hintergrundaufgaben gab (spÀter dokumentiert), werden sie *nach* allen Middlewares ausgefÃŒhrt. + +## Erstellung einer Middleware + +Um eine Middleware zu erstellen, verwenden Sie den Dekorator `@app.middleware("http")` ÃŒber einer Funktion. + +Die Middleware-Funktion erhÀlt: + +* Den `request`. +* Eine Funktion `call_next`, die den `request` als Parameter erhÀlt. + * Diese Funktion gibt den `request` an die entsprechende *Pfadoperation* weiter. + * Dann gibt es die von der entsprechenden *Pfadoperation* generierte `response` zurÃŒck. +* Sie können die `response` dann weiter modifizieren, bevor Sie sie zurÃŒckgeben. + +```Python hl_lines="8-9 11 14" +{!../../../docs_src/middleware/tutorial001.py!} +``` + +!!! tip "Tipp" + Beachten Sie, dass benutzerdefinierte proprietÀre Header hinzugefÃŒgt werden können. Verwenden Sie dafÃŒr das PrÀfix 'X-'. + + Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, mÃŒssen Sie sie zu Ihrer CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufÃŒgen, indem Sie den Parameter `expose_headers` verwenden, der in der Starlette-CORS-Dokumentation dokumentiert ist. + +!!! note "Technische Details" + Sie könnten auch `from starlette.requests import Request` verwenden. + + **FastAPI** bietet es als Komfort fÃŒr Sie, den Entwickler, an. Aber es stammt direkt von Starlette. + +### Vor und nach der `response` + +Sie können Code hinzufÃŒgen, der mit dem `request` ausgefÃŒhrt wird, bevor dieser von einer beliebigen *Pfadoperation* empfangen wird. + +Und auch nachdem die `response` generiert wurde, bevor sie zurÃŒckgegeben wird. + +Sie könnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hinzufÃŒgen, der die Zeit in Sekunden enthÀlt, die benötigt wurde, um den Request zu verarbeiten und eine Response zu generieren: + +```Python hl_lines="10 12-13" +{!../../../docs_src/middleware/tutorial001.py!} +``` + +## Andere Middlewares + +Sie können spÀter mehr ÃŒber andere Middlewares in [Handbuch fÃŒr fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md){.internal-link target=_blank} lesen. + +In der nÀchsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln können. From cedea4d7b5b62c8985ca806816a188a9451d1225 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 11:27:20 +0000 Subject: [PATCH 086/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7bbee3c44..69954afc1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/middleware.md`. PR [#10391](https://github.com/tiangolo/fastapi/pull/10391) by [@JohannesJungbluth](https://github.com/JohannesJungbluth). * 🌐 Add German translation for introduction documents. PR [#10497](https://github.com/tiangolo/fastapi/pull/10497) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/encoder.md`. PR [#1955](https://github.com/tiangolo/fastapi/pull/1955) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-data-types.md`. PR [#1932](https://github.com/tiangolo/fastapi/pull/1932) by [@SwftAlpc](https://github.com/SwftAlpc). From 690edc03853e1982eaa92e67976591c7625f4aa3 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 14:04:57 +0100 Subject: [PATCH 087/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/advanced/additional-status-codes.md`?= =?UTF-8?q?=20(#10617)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/advanced/additional-status-codes.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/de/docs/advanced/additional-status-codes.md diff --git a/docs/de/docs/advanced/additional-status-codes.md b/docs/de/docs/advanced/additional-status-codes.md new file mode 100644 index 000000000..e9de267cf --- /dev/null +++ b/docs/de/docs/advanced/additional-status-codes.md @@ -0,0 +1,69 @@ +# ZusÀtzliche Statuscodes + +StandardmÀßig liefert **FastAPI** die RÃŒckgabewerte (Responses) als `JSONResponse` zurÃŒck und fÃŒgt den Inhalt der jeweiligen *Pfadoperation* in das `JSONResponse` Objekt ein. + +Es wird der Default-Statuscode oder derjenige verwendet, den Sie in Ihrer *Pfadoperation* festgelegt haben. + +## ZusÀtzliche Statuscodes + +Wenn Sie neben dem Hauptstatuscode weitere Statuscodes zurÃŒckgeben möchten, können Sie dies tun, indem Sie direkt eine `Response` zurÃŒckgeben, wie etwa eine `JSONResponse`, und den zusÀtzlichen Statuscode direkt festlegen. + +Angenommen, Sie möchten eine *Pfadoperation* haben, die das Aktualisieren von Artikeln ermöglicht und bei Erfolg den HTTP-Statuscode 200 „OK“ zurÃŒckgibt. + +Sie möchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente vorher nicht vorhanden waren, werden diese Elemente erstellt und der HTTP-Statuscode 201 „Created“ zurÃŒckgegeben. + +Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurÃŒck, indem Sie den gewÃŒnschten `status_code` setzen: + +=== "Python 3.10+" + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4 26" + {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="2 23" + {!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001.py!} + ``` + +!!! warning "Achtung" + Wenn Sie eine `Response` direkt zurÃŒckgeben, wie im obigen Beispiel, wird sie direkt zurÃŒckgegeben. + + Sie wird nicht mit einem Modell usw. serialisiert. + + Stellen Sie sicher, dass sie die gewÃŒnschten Daten enthÀlt und dass die Werte gÃŒltiges JSON sind (wenn Sie `JSONResponse` verwenden). + +!!! note "Technische Details" + Sie können auch `from starlette.responses import JSONResponse` verwenden. + + **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŒr Sie, den Entwickler. Die meisten verfÃŒgbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt fÃŒr `status`. + +## OpenAPI- und API-Dokumentation + +Wenn Sie zusÀtzliche Statuscodes und Responses direkt zurÃŒckgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurÃŒckgeben werden. + +Sie können das jedoch in Ihrem Code dokumentieren, indem Sie Folgendes verwenden: [ZusÀtzliche Responses](additional-responses.md){.internal-link target=_blank}. From c3914a19a7375e0b52e8e7db77cc23290a90a0c8 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 14:05:12 +0100 Subject: [PATCH 088/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/advanced/custom-response.md`=20(#10624?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/advanced/custom-response.md | 300 +++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 docs/de/docs/advanced/custom-response.md diff --git a/docs/de/docs/advanced/custom-response.md b/docs/de/docs/advanced/custom-response.md new file mode 100644 index 000000000..68c037ad7 --- /dev/null +++ b/docs/de/docs/advanced/custom-response.md @@ -0,0 +1,300 @@ +# Benutzerdefinierte Response – HTML, Stream, Datei, andere + +StandardmÀßig gibt **FastAPI** die Responses mittels `JSONResponse` zurÃŒck. + +Sie können das ÃŒberschreiben, indem Sie direkt eine `Response` zurÃŒckgeben, wie in [Eine Response direkt zurÃŒckgeben](response-directly.md){.internal-link target=_blank} gezeigt. + +Wenn Sie jedoch direkt eine `Response` zurÃŒckgeben, werden die Daten nicht automatisch konvertiert und die Dokumentation wird nicht automatisch generiert (zum Beispiel wird der spezifische „Medientyp“, der im HTTP-Header `Content-Type` angegeben ist, nicht Teil der generierten OpenAPI). + +Sie können aber auch die `Response`, die Sie verwenden möchten, im *Pfadoperation-Dekorator* deklarieren. + +Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurÃŒckgeben, wird in diese `Response` eingefÃŒgt. + +Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurÃŒckgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben. + +!!! note "Hinweis" + Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation. + +## `ORJSONResponse` verwenden + +Um beispielsweise noch etwas Leistung herauszuholen, können Sie `orjson` installieren und verwenden, und die Response als `ORJSONResponse` deklarieren. + +Importieren Sie die `Response`-Klasse (-Unterklasse), die Sie verwenden möchten, und deklarieren Sie sie im *Pfadoperation-Dekorator*. + +Bei umfangreichen Responses ist die direkte RÃŒckgabe einer `Response` viel schneller als ein Dictionary zurÃŒckzugeben. + +Das liegt daran, dass FastAPI standardmÀßig jedes enthaltene Element ÃŒberprÃŒft und sicherstellt, dass es als JSON serialisierbar ist, und zwar unter Verwendung desselben [JSON-kompatiblen Encoders](../tutorial/encoder.md){.internal-link target=_blank}, der im Tutorial erlÀutert wurde. Dadurch können Sie **beliebige Objekte** zurÃŒckgeben, zum Beispiel Datenbankmodelle. + +Wenn Sie jedoch sicher sind, dass der von Ihnen zurÃŒckgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse ÃŒbergeben und die zusÀtzliche Arbeit vermeiden, die FastAPI hÀtte, indem es Ihren zurÃŒckgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse ÃŒbergibt. + +```Python hl_lines="2 7" +{!../../../docs_src/custom_response/tutorial001b.py!} +``` + +!!! info + Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. + + In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt. + + Und er wird als solcher in OpenAPI dokumentiert. + +!!! tip "Tipp" + Die `ORJSONResponse` ist derzeit nur in FastAPI verfÃŒgbar, nicht in Starlette. + +## HTML-Response + +Um eine Response mit HTML direkt von **FastAPI** zurÃŒckzugeben, verwenden Sie `HTMLResponse`. + +* Importieren Sie `HTMLResponse`. +* Übergeben Sie `HTMLResponse` als den Parameter `response_class` Ihres *Pfadoperation-Dekorators*. + +```Python hl_lines="2 7" +{!../../../docs_src/custom_response/tutorial002.py!} +``` + +!!! info + Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. + + In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt. + + Und er wird als solcher in OpenAPI dokumentiert. + +### Eine `Response` zurÃŒckgeben + +Wie in [Eine Response direkt zurÃŒckgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* ÃŒberschreiben, indem Sie diese zurÃŒckgeben. + +Das gleiche Beispiel von oben, das eine `HTMLResponse` zurÃŒckgibt, könnte so aussehen: + +```Python hl_lines="2 7 19" +{!../../../docs_src/custom_response/tutorial003.py!} +``` + +!!! warning "Achtung" + Eine `Response`, die direkt von Ihrer *Pfadoperation-Funktion* zurÃŒckgegeben wird, wird in OpenAPI nicht dokumentiert (zum Beispiel wird der `Content-Type` nicht dokumentiert) und ist in der automatischen interaktiven Dokumentation nicht sichtbar. + +!!! info + NatÃŒrlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurÃŒckgegeben haben. + +### In OpenAPI dokumentieren und `Response` ÃŒberschreiben + +Wenn Sie die Response innerhalb der Funktion ÃŒberschreiben und gleichzeitig den „Medientyp“ in OpenAPI dokumentieren möchten, können Sie den `response_class`-Parameter verwenden UND ein `Response`-Objekt zurÃŒckgeben. + +Die `response_class` wird dann nur zur Dokumentation der OpenAPI-Pfadoperation* verwendet, Ihre `Response` wird jedoch unverÀndert verwendet. + +#### Eine `HTMLResponse` direkt zurÃŒckgeben + +Es könnte zum Beispiel so etwas sein: + +```Python hl_lines="7 21 23" +{!../../../docs_src/custom_response/tutorial004.py!} +``` + +In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurÃŒck, anstatt das HTML in einem `str` zurÃŒckzugeben. + +Indem Sie das Ergebnis des Aufrufs von `generate_html_response()` zurÃŒckgeben, geben Sie bereits eine `Response` zurÃŒck, die das Standardverhalten von **FastAPI** ÃŒberschreibt. + +Aber da Sie die `HTMLResponse` auch in der `response_class` ÃŒbergeben haben, weiß **FastAPI**, dass sie in OpenAPI und der interaktiven Dokumentation als HTML mit `text/html` zu dokumentieren ist: + + + +## VerfÃŒgbare Responses + +Hier sind einige der verfÃŒgbaren Responses. + +Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurÃŒckzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen. + +!!! note "Technische Details" + Sie können auch `from starlette.responses import HTMLResponse` verwenden. + + **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit fÃŒr Sie, den Entwickler. Die meisten verfÃŒgbaren Responses kommen aber direkt von Starlette. + +### `Response` + +Die Hauptklasse `Response`, alle anderen Responses erben von ihr. + +Sie können sie direkt zurÃŒckgeben. + +Sie akzeptiert die folgenden Parameter: + +* `content` – Ein `str` oder `bytes`. +* `status_code` – Ein `int`-HTTP-Statuscode. +* `headers` – Ein `dict` von Strings. +* `media_type` – Ein `str`, der den Medientyp angibt. Z. B. `"text/html"`. + +FastAPI (eigentlich Starlette) fÃŒgt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfÃŒgen, der auf dem media_type basiert, und fÃŒr Texttypen einen Zeichensatz (charset) anfÃŒgen. + +```Python hl_lines="1 18" +{!../../../docs_src/response_directly/tutorial002.py!} +``` + +### `HTMLResponse` + +Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurÃŒck, wie Sie oben gelesen haben. + +### `PlainTextResponse` + +Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurÃŒck. + +```Python hl_lines="2 7 9" +{!../../../docs_src/custom_response/tutorial005.py!} +``` + +### `JSONResponse` + +Nimmt einige Daten entgegen und gibt eine `application/json`-codierte Response zurÃŒck. + +Dies ist die Standard-Response, die in **FastAPI** verwendet wird, wie Sie oben gelesen haben. + +### `ORJSONResponse` + +Eine schnelle alternative JSON-Response mit `orjson`, wie Sie oben gelesen haben. + +### `UJSONResponse` + +Eine alternative JSON-Response mit `ujson`. + +!!! warning "Achtung" + `ujson` ist bei der Behandlung einiger SonderfÀlle weniger sorgfÀltig als Pythons eingebaute Implementierung. + +```Python hl_lines="2 7" +{!../../../docs_src/custom_response/tutorial001.py!} +``` + +!!! tip "Tipp" + Möglicherweise ist `ORJSONResponse` eine schnellere Alternative. + +### `RedirectResponse` + +Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurÃŒck. Verwendet standardmÀßig den Statuscode 307 – TemporÀre Weiterleitung (Temporary Redirect). + +Sie können eine `RedirectResponse` direkt zurÃŒckgeben: + +```Python hl_lines="2 9" +{!../../../docs_src/custom_response/tutorial006.py!} +``` + +--- + +Oder Sie können sie im Parameter `response_class` verwenden: + + +```Python hl_lines="2 7 9" +{!../../../docs_src/custom_response/tutorial006b.py!} +``` + +Wenn Sie das tun, können Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurÃŒckgeben. + +In diesem Fall ist der verwendete `status_code` der Standardcode fÃŒr die `RedirectResponse`, also `307`. + +--- + +Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `response_class` verwenden: + +```Python hl_lines="2 7 9" +{!../../../docs_src/custom_response/tutorial006c.py!} +``` + +### `StreamingResponse` + +Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody. + +```Python hl_lines="2 14" +{!../../../docs_src/custom_response/tutorial007.py!} +``` + +#### Verwendung von `StreamingResponse` mit dateiÀhnlichen Objekten + +Wenn Sie ein dateiÀhnliches (file-like) Objekt haben (z. B. das von `open()` zurÃŒckgegebene Objekt), können Sie eine Generatorfunktion erstellen, um ÃŒber dieses dateiÀhnliche Objekt zu iterieren. + +Auf diese Weise mÃŒssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und können diese Generatorfunktion an `StreamingResponse` ÃŒbergeben und zurÃŒckgeben. + +Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen. + +```{ .python .annotate hl_lines="2 10-12 14" } +{!../../../docs_src/custom_response/tutorial008.py!} +``` + +1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthÀlt. +2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiÀhnliche Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist. +3. Dieses `yield from` weist die Funktion an, ÃŒber das Ding namens `file_like` zu iterieren. Und dann fÃŒr jeden iterierten Teil, diesen Teil so zurÃŒckzugeben, als wenn er aus dieser Generatorfunktion (`iterfile`) stammen wÃŒrde. + + Es handelt sich also hier um eine Generatorfunktion, die die „generierende“ Arbeit intern auf etwas anderes ÃŒbertrÀgt. + + Auf diese Weise können wir das Ganze in einen `with`-Block einfÃŒgen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird. + +!!! tip "Tipp" + Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstÃŒtzt, hier die Pfadoperation mit normalen `def` deklarieren. + +### `FileResponse` + +Streamt eine Datei asynchron als Response. + +Nimmt zur Instanziierung einen anderen Satz von Argumenten entgegen als die anderen Response-Typen: + +* `path` – Der Dateipfad zur Datei, die gestreamt werden soll. +* `headers` – Alle benutzerdefinierten Header, die inkludiert werden sollen, als Dictionary. +* `media_type` – Ein String, der den Medientyp angibt. Wenn nicht gesetzt, wird der Dateiname oder Pfad verwendet, um auf einen Medientyp zu schließen. +* `filename` – Wenn gesetzt, wird das in der `Content-Disposition` der Response eingefÃŒgt. + +Datei-Responses enthalten die entsprechenden `Content-Length`-, `Last-Modified`- und `ETag`-Header. + +```Python hl_lines="2 10" +{!../../../docs_src/custom_response/tutorial009.py!} +``` + +Sie können auch den Parameter `response_class` verwenden: + +```Python hl_lines="2 8 10" +{!../../../docs_src/custom_response/tutorial009b.py!} +``` + +In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurÃŒckgeben. + +## Benutzerdefinierte Response-Klasse + +Sie können Ihre eigene benutzerdefinierte Response-Klasse erstellen, die von `Response` erbt und diese verwendet. + +Nehmen wir zum Beispiel an, dass Sie `orjson` verwenden möchten, aber mit einigen benutzerdefinierten Einstellungen, die in der enthaltenen `ORJSONResponse`-Klasse nicht verwendet werden. + +Sie möchten etwa, dass Ihre Response eingerÃŒcktes und formatiertes JSON zurÃŒckgibt. DafÃŒr möchten Sie die orjson-Option `orjson.OPT_INDENT_2` verwenden. + +Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun mÃŒssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurÃŒckgibt: + +```Python hl_lines="9-14 17" +{!../../../docs_src/custom_response/tutorial009c.py!} +``` + +Statt: + +```json +{"message": "Hello World"} +``` + +... wird die Response jetzt Folgendes zurÃŒckgeben: + +```json +{ + "message": "Hello World" +} +``` + +NatÃŒrlich werden Sie wahrscheinlich viel bessere Möglichkeiten finden, Vorteil daraus zu ziehen, als JSON zu formatieren. 😉 + +## Standard-Response-Klasse + +Beim Erstellen einer **FastAPI**-Klasseninstanz oder eines `APIRouter`s können Sie angeben, welche Response-Klasse standardmÀßig verwendet werden soll. + +Der Parameter, der das definiert, ist `default_response_class`. + +Im folgenden Beispiel verwendet **FastAPI** standardmÀßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`. + +```Python hl_lines="2 4" +{!../../../docs_src/custom_response/tutorial010.py!} +``` + +!!! tip "Tipp" + Sie können dennoch weiterhin `response_class` in *Pfadoperationen* ÃŒberschreiben, wie bisher. + +## ZusÀtzliche Dokumentation + +Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [ZusÀtzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. From 149fa96dc73225b8f6817b829eee9870cb787c60 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:05:21 +0000 Subject: [PATCH 089/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 69954afc1..41ade632c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/advanced/additional-status-codes.md`. PR [#10617](https://github.com/tiangolo/fastapi/pull/10617) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/middleware.md`. PR [#10391](https://github.com/tiangolo/fastapi/pull/10391) by [@JohannesJungbluth](https://github.com/JohannesJungbluth). * 🌐 Add German translation for introduction documents. PR [#10497](https://github.com/tiangolo/fastapi/pull/10497) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/encoder.md`. PR [#1955](https://github.com/tiangolo/fastapi/pull/1955) by [@SwftAlpc](https://github.com/SwftAlpc). From 2c1dd4a92be3dda8af3835783e85980958ab8228 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:05:40 +0000 Subject: [PATCH 090/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 41ade632c..9b091c494 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/advanced/custom-response.md`. PR [#10624](https://github.com/tiangolo/fastapi/pull/10624) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/additional-status-codes.md`. PR [#10617](https://github.com/tiangolo/fastapi/pull/10617) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/middleware.md`. PR [#10391](https://github.com/tiangolo/fastapi/pull/10391) by [@JohannesJungbluth](https://github.com/JohannesJungbluth). * 🌐 Add German translation for introduction documents. PR [#10497](https://github.com/tiangolo/fastapi/pull/10497) by [@nilslindemann](https://github.com/nilslindemann). From 43a7ff782bc7e136c579e9b704916e6e8bea8dc5 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 14:06:03 +0100 Subject: [PATCH 091/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/advanced/openapi-webhooks.md`=20(#1071?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/advanced/openapi-webhooks.md | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/de/docs/advanced/openapi-webhooks.md diff --git a/docs/de/docs/advanced/openapi-webhooks.md b/docs/de/docs/advanced/openapi-webhooks.md new file mode 100644 index 000000000..339218080 --- /dev/null +++ b/docs/de/docs/advanced/openapi-webhooks.md @@ -0,0 +1,51 @@ +# OpenAPI-Webhooks + +Es gibt FÀlle, in denen Sie Ihren API-Benutzern mitteilen möchten, dass Ihre Anwendung mit einigen Daten *deren* Anwendung aufrufen (ein Request senden) könnte, normalerweise um ÃŒber ein bestimmtes **Event** zu **benachrichtigen**. + +Das bedeutet, dass anstelle des normalen Prozesses, bei dem Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre Anwendung) **Requests an deren System** (an deren API, deren Anwendung) senden könnte. + +Das wird normalerweise als **Webhook** bezeichnet. + +## Webhooks-Schritte + +Der Prozess besteht normalerweise darin, dass **Sie in Ihrem Code definieren**, welche Nachricht Sie senden möchten, den **Body des Requests**. + +Sie definieren auch auf irgendeine Weise, zu welchen **Momenten** Ihre Anwendung diese Requests oder Events sendet. + +Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-Dashboard) die **URL**, an die Ihre Anwendung diese Requests senden soll. + +Die gesamte **Logik** zur Registrierung der URLs fÃŒr Webhooks und der Code zum tatsÀchlichen Senden dieser Requests liegt bei Ihnen. Sie schreiben es so, wie Sie möchten, in **Ihrem eigenen Code**. + +## Webhooks mit **FastAPI** und OpenAPI dokumentieren + +Mit **FastAPI** können Sie mithilfe von OpenAPI die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre Anwendung senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre Anwendung senden wÃŒrde. + +Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Möglicherweise können diese sogar einen Teil des eigenem API-Codes automatisch generieren. + +!!! info + Webhooks sind in OpenAPI 3.1.0 und höher verfÃŒgbar und werden von FastAPI `0.99.0` und höher unterstÃŒtzt. + +## Eine Anwendung mit Webhooks + +Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren können, genauso wie Sie *Pfadoperationen* definieren wÃŒrden, zum Beispiel mit `@app.webhooks.post()`. + +```Python hl_lines="9-13 36-53" +{!../../../docs_src/openapi_webhooks/tutorial001.py!} +``` + +Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-OberflÀche**. + +!!! info + Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden wÃŒrden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren. + +Beachten Sie, dass Sie bei Webhooks tatsÀchlich keinen *Pfad* (wie `/items/`) deklarieren, sondern dass der Text, den Sie dort ÃŒbergeben, lediglich eine **Kennzeichnung** des Webhooks (der Name des Events) ist. Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`. + +Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsÀchlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. ÃŒber ein Web-Dashboard). + +### Es in der Dokumentation ansehen + +Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf http://127.0.0.1:8000/docs gehen. + +Sie werden sehen, dass Ihre Dokumentation die normalen *Pfadoperationen* und jetzt auch einige **Webhooks** enthÀlt: + + From 74cf1c97025b3afe2c77baeba18620ac2b496d03 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 14:07:40 +0100 Subject: [PATCH 092/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/advanced/generate-clients.md`=20(#1072?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/advanced/generate-clients.md | 286 ++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 docs/de/docs/advanced/generate-clients.md diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md new file mode 100644 index 000000000..2fcba5956 --- /dev/null +++ b/docs/de/docs/advanced/generate-clients.md @@ -0,0 +1,286 @@ +# Clients generieren + +Da **FastAPI** auf der OpenAPI-Spezifikation basiert, erhalten Sie automatische KompatibilitÀt mit vielen Tools, einschließlich der automatischen API-Dokumentation (bereitgestellt von Swagger UI). + +Ein besonderer Vorteil, der nicht unbedingt offensichtlich ist, besteht darin, dass Sie fÃŒr Ihre API **Clients generieren** können (manchmal auch **SDKs** genannt), fÃŒr viele verschiedene **Programmiersprachen**. + +## OpenAPI-Client-Generatoren + +Es gibt viele Tools zum Generieren von Clients aus **OpenAPI**. + +Ein gÀngiges Tool ist OpenAPI Generator. + +Wenn Sie ein **Frontend** erstellen, ist openapi-typescript-codegen eine sehr interessante Alternative. + +## Client- und SDK-Generatoren – Sponsor + +Es gibt auch einige **vom Unternehmen entwickelte** Client- und SDK-Generatoren, die auf OpenAPI (FastAPI) basieren. In einigen FÀllen können diese Ihnen **weitere FunktionalitÀt** zusÀtzlich zu qualitativ hochwertigen generierten SDKs/Clients bieten. + +Einige von diesen ✹ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✹, das gewÀhrleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. + +Und es zeigt deren wahres Engagement fÃŒr FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie ÃŒber ein **gutes und gesundes Framework** verfÃŒgen, FastAPI. 🙇 + +Beispielsweise könnten Sie Speakeasy ausprobieren. + +Es gibt auch mehrere andere Unternehmen, welche Àhnliche Dienste anbieten und die Sie online suchen und finden können. 🀓 + +## Einen TypeScript-Frontend-Client generieren + +Beginnen wir mit einer einfachen FastAPI-Anwendung: + +=== "Python 3.9+" + + ```Python hl_lines="7-9 12-13 16-17 21" + {!> ../../../docs_src/generate_clients/tutorial001_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9-11 14-15 18 19 23" + {!> ../../../docs_src/generate_clients/tutorial001.py!} + ``` + +Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese fÃŒr die Request- und Response-Payload verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden. + +### API-Dokumentation + +Wenn Sie zur API-Dokumentation gehen, werden Sie sehen, dass diese die **Schemas** fÃŒr die Daten enthÀlt, welche in Requests gesendet und in Responses empfangen werden: + + + +Sie können diese Schemas sehen, da sie mit den Modellen in der Anwendung deklariert wurden. + +Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfÃŒgbar und werden dann in der API-Dokumentation angezeigt (von Swagger UI). + +Und dieselben Informationen aus den Modellen, die in OpenAPI enthalten sind, können zum **Generieren des Client-Codes** verwendet werden. + +### Einen TypeScript-Client generieren + +Nachdem wir nun die Anwendung mit den Modellen haben, können wir den Client-Code fÃŒr das Frontend generieren. + +#### `openapi-typescript-codegen` installieren + +Sie können `openapi-typescript-codegen` in Ihrem Frontend-Code installieren mit: + +
+ +```console +$ npm install openapi-typescript-codegen --save-dev + +---> 100% +``` + +
+ +#### Client-Code generieren + +Um den Client-Code zu generieren, können Sie das Kommandozeilentool `openapi` verwenden, das soeben installiert wurde. + +Da es im lokalen Projekt installiert ist, könnten Sie diesen Befehl wahrscheinlich nicht direkt aufrufen, sondern wÌrden ihn in Ihre Datei `package.json` einfÌgen. + +Diese könnte so aussehen: + +```JSON hl_lines="7" +{ + "name": "frontend-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "generate-client": "openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios --useOptions --useUnionTypes" + }, + "author": "", + "license": "", + "devDependencies": { + "openapi-typescript-codegen": "^0.20.1", + "typescript": "^4.6.2" + } +} +``` + +Nachdem Sie das NPM-Skript `generate-client` dort stehen haben, können Sie es ausfÌhren mit: + +
+ +```console +$ npm run generate-client + +frontend-app@1.0.0 generate-client /home/user/code/frontend-app +> openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios --useOptions --useUnionTypes +``` + +
+ +Dieser Befehl generiert Code in `./src/client` und verwendet intern `axios` (die Frontend-HTTP-Bibliothek). + +### Den Client-Code ausprobieren + +Jetzt können Sie den Client-Code importieren und verwenden. Er könnte wie folgt aussehen, beachten Sie, dass Sie automatische CodevervollstÀndigung fÃŒr die Methoden erhalten: + + + +Sie erhalten außerdem automatische VervollstÀndigung fÃŒr die zu sendende Payload: + + + +!!! tip "Tipp" + Beachten Sie die automatische VervollstÀndigung fÃŒr `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden. + +Sie erhalten Inline-Fehlerberichte fÃŒr die von Ihnen gesendeten Daten: + + + +Das Response-Objekt hat auch automatische VervollstÀndigung: + + + +## FastAPI-Anwendung mit Tags + +In vielen FÀllen wird Ihre FastAPI-Anwendung größer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren. + +Beispielsweise könnten Sie einen Abschnitt fÃŒr **Items (Artikel)** und einen weiteren Abschnitt fÃŒr **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein: + +=== "Python 3.9+" + + ```Python hl_lines="21 26 34" + {!> ../../../docs_src/generate_clients/tutorial002_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="23 28 36" + {!> ../../../docs_src/generate_clients/tutorial002.py!} + ``` + +### Einen TypeScript-Client mit Tags generieren + +Wenn Sie unter Verwendung von Tags einen Client fÃŒr eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt. + +Auf diese Weise können Sie die Dinge fÃŒr den Client-Code richtig ordnen und gruppieren: + + + +In diesem Fall haben Sie: + +* `ItemsService` +* `UsersService` + +### Client-Methodennamen + +Im Moment sehen die generierten Methodennamen wie `createItemItemsPost` nicht sehr sauber aus: + +```TypeScript +ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) +``` + +... das liegt daran, dass der Client-Generator fÃŒr jede *Pfadoperation* die OpenAPI-interne **Operation-ID** verwendet. + +OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* eindeutig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs eindeutig sind. + +Aber ich zeige Ihnen als nÀchstes, wie Sie das verbessern können. 🀓 + +## Benutzerdefinierte Operation-IDs und bessere Methodennamen + +Sie können die Art und Weise, wie diese Operation-IDs **generiert** werden, **Àndern**, um sie einfacher zu machen und **einfachere Methodennamen** in den Clients zu haben. + +In diesem Fall mÃŒssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **eindeutig** ist. + +Sie könnten beispielsweise sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem **Namen** der *Pfadoperation* (dem Funktionsnamen) generieren. + +### Funktion zum Generieren einer eindeutigen ID erstellen + +FastAPI verwendet eine **eindeutige ID** fÃŒr jede *Pfadoperation*, diese wird fÃŒr die **Operation-ID** und auch fÃŒr die Namen aller benötigten benutzerdefinierten Modelle fÃŒr Requests oder Responses verwendet. + +Sie können diese Funktion anpassen. Sie nimmt eine `APIRoute` und gibt einen String zurÃŒck. + +Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den Namen der *Pfadoperation* (den Funktionsnamen). + +Anschließend können Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** ÃŒbergeben: + +=== "Python 3.9+" + + ```Python hl_lines="6-7 10" + {!> ../../../docs_src/generate_clients/tutorial003_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="8-9 12" + {!> ../../../docs_src/generate_clients/tutorial003.py!} + ``` + +### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren + +Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er ÃŒber die verbesserten Methodennamen verfÃŒgt: + + + +Wie Sie sehen, haben die Methodennamen jetzt den Tag und dann den Funktionsnamen, aber keine Informationen aus dem URL-Pfad und der HTTP-Operation. + +### Vorab-Modifikation der OpenAPI-Spezifikation fÃŒr den Client-Generator + +Der generierte Code enthÀlt immer noch etwas **verdoppelte Information**. + +Wir wissen bereits, dass diese Methode mit den **Items** zusammenhÀngt, da sich dieses Wort in `ItemsService` befindet (vom Tag ÃŒbernommen), aber wir haben auch immer noch den Tagnamen im Methodennamen vorangestellt. 😕 + +Wir werden das wahrscheinlich weiterhin fÃŒr OpenAPI im Allgemeinen beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **eindeutig** sind. + +Aber fÃŒr den generierten Client könnten wir die OpenAPI-Operation-IDs direkt vor der Generierung der Clients **modifizieren**, um diese Methodennamen schöner und **sauberer** zu machen. + +Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**: + +=== "Python" + + ```Python + {!> ../../../docs_src/generate_clients/tutorial004.py!} + ``` + +=== "Node.js" + + ```Javascript + {!> ../../../docs_src/generate_clients/tutorial004.js!} + ``` + +Damit wÃŒrden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann. + +### Einen TypeScript-Client mit der modifizierten OpenAPI generieren + +Da das Endergebnis nun in einer Datei `openapi.json` vorliegt, wÃŒrden Sie die `package.json` Àndern, um diese lokale Datei zu verwenden, zum Beispiel: + +```JSON hl_lines="7" +{ + "name": "frontend-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "generate-client": "openapi --input ./openapi.json --output ./src/client --client axios --useOptions --useUnionTypes" + }, + "author": "", + "license": "", + "devDependencies": { + "openapi-typescript-codegen": "^0.20.1", + "typescript": "^4.6.2" + } +} +``` + +Nach der Generierung des neuen Clients hÀtten Sie nun **saubere Methodennamen** mit allen **AutovervollstÀndigungen**, **Inline-Fehlerberichten**, usw.: + + + +## Vorteile + +Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **automatische CodevervollstÀndigung** fÃŒr: + +* Methoden. +* Request-Payloads im Body, Query-Parameter, usw. +* Response-Payloads. + +Außerdem erhalten Sie fÃŒr alles **Inline-Fehlerberichte**. + +Und wann immer Sie den Backend-Code aktualisieren und das Frontend **neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur VerfÃŒgung, die alten werden entfernt und alle anderen Änderungen werden im generierten Code reflektiert. 🀓 + +Das bedeutet auch, dass, wenn sich etwas Àndert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, kommt es zu einer Fehlermeldung, wenn die verwendeten Daten **nicht ÃŒbereinstimmen**. + +Sie wÃŒrden also sehr frÃŒh im Entwicklungszyklus **viele Fehler erkennen**, anstatt darauf warten zu mÃŒssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. ✹ From 5ca3d175879166c4956b92d4bb7745086fe3b21d Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:08:30 +0000 Subject: [PATCH 093/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9b091c494..d7a8e0c60 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/advanced/openapi-webhooks.md`. PR [#10712](https://github.com/tiangolo/fastapi/pull/10712) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/custom-response.md`. PR [#10624](https://github.com/tiangolo/fastapi/pull/10624) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/additional-status-codes.md`. PR [#10617](https://github.com/tiangolo/fastapi/pull/10617) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/middleware.md`. PR [#10391](https://github.com/tiangolo/fastapi/pull/10391) by [@JohannesJungbluth](https://github.com/JohannesJungbluth). From 13b908df68e48416d968980d9b3f6f00f8ff54ad Mon Sep 17 00:00:00 2001 From: 3w36zj6 <52315048+3w36zj6@users.noreply.github.com> Date: Tue, 23 Jan 2024 22:10:49 +0900 Subject: [PATCH 094/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/security/index.md`=20(#5798?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ja/docs/tutorial/security/index.md | 101 ++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 docs/ja/docs/tutorial/security/index.md diff --git a/docs/ja/docs/tutorial/security/index.md b/docs/ja/docs/tutorial/security/index.md new file mode 100644 index 000000000..390f21047 --- /dev/null +++ b/docs/ja/docs/tutorial/security/index.md @@ -0,0 +1,101 @@ +# セキュリティ入門 + +セキュリティ、認蚌、認可を扱うには倚くの方法がありたす。 + +そしお、通垞、それは耇雑で「難しい」トピックです。 + +倚くのフレヌムワヌクやシステムでは、セキュリティず認蚌を凊理するだけで、膚倧な劎力ずコヌドが必芁になりたす倚くの堎合、曞かれた党コヌドの50%以䞊を占めるこずがありたす。 + +**FastAPI** は、セキュリティの仕様をすべお勉匷しお孊ぶこずなく、暙準的な方法で簡単に、迅速に**セキュリティ**を扱うためのツヌルをいく぀か提䟛したす。 + +しかし、その前に、いく぀かの小さな抂念を確認したしょう。 + +## お急ぎですか + +もし、これらの甚語に興味がなく、ナヌザヌ名ずパスワヌドに基づく認蚌でセキュリティを**今すぐ**確保する必芁がある堎合は、次の章に進んでください。 + +## OAuth2 + +OAuth2は、認蚌ず認可を凊理するためのいく぀かの方法を定矩した仕様です。 + +かなり広範囲な仕様で、いく぀かの耇雑なナヌスケヌスをカバヌしおいたす。 + +これには「サヌドパヌティ」を䜿甚しお認蚌する方法が含たれおいたす。 + +これが、「Facebook、Google、Twitter、GitHubを䜿っおログむン」を䜿甚したすべおのシステムの背埌で䜿われおいる仕組みです。 + +### OAuth 1 + +OAuth 1ずいうものもありたしたが、これはOAuth2ずは党く異なり、通信をどのように暗号化するかずいう仕様が盎接的に含たれおおり、より耇雑なものずなっおいたす。 + +珟圚ではあたり普及しおいたせんし、䜿われおもいたせん。 + +OAuth2は、通信を暗号化する方法を指定せず、アプリケヌションがHTTPSで提䟛されるこずを想定しおいたす。 + +!!! tip "豆知識" + **デプロむ**のセクションでは、TraefikずLet's Encryptを䜿甚しお、無料でHTTPSを蚭定する方法が玹介されおいたす。 + + +## OpenID Connect + +OpenID Connectは、**OAuth2**をベヌスにした別の仕様です。 + +これはOAuth2を拡匵したもので、OAuth2ではやや曖昧だった郚分を明確にし、より盞互運甚性を高めようずしたものです。 + +䟋ずしお、GoogleのログむンはOpenID Connectを䜿甚しおいたすこれはOAuth2がベヌスになっおいたす。 + +しかし、FacebookのログむンはOpenID Connectをサポヌトしおいたせん。OAuth2を独自にアレンゞしおいたす。 + +### OpenID (「OpenID Connect」ではない) + +たた、「OpenID」ずいう仕様もありたした。それは、**OpenID Connect**ず同じこずを解決しようずしたものですが、OAuth2に基づいおいるわけではありたせんでした。 + +぀たり、完党な远加システムだったのです。 + +珟圚ではあたり普及しおいたせんし、䜿われおもいたせん。 + +## OpenAPI + +OpenAPI以前はSwaggerずしお知られおいたしたは、APIを構築するためのオヌプンな仕様です珟圚はLinux Foundationの䞀郚になっおいたす。 + +**FastAPI**は、**OpenAPI**をベヌスにしおいたす。 + +それが、耇数の自動察話型ドキュメント・むンタヌフェヌスやコヌド生成などを可胜にしおいるのです。 + +OpenAPIには、耇数のセキュリティ「スキヌム」を定矩する方法がありたす。 + +それらを䜿甚するこずで、これらの察話型ドキュメントシステムを含む、暙準ベヌスのツヌルをすべお掻甚できたす。 + +OpenAPIでは、以䞋のセキュリティスキヌムを定矩しおいたす: + +* `apiKey`: アプリケヌション固有のキヌで、これらのものから取埗できたす。 + * ク゚リパラメヌタ + * ヘッダヌ + * クッキヌ +* `http`: 暙準的なHTTP認蚌システムで、これらのものを含みたす。 + * `bearer`: ヘッダ `Authorization` の倀が `Bearer ` で、トヌクンが含たれたす。これはOAuth2から継承しおいたす。 + * HTTP Basic認蚌 + * HTTP ダむゞェスト認蚌など +* `oauth2`: OAuth2のセキュリティ凊理方法「フロヌ」ず呌ばれたすのすべお。 + * これらのフロヌのいく぀かは、OAuth 2.0認蚌プロバむダGoogle、Facebook、Twitter、GitHubなどを構築するのに適しおいたす。 + * `implicit` + * `clientCredentials` + * `authorizationCode` + * しかし、同じアプリケヌション内で認蚌を盎接凊理するために完党に機胜する特定の「フロヌ」がありたす。 + * `password`: 次のいく぀かの章では、その䟋を玹介したす。 +* `openIdConnect`: OAuth2認蚌デヌタを自動的に発芋する方法を定矩できたす。 + * この自動怜出メカニズムは、OpenID Connectの仕様で定矩されおいるものです。 + + +!!! tip "豆知識" + Google、Facebook、Twitter、GitHubなど、他の認蚌/認可プロバむダを統合するこずも可胜で、比范的簡単です。 + + 最も耇雑な問題は、それらのような認蚌/認可プロバむダを構築するこずですが、**FastAPI**は、あなたのために重い仕事をこなしながら、それを簡単に行うためのツヌルを提䟛したす。 + +## **FastAPI** ナヌティリティ + +FastAPIは `fastapi.security` モゞュヌルの䞭で、これらのセキュリティスキヌムごずにいく぀かのツヌルを提䟛し、これらのセキュリティメカニズムを簡単に䜿甚できるようにしたす。 + +次の章では、**FastAPI** が提䟛するこれらのツヌルを䜿っお、あなたのAPIにセキュリティを远加する方法に぀いお芋おいきたす。 + +たた、それがどのようにむンタラクティブなドキュメントシステムに自動的に統合されるかも芋おいきたす。 From 7c9cb476a48d1de73557bcee22c62323d7b19971 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:11:16 +0000 Subject: [PATCH 095/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d7a8e0c60..ffbeaff15 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/advanced/generate-clients.md`. PR [#10725](https://github.com/tiangolo/fastapi/pull/10725) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/openapi-webhooks.md`. PR [#10712](https://github.com/tiangolo/fastapi/pull/10712) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/custom-response.md`. PR [#10624](https://github.com/tiangolo/fastapi/pull/10624) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/additional-status-codes.md`. PR [#10617](https://github.com/tiangolo/fastapi/pull/10617) by [@nilslindemann](https://github.com/nilslindemann). From 280f49ea835eb6f2d900aee2d9bb2f8425ab4dde Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:15:22 +0000 Subject: [PATCH 096/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ffbeaff15..68f6b0762 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/index.md`. PR [#5798](https://github.com/tiangolo/fastapi/pull/5798) by [@3w36zj6](https://github.com/3w36zj6). * 🌐 Add German translation for `docs/de/docs/advanced/generate-clients.md`. PR [#10725](https://github.com/tiangolo/fastapi/pull/10725) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/openapi-webhooks.md`. PR [#10712](https://github.com/tiangolo/fastapi/pull/10712) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/custom-response.md`. PR [#10624](https://github.com/tiangolo/fastapi/pull/10624) by [@nilslindemann](https://github.com/nilslindemann). From 51329762539c3ed1ed72e4a4860ccf5711aa7301 Mon Sep 17 00:00:00 2001 From: Nikita <78080842+NiKuma0@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:54:17 +0300 Subject: [PATCH 097/222] =?UTF-8?q?=F0=9F=8C=90=20Russian=20translation:?= =?UTF-8?q?=20updated=20`fastapi-people.md`.=20(#10255)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/fastapi-people.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ru/docs/fastapi-people.md b/docs/ru/docs/fastapi-people.md index 64ae66a03..6778cceab 100644 --- a/docs/ru/docs/fastapi-people.md +++ b/docs/ru/docs/fastapi-people.md @@ -5,7 +5,7 @@ ## СПзЎатель О храМОтель -Ку! 👋 +Хай! 👋 ЭтП я: From 315d8184e7e393106cb985ac3aff10d22b4d4080 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:54:45 +0000 Subject: [PATCH 098/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 68f6b0762..a1ee0f0cf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Russian translation: updated `fastapi-people.md`.. PR [#10255](https://github.com/tiangolo/fastapi/pull/10255) by [@NiKuma0](https://github.com/NiKuma0). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/index.md`. PR [#5798](https://github.com/tiangolo/fastapi/pull/5798) by [@3w36zj6](https://github.com/3w36zj6). * 🌐 Add German translation for `docs/de/docs/advanced/generate-clients.md`. PR [#10725](https://github.com/tiangolo/fastapi/pull/10725) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/openapi-webhooks.md`. PR [#10712](https://github.com/tiangolo/fastapi/pull/10712) by [@nilslindemann](https://github.com/nilslindemann). From 95d5902af17cf1e260d2ff6e9b5afb22c5a2bb4e Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Tue, 23 Jan 2024 16:55:32 +0300 Subject: [PATCH 099/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/body-updates.md`=20(#10373)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/body-updates.md | 153 ++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 docs/ru/docs/tutorial/body-updates.md diff --git a/docs/ru/docs/tutorial/body-updates.md b/docs/ru/docs/tutorial/body-updates.md new file mode 100644 index 000000000..4998ab31a --- /dev/null +++ b/docs/ru/docs/tutorial/body-updates.md @@ -0,0 +1,153 @@ +# Body - ОбМПвлеМОя + +## ППлМПе ПбМПвлеМОе с пПЌПщью `PUT` + +Для пПлМПгП ПбМПвлеМОя элеЌеМта ЌПжМП вПспПльзПваться ПперацОей HTTP `PUT`. + +Вы ЌПжете ОспПльзПвать фуМкцОю `jsonable_encoder` Ўля преПбразПваМОя вхПЎМых ЎаММых в JSON, так как МереЎкО случаО, кПгЎа рабПтать ЌПжМП тПлькП с прПстыЌО тОпаЌО ЎаММых (МапрОЌер, Ўля храМеМОя в NoSQL-базе ЎаММых). + +=== "Python 3.10+" + + ```Python hl_lines="28-33" + {!> ../../../docs_src/body_updates/tutorial001_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="30-35" + {!> ../../../docs_src/body_updates/tutorial001_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="30-35" + {!> ../../../docs_src/body_updates/tutorial001.py!} + ``` + +`PUT` ОспПльзуется Ўля пПлучеМОя ЎаММых, кПтПрые ЎПлжМы пПлМПстью заЌеМОть существующОе ЎаММые. + +### ПреЎупрежЎеМОе П заЌеМе + +ЭтП ПзМачает, чтП еслО вы хПтОте ПбМПвОть элеЌеМт `bar`, ОспПльзуя `PUT` с телПЌ, сПЎержащОЌ: + +```Python +{ + "name": "Barz", + "price": 3, + "description": None, +} +``` + +пПскПльку ПМП Ме включает уже сПхраМеММый атрОбут `"tax": 20.2`, вхПЎМая ЌПЎель прОЌет зМачеМОе пП уЌПлчаМОю `"tax": 10.5`. + +И ЎаММые буЎут сПхраМеМы с этОЌ "МПвыЌ" `tax`, равМыЌ `10,5`. + +## ЧастОчМПе ПбМПвлеМОе с пПЌПщью `PATCH` + +Также ЌПжМП ОспПльзПвать HTTP `PATCH` ПперацОю Ўля *частОчМПгП* ПбМПвлеМОя ЎаММых. + +ЭтП ПзМачает, чтП ЌПжМП переЎавать тПлькП те ЎаММые, кПтПрые МеПбхПЎОЌП ПбМПвОть, Пставляя ПстальМые МетрПМутыЌО. + +!!! note "ТехМОческОе ЎеталО" + `PATCH` ЌеМее распрПстраМеМ О ОзвестеМ, чеЌ `PUT`. + + А ЌМПгОе кПЌаМЎы ОспПльзуют тПлькП `PUT`, Ўаже Ўля частОчМПгП ПбМПвлеМОя. + + Вы ЌПжете **свПбПЎМП** ОспПльзПвать Ох как угПЎМП, **FastAPI** Ме МаклаЎывает МОкакОх ПграМОчеМОй. + + НП в ЎаММПЌ рукПвПЎстве бПлее ОлО ЌеМее пПМятМП, как ПМО ЎПлжМы ОспПльзПваться. + +### ИспПльзПваМОе параЌетра `exclude_unset` в Pydantic + +ЕслО МеПбхПЎОЌП выпПлМОть частОчМПе ПбМПвлеМОе, тП ПчеМь пПлезМП ОспПльзПвать параЌетр `exclude_unset` в ЌетПЎе `.dict()` ЌПЎелО Pydantic. + +НапрОЌер, `item.dict(exclude_unset=True)`. + +В результате буЎет сгеМерОрПваМ слПварь, сПЎержащОй тПлькП те ЎаММые, кПтПрые былО заЎаМы прО сПзЎаМОО ЌПЎелО `item`, без учета зМачеМОй пП уЌПлчаМОю. ЗатеЌ вы ЌПжете ОспПльзПвать этП Ўля сПзЎаМОя слПваря тПлькП с теЌО ЎаММыЌО, кПтПрые былО устаМПвлеМы (ПтправлеМы в запрПсе), Ппуская зМачеМОя пП уЌПлчаМОю: + +=== "Python 3.10+" + + ```Python hl_lines="32" + {!> ../../../docs_src/body_updates/tutorial002_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="34" + {!> ../../../docs_src/body_updates/tutorial002_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="34" + {!> ../../../docs_src/body_updates/tutorial002.py!} + ``` + +### ИспПльзПваМОе параЌетра `update` в Pydantic + +Теперь ЌПжМП сПзЎать кПпОю существующей ЌПЎелО, ОспПльзуя `.copy()`, О переЎать параЌетр `update` с `dict`, сПЎержащОЌ ЎаММые Ўля ПбМПвлеМОя. + +НапрОЌер, `stored_item_model.copy(update=update_data)`: + +=== "Python 3.10+" + + ```Python hl_lines="33" + {!> ../../../docs_src/body_updates/tutorial002_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="35" + {!> ../../../docs_src/body_updates/tutorial002_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="35" + {!> ../../../docs_src/body_updates/tutorial002.py!} + ``` + +### КраткП П частОчМПЌ ПбМПвлеМОО + +В целПЌ, Ўля прОЌеМеМОя частОчМых ПбМПвлеМОй МеПбхПЎОЌП: + +* (ОпцОПМальМП) ОспПльзПвать `PATCH` вЌестП `PUT`. +* Извлечь сПхраМёММые ЎаММые. +* ППЌестОть этО ЎаММые в Pydantic ЌПЎель. +* СгеМерОрПвать `dict` без зМачеМОй пП уЌПлчаМОю Оз вхПЎМПй ЌПЎелО (с ОспПльзПваМОеЌ `exclude_unset`). + * ТакОЌ ПбразПЌ, ЌПжМП ПбМПвлять тПлькП те зМачеМОя, кПтПрые ЎействОтельМП устаМПвлеМы пПльзПвателеЌ, вЌестП тПгП чтПбы переПпреЎелять зМачеМОя, уже сПхраМеММые в ЌПЎелО пП уЌПлчаМОю. +* СПзЎать кПпОю храМОЌПй ЌПЎелО, ПбМПвОв ее атрОбуты пПлучеММыЌО частОчМыЌО ПбМПвлеМОяЌО (с пПЌПщью параЌетра `update`). +* ПреПбразПвать скПпОрПваММую ЌПЎель в тП, чтП ЌПжет быть сПхраМеМП в вашей БД (МапрОЌер, с пПЌПщью `jsonable_encoder`). + * ЭтП сравМОЌП с пПвтПрМыЌ ОспПльзПваМОеЌ ЌетПЎа ЌПЎелО `.dict()`, МП прО этПЌ прПОсхПЎОт прПверка (О преПбразПваМОе) зМачеМОй в тОпы ЎаММых, кПтПрые ЌПгут быть преПбразПваМы в JSON, МапрОЌер, `datetime` в `str`. +* СПхраМОть ЎаММые в свПей БД. +* ВерМуть ПбМПвлеММую ЌПЎель. + +=== "Python 3.10+" + + ```Python hl_lines="28-35" + {!> ../../../docs_src/body_updates/tutorial002_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="30-37" + {!> ../../../docs_src/body_updates/tutorial002_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="30-37" + {!> ../../../docs_src/body_updates/tutorial002.py!} + ``` + +!!! tip "ППЎсказка" + Эту же техМОку ЌПжМП ОспПльзПвать О Ўля ПперацОО HTTP `PUT`. + + НП в прОвеЎеММПЌ прОЌере ОспПльзуется `PATCH`, пПскПльку ПМ был сПзЎаМ ОЌеММП Ўля такОх случаев ОспПльзПваМОя. + +!!! note "ТехМОческОе ЎеталО" + ОбратОте вМОЌаМОе, чтП вхПЎМая ЌПЎель пП-прежМеЌу валОЎОруется. + + ТакОЌ ПбразПЌ, еслО вы хПтОте пПлучать частОчМые ПбМПвлеМОя, в кПтПрых ЌПгут быть ПпущеМы все атрОбуты, ваЌ МеПбхПЎОЌП ОЌеть ЌПЎель, в кПтПрПй все атрОбуты пПЌечеМы как МеПбязательМые (сП зМачеМОяЌО пП уЌПлчаМОю ОлО `None`). + + ЧтПбы ПтлОчОть ЌПЎелО сП всеЌО МеПбязательМыЌО зМачеМОяЌО Ўля **ПбМПвлеМОя** Пт ЌПЎелей с ПбязательМыЌО зМачеМОяЌО Ўля **сПзЎаМОя**, ЌПжМП вПспПльзПваться ОЎеяЌО, ПпОсаММыЌО в [ДПпПлМОтельМые ЌПЎелО](extra-models.md){.internal-link target=_blank}. From 672b501b98c5d3b2589b6092080e4da8fc9ba835 Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Tue, 23 Jan 2024 16:56:12 +0300 Subject: [PATCH 100/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/encoder.md`=20(#10374)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/encoder.md | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/ru/docs/tutorial/encoder.md diff --git a/docs/ru/docs/tutorial/encoder.md b/docs/ru/docs/tutorial/encoder.md new file mode 100644 index 000000000..c26b2c941 --- /dev/null +++ b/docs/ru/docs/tutorial/encoder.md @@ -0,0 +1,42 @@ +# JSON кПЎОрПвщОк + +В МекПтПрых случаях ЌПжет пПтребПваться преПбразПваМОе тОпа ЎаММых (МапрОЌер, Pydantic-ЌПЎелО) в тОп, сПвЌестОЌый с JSON (МапрОЌер, `dict`, `list` О т.ÐŽ.). + +НапрОЌер, еслО МеПбхПЎОЌП храМОть егП в базе ЎаММых. + +Для этПгП **FastAPI** преЎПставляет фуМкцОю `jsonable_encoder()`. + +## ИспПльзПваМОе `jsonable_encoder` + +ПреЎставОЌ, чтП у вас есть база ЎаММых `fake_db`, кПтПрая прОМОЌает тПлькП JSON-сПвЌестОЌые ЎаММые. + +НапрОЌер, ПМ Ме прОМОЌает Пбъекты `datetime`, так как ПМО Ме сПвЌестОЌы с JSON. + +В такПЌ случае Пбъект `datetime` слеЎует преПбразПвать в стрПку сППтветствующую фПрЌату ISO. + +ТПчМП так же эта база ЎаММых Ме ЌПжет прОМять Pydantic ЌПЎель (Пбъект с атрОбутаЌО), а тПлькП `dict`. + +Для этПгП ЌПжМП ОспПльзПвать фуМкцОю `jsonable_encoder`. + +ОМа прОМОЌает Пбъект, МапрОЌер, ЌПЎель Pydantic, О вПзвращает егП версОю, сПвЌестОЌую с JSON: + +=== "Python 3.10+" + + ```Python hl_lines="4 21" + {!> ../../../docs_src/encoder/tutorial001_py310.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="5 22" + {!> ../../../docs_src/encoder/tutorial001.py!} + ``` + +В ЎаММПЌ прОЌере ПМа преПбразует Pydantic ЌПЎель в `dict`, а `datetime` - в `str`. + +РезультатПЌ её вызПва является Пбъект, кПтПрый ЌПжет быть закПЎОрПваМ с пПЌПщью фуМкцОО Оз стаМЎартМПй бОблОПтекО Python – `json.dumps()`. + +ЀуМкцОя Ме вПзвращает бПльшПй `str`, сПЎержащОй ЎаММые в фПрЌате JSON (в вОЎе стрПкО). ОМа вПзвращает стаМЎартМую структуру ЎаММых Python (МапрОЌер, `dict`) сП зМачеМОяЌО О пПЎзМачеМОяЌО, кПтПрые сПвЌестОЌы с JSON. + +!!! note "ТехМОческОе ЎеталО" + `jsonable_encoder` фактОческО ОспПльзуется **FastAPI** вМутрО сОстеЌы Ўля преПбразПваМОя ЎаММых. ОЎМакП ПМ пПлезеМ О вП ЌМПгОх ЎругОх сцеМарОях. From ac5e73b19dd09a60e49097de1ce0068b4f5464e1 Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Tue, 23 Jan 2024 16:56:29 +0300 Subject: [PATCH 101/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/handling-errors.md`=20(#1037?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/handling-errors.md | 261 +++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 docs/ru/docs/tutorial/handling-errors.md diff --git a/docs/ru/docs/tutorial/handling-errors.md b/docs/ru/docs/tutorial/handling-errors.md new file mode 100644 index 000000000..f578cf198 --- /dev/null +++ b/docs/ru/docs/tutorial/handling-errors.md @@ -0,0 +1,261 @@ +# ОбрабПтка ПшОбПк + +Существует ЌМПжествП сОтуацОй, кПгЎа МеПбхПЎОЌП сППбщОть Пб ПшОбке клОеМту, ОспПльзующеЌу ваш API. + +ТакОЌ клОеМтПЌ ЌПжет быть браузер с фрПМтеМЎПЌ, чужПй кПЎ, IoT-устрПйствП О т.ÐŽ. + +ВПзЌПжМП, ваЌ прОЎется сППбщОть клОеМту П слеЎующеЌ: + +* КлОеМт Ме ОЌеет ЎПстатПчМых прОвОлегОй Ўля выпПлМеМОя ЎаММПй ПперацОО. +* КлОеМт Ме ОЌеет ЎПступа к ЎаММПЌу ресурсу. +* ЭлеЌеМт, к кПтПрПЌу клОеМт пытался пПлучОть ЎПступ, Ме существует. +* О т.ÐŽ. + +В такОх случаях ПбычМП вПзвращается **HTTP-кПЎ статуса Птвета** в ЎОапазПМе **400** (Пт 400 ЎП 499). + +ОМО пПхПжО Ма ЎвухсПтые HTTP статус-кПЎы (Пт 200 ЎП 299), кПтПрые ПзМачают, чтП запрПс ПбрабПтаМ успешМП. + +ЧетырёхсПтые статус-кПЎы ПзМачают, чтП ПшОбка прПОзПшла пП вОМе клОеМта. + +ППЌМОте лО ПшОбкО **"404 Not Found "** (О шуткО) ? + +## ИспПльзПваМОе `HTTPException` + +Для вПзврата клОеМту HTTP-ПтветПв с ПшОбкаЌО ОспПльзуется `HTTPException`. + +### ИЌпПртОруйте `HTTPException` + +```Python hl_lines="1" +{!../../../docs_src/handling_errors/tutorial001.py!} +``` + +### ВызПвОте `HTTPException` в свПеЌ кПЎе + +`HTTPException` - этП ПбычМПе ОсключеМОе Python с ЎПпПлМОтельМыЌО ЎаММыЌО, актуальМыЌО Ўля API. + +ППскПльку этП ОсключеМОе Python, тП егП Ме `вПзвращают`, а `вызывают`. + +ЭтП также ПзМачает, чтП еслО вы МахПЎОтесь вМутрО фуМкцОО, кПтПрая вызывается вМутрО вашей *фуМкцОО ПперацОО путО*, О вы пПЎМОЌаете `HTTPException` вМутрО этПй фуМкцОО, тП ПМа Ме буЎет выпПлМять ПстальМПй кПЎ в *фуМкцОО ПперацОО путО*, а сразу завершОт запрПс О ПтправОт HTTP-ПшОбку Оз `HTTPException` клОеМту. + +О тПЌ, МаскПлькП выгПЎМее `вызывать` ОсключеМОе, чеЌ `вПзвращать` зМачеМОе, буЎет рассказаМП в разЎеле, пПсвящеММПЌ завОсОЌПстяЌ О безПпасМПстО. + +В ЎаММПЌ прОЌере, кПгЎа клОеМт запрашОвает элеЌеМт пП МесуществующеЌу ID, вПзМОкает ОсключеМОе сП статус-кПЎПЌ `404`: + +```Python hl_lines="11" +{!../../../docs_src/handling_errors/tutorial001.py!} +``` + +### ВПзвращаеЌый Птвет + +ЕслО клОеМт запрПсОт `http://example.com/items/foo` (`item_id` `"foo"`), тП ПМ пПлучОт статус-кПЎ 200 О Птвет в фПрЌате JSON: + +```JSON +{ + "item": "The Foo Wrestlers" +} +``` + +НП еслО клОеМт запрПсОт `http://example.com/items/bar` (МесуществующОй `item_id` `"bar"`), тП ПМ пПлучОт статус-кПЎ 404 (ПшОбка "Ме МайЎеМП") О JSON-Птвет в вОЎе: + +```JSON +{ + "detail": "Item not found" +} +``` + +!!! tip "ППЎсказка" + ПрО вызПве `HTTPException` в качестве параЌетра `detail` ЌПжМП переЎавать любПе зМачеМОе, кПтПрПе ЌПжет быть преПбразПваМП в JSON, а Ме тПлькП `str`. + + Вы ЌПжете переЎать `dict`, `list` О т.ÐŽ. + + ОМО автПЌатОческО Пбрабатываются **FastAPI** О преПбразуются в JSON. + +## ДПбавлеМОе пПльзПвательскОх загПлПвкПв + +В МекПтПрых сОтуацОях пПлезМП ОЌеть вПзЌПжМПсть ЎПбавлять пПльзПвательскОе загПлПвкО к ПшОбке HTTP. НапрОЌер, Ўля МекПтПрых тОпПв безПпасМПстО. + +СкПрее всегП, ваЌ Ме пПтребуется ОспПльзПвать егП МепПсреЎствеММП в кПЎе. + +НП в случае, еслО этП МеПбхПЎОЌП Ўля прПЎвОМутПгП сцеМарОя, ЌПжМП ЎПбавОть пПльзПвательскОе загПлПвкО: + +```Python hl_lines="14" +{!../../../docs_src/handling_errors/tutorial002.py!} +``` + +## УстаМПвка пПльзПвательскОх ПбрабПтчОкПв ОсключеМОй + +Вы ЌПжете ЎПбавОть пПльзПвательскОе ПбрабПтчОкО ОсключеМОй с пПЌПщью тП же саЌПе ОсключеМОе - утОлОты Пт Starlette. + +ДПпустОЌ, у вас есть пПльзПвательскПе ОсключеМОе `UnicornException`, кПтПрПе вы (ОлО ОспПльзуеЌая ваЌО бОблОПтека) ЌПжете `вызвать`. + +И вы хПтОте Пбрабатывать этП ОсключеМОе глПбальМП с пПЌПщью FastAPI. + +МПжМП ЎПбавОть сПбствеММый ПбрабПтчОк ОсключеМОй с пПЌПщью `@app.exception_handler()`: + +```Python hl_lines="5-7 13-18 24" +{!../../../docs_src/handling_errors/tutorial003.py!} +``` + +ЗЎесь, еслО запрПсОть `/unicorns/yolo`, тП *ПперацОя путО* вызПвет `UnicornException`. + +НП ПМП буЎет ПбрабПтаМП `unicorn_exception_handler`. + +ТакОЌ ПбразПЌ, вы пПлучОте чОстую ПшОбку с кПЎПЌ сПстПяМОя HTTP `418` О сПЎержОЌыЌ JSON: + +```JSON +{"message": "Oops! yolo did something. There goes a rainbow..."} +``` + +!!! note "ТехМОческОе ЎеталО" + Также ЌПжМП ОспПльзПвать `from starlette.requests import Request` О `from starlette.responses import JSONResponse`. + + **FastAPI** преЎПставляет тПт же `starlette.responses`, чтП О `fastapi.responses`, прПстП Ўля уЎПбства разрабПтчОка. ОЎМакП бПльшОМствП ЎПступМых ПтветПв пПступает МепПсреЎствеММП Оз Starlette. ТП же саЌПе касается О `Request`. + +## ПереПпреЎелеМОе стаМЎартМых ПбрабПтчОкПв ОсключеМОй + +**FastAPI** ОЌеет МекПтПрые ПбрабПтчОкО ОсключеМОй пП уЌПлчаМОю. + +ЭтО ПбрабПтчОкО Птвечают за вПзврат стаМЎартМых JSON-ПтветПв прО `вызПве` `HTTPException` О прО МалОчОО в запрПсе МеЎПпустОЌых ЎаММых. + +Вы ЌПжете переПпреЎелОть этО ПбрабПтчОкО ОсключеМОй Ма свПО сПбствеММые. + +### ПереПпреЎелеМОе ОсключеМОй прПверкО запрПса + +КПгЎа запрПс сПЎержОт МеЎПпустОЌые ЎаММые, **FastAPI** вМутреММе вызывает ПшОбку `RequestValidationError`. + +А также включает в себя ПбрабПтчОк ОсключеМОй пП уЌПлчаМОю. + +ЧтПбы переПпреЎелОть егП, ОЌпПртОруйте `RequestValidationError` О ОспПльзуйте егП с `@app.exception_handler(RequestValidationError)` Ўля сПзЎаМОя ПбрабПтчОка ОсключеМОй. + +ОбрабПтчОк ОсключеМОя пПлучОт Пбъект `Request` О ОсключеМОе. + +```Python hl_lines="2 14-16" +{!../../../docs_src/handling_errors/tutorial004.py!} +``` + +Теперь, еслО перейтО к `/items/foo`, тП вЌестП стаМЎартМПй JSON-ПшОбкО с: + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +вы пПлучОте текстПвую версОю: + +``` +1 validation error +path -> item_id + value is not a valid integer (type=type_error.integer) +``` + +#### `RequestValidationError` ОлО `ValidationError` + +!!! warning "ВМОЌаМОе" + ЭтП техМОческОе ЎеталО, кПтПрые ЌПжМП прПпустОть, еслО ПМО Ме важМы Ўля вас сейчас. + +`RequestValidationError` является пПЎклассПЌ Pydantic `ValidationError`. + +**FastAPI** ОспПльзует егП Ўля тПгП, чтПбы, еслО вы ОспПльзуете Pydantic-ЌПЎель в `response_model`, О вашО ЎаММые сПЎержат ПшОбку, вы увОЎелО ПшОбку в журМале. + +НП клОеМт/пПльзПватель этПгП Ме увОЎОт. ВЌестП этПгП клОеМт пПлучОт сППбщеМОе "Internal Server Error" с кПЎПЌ сПстПяМОя HTTP `500`. + +Так О ЎПлжМП быть, пПтПЌу чтП еслО в вашеЌ *Птвете* ОлО гЎе-лОбП в вашеЌ кПЎе (Ме в *запрПсе* клОеМта) вПзМОкает Pydantic `ValidationError`, тП этП ЎействОтельМП ПшОбка в вашеЌ кПЎе. + +И пПка вы Ме устраМОте ПшОбку, вашО клОеМты/пПльзПвателО Ме ЎПлжМы ОЌеть ЎПступа к вМутреММей ОМфПрЌацОО П Мей, так как этП ЌПжет прОвестО к уязвОЌПстО в сОстеЌе безПпасМПстО. + +### ПереПпреЎелОте ПбрабПтчОк ПшОбПк `HTTPException` + +АМалПгОчМыЌ ПбразПЌ ЌПжМП переПпреЎелОть ПбрабПтчОк `HTTPException`. + +НапрОЌер, Ўля этОх ПшОбПк ЌПжМП верМуть ПбычМый текстПвый Птвет вЌестП JSON: + +```Python hl_lines="3-4 9-11 22" +{!../../../docs_src/handling_errors/tutorial004.py!} +``` + +!!! note "ТехМОческОе ЎеталО" + МПжМП также ОспПльзПвать `from starlette.responses import PlainTextResponse`. + + **FastAPI** преЎПставляет тПт же `starlette.responses`, чтП О `fastapi.responses`, прПстП Ўля уЎПбства разрабПтчОка. ОЎМакП бПльшОМствП ЎПступМых ПтветПв пПступает МепПсреЎствеММП Оз Starlette. + +### ИспПльзуйте телП `RequestValidationError` + +ОшОбка `RequestValidationError` сПЎержОт пПлучеММПе `телП` с МеЎПпустОЌыЌО ЎаММыЌО. + +Вы ЌПжете ОспПльзПвать егП прО разрабПтке прОлПжеМОя Ўля регОстрацОО тела О егП ПтлаЎкО, вПзврата пПльзПвателю О т.ÐŽ. + +```Python hl_lines="14" +{!../../../docs_src/handling_errors/tutorial005.py!} +``` + +Теперь пПпрПбуйте ПтправОть МеЎействОтельМый элеЌеМт, МапрОЌер: + +```JSON +{ + "title": "towel", + "size": "XL" +} +``` + +Вы пПлучОте Птвет П тПЌ, чтП ЎаММые МеЎействОтельМы, сПЎержащОй слеЎующее телП: + +```JSON hl_lines="12-15" +{ + "detail": [ + { + "loc": [ + "body", + "size" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ], + "body": { + "title": "towel", + "size": "XL" + } +} +``` + +#### `HTTPException` в FastAPI ОлО в Starlette + +**FastAPI** ОЌеет сПбствеММый `HTTPException`. + +Класс ПшОбПк **FastAPI** `HTTPException` МаслеЎует Пт класса ПшОбПк Starlette `HTTPException`. + +ЕЎОМствеММПе ПтлОчОе заключается в тПЌ, чтП `HTTPException` Пт **FastAPI** пПзвПляет ЎПбавлять загПлПвкО, кПтПрые буЎут включеМы в Птвет. + +ОМ МеПбхПЎОЌ/ОспПльзуется вМутрО сОстеЌы Ўля OAuth 2.0 О МекПтПрых утОлОт безПпасМПстО. + +ТакОЌ ПбразПЌ, вы ЌПжете прПЎПлжать вызывать `HTTPException` Пт **FastAPI** как ПбычМП в свПеЌ кПЎе. + +НП кПгЎа вы регОстрОруете ПбрабПтчОк ОсключеМОй, вы ЎПлжМы зарегОстрОрПвать егП Ўля `HTTPException` Пт Starlette. + +ТакОЌ ПбразПЌ, еслО какая-лОбП часть вМутреММегП кПЎа Starlette, расшОреМОе ОлО плагОМ Starlette вызПвет ОсключеМОе Starlette `HTTPException`, ваш ПбрабПтчОк сЌПжет перехватОть О ПбрабПтать егП. + +В ЎаММПЌ прОЌере, чтПбы ОЌеть вПзЌПжМПсть ОспПльзПвать Пба `HTTPException` в ПЎМПЌ кПЎе, ОсключеМОя Starlette переОЌеМПваМы в `StarletteHTTPException`: + +```Python +from starlette.exceptions import HTTPException as StarletteHTTPException +``` + +### ПереОспПльзПваМОе ПбрабПтчОкПв ОсключеМОй **FastAPI** + +ЕслО вы хПтОте ОспПльзПвать ОсключеМОе вЌесте с теЌО же ПбрабПтчОкаЌО ОсключеМОй пП уЌПлчаМОю Оз **FastAPI**, вы ЌПжете ОЌпПртОрПвать О пПвтПрМП ОспПльзПвать ПбрабПтчОкО ОсключеМОй пП уЌПлчаМОю Оз `fastapi.exception_handlers`: + +```Python hl_lines="2-5 15 21" +{!../../../docs_src/handling_errors/tutorial006.py!} +``` + +В этПЌ прОЌере вы прПстП `вывПЎОте в терЌОМал` ПшОбку с ПчеМь выразОтельМыЌ сППбщеМОеЌ, МП ОЎея ваЌ пПМятМа. Вы ЌПжете ОспПльзПвать ОсключеМОе, а затеЌ прПстП пПвтПрМП ОспПльзПвать стаМЎартМые ПбрабПтчОкО ОсключеМОй. From ccdc96293683a2e44237a500f4cb4740784a8f17 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:56:42 +0000 Subject: [PATCH 102/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a1ee0f0cf..6a261712f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-updates.md`. PR [#10373](https://github.com/tiangolo/fastapi/pull/10373) by [@AlertRED](https://github.com/AlertRED). * 🌐 Russian translation: updated `fastapi-people.md`.. PR [#10255](https://github.com/tiangolo/fastapi/pull/10255) by [@NiKuma0](https://github.com/NiKuma0). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/index.md`. PR [#5798](https://github.com/tiangolo/fastapi/pull/5798) by [@3w36zj6](https://github.com/3w36zj6). * 🌐 Add German translation for `docs/de/docs/advanced/generate-clients.md`. PR [#10725](https://github.com/tiangolo/fastapi/pull/10725) by [@nilslindemann](https://github.com/nilslindemann). From cc9c448ed45b544b32bb5e59efc5091f0b52db3b Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:57:19 +0000 Subject: [PATCH 103/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6a261712f..a5f76de0b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/encoder.md`. PR [#10374](https://github.com/tiangolo/fastapi/pull/10374) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-updates.md`. PR [#10373](https://github.com/tiangolo/fastapi/pull/10373) by [@AlertRED](https://github.com/AlertRED). * 🌐 Russian translation: updated `fastapi-people.md`.. PR [#10255](https://github.com/tiangolo/fastapi/pull/10255) by [@NiKuma0](https://github.com/NiKuma0). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/index.md`. PR [#5798](https://github.com/tiangolo/fastapi/pull/5798) by [@3w36zj6](https://github.com/3w36zj6). From 0fb326fc6ed21d94647822a9dee949abcb538ec6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 13:58:04 +0000 Subject: [PATCH 104/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a5f76de0b..4ccedda1d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/handling-errors.md`. PR [#10375](https://github.com/tiangolo/fastapi/pull/10375) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/encoder.md`. PR [#10374](https://github.com/tiangolo/fastapi/pull/10374) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-updates.md`. PR [#10373](https://github.com/tiangolo/fastapi/pull/10373) by [@AlertRED](https://github.com/AlertRED). * 🌐 Russian translation: updated `fastapi-people.md`.. PR [#10255](https://github.com/tiangolo/fastapi/pull/10255) by [@NiKuma0](https://github.com/NiKuma0). From 9060c427a6deb883bc07df16ae9b573d2e6585d3 Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Tue, 23 Jan 2024 17:00:11 +0300 Subject: [PATCH 105/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/security/first-steps.md`=20(?= =?UTF-8?q?#10541)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/security/first-steps.md | 232 ++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 docs/ru/docs/tutorial/security/first-steps.md diff --git a/docs/ru/docs/tutorial/security/first-steps.md b/docs/ru/docs/tutorial/security/first-steps.md new file mode 100644 index 000000000..b70a60a38 --- /dev/null +++ b/docs/ru/docs/tutorial/security/first-steps.md @@ -0,0 +1,232 @@ +# БезПпасМПсть - первые шагО + +ПреЎставОЌ, чтП у вас есть свПй **бэкеМЎ** API Ма МекПтПрПЌ ЎПЌеМе. + +И у вас есть **фрПМтеМЎ** Ма ЎругПЌ ЎПЌеМе ОлО Ма ЎругПЌ путО тПгП же ЎПЌеМа (ОлО в ЌПбОльМПЌ прОлПжеМОО). + +И вы хПтОте ОЌеть вПзЌПжМПсть аутеМтОфОкацОО фрПМтеМЎа с бэкеМЎПЌ, ОспПльзуя **ОЌя пПльзПвателя** О **парПль**. + +Мы ЌПжеЌ ОспПльзПвать **OAuth2** Ўля сПзЎаМОя такПй сОстеЌы с пПЌПщью **FastAPI**. + +НП Ўавайте ОзбавОЌ вас Пт МеПбхПЎОЌПстО чОтать всю ЎлОММую спецОфОкацОю, чтПбы МайтО те МебПльшОе кусПчкО ОМфПрЌацОО, кПтПрые ваЌ МужМы. + +Для рабПты с безПпасМПстью вПспПльзуеЌся среЎстваЌО, преЎПставлеММыЌО **FastAPI**. + +## Как этП выгляЎОт + +Давайте сМачала прПстП вПспПльзуеЌся кПЎПЌ О пПсЌПтрОЌ, как ПМ рабПтает, а затеЌ ЎетальМП разберёЌ, чтП прПОсхПЎОт. + +## СПзЎаМОе `main.py` + +СкПпОруйте прОЌер в файл `main.py`: + +=== "Python 3.9+" + + ```Python + {!> ../../../docs_src/security/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python + {!> ../../../docs_src/security/tutorial001_an.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "ППЎсказка" + ПреЎпПчтОтельМее ОспПльзПвать версОю с аММПтацОей, еслО этП вПзЌПжМП. + + ```Python + {!> ../../../docs_src/security/tutorial001.py!} + ``` + + +## Запуск + +!!! info "ДПпПлМОтельМая ОМфПрЌацОя" + ВМачале, устаМПвОте бОблОПтеку `python-multipart`. + + А ОЌеММП: `pip install python-multipart`. + + ЭтП связаМП с теЌ, чтП **OAuth2** ОспПльзует "ЎаММые фПрЌы" Ўля переЎачО `ОЌеМО пПльзПвателя` О `парПля`. + +ЗапустОте ваш сервер: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +## ПрПверка + +ПерейЎОте к ОМтерактОвМПй ЎПкуЌеМтацОО пП аЎресу: http://127.0.0.1:8000/docs. + +Вы увОЎОте прОЌерМП слеЎующее: + + + +!!! check "КМПпка автПрОзацОО!" + У вас уже пПявОлась МПвая кМПпка "Authorize". + + А у *ПперацОО путО* теперь пПявОлся ЌалеМькОй заЌПчек в правПЌ верхМеЌ углу, Ма кПтПрый ЌПжМП Мажать. + +ПрО МажатОО Ма Мее пПявляется МебПльшая фПрЌа автПрОзацОО, в кПтПрую МужМП ввестО `ОЌя пПльзПвателя` О `парПль` (О ЎругОе МеПбязательМые пПля): + + + +!!! note "ТехМОческОе ЎеталО" + НеважМП, чтП вы ввеЎете в фПрЌу, ПМа пПка Ме буЎет рабПтать. НП Ќы к этПЌу еще прОЎеЌ. + +КПМечМП, этП Ме фрПМтеМЎ Ўля кПМечМых пПльзПвателей, МП этП ПтлОчМый автПЌатОческОй ОМструЌеМт Ўля ОМтерактОвМПгП ЎПкуЌеМтОрПваМОя всех вашОх API. + +ОМ ЌПжет ОспПльзПваться кПЌаМЎПй фрПМтеМЎа (кПтПрПй ЌПжете быть О вы саЌО). + +ОМ ЌПжет быть ОспПльзПваМ стПрПММОЌО прОлПжеМОяЌО О сОстеЌаЌО. + +КрПЌе тПгП, егП ЌПжМП ОспПльзПвать саЌПстПятельМП Ўля ПтлаЎкО, прПверкО О тестОрПваМОя ПЎМПгП О тПгП же прОлПжеМОя. + +## АутеМтОфОкацОя пП парПлю + +Теперь Ўавайте верМеЌся МеЌМПгП МазаЎ О разбереЌся, чтП же этП такПе. + +АутеМтОфОкацОя пП парПлю является ПЎМОЌ Оз спПсПбПв, ПпреЎелеММых в OAuth2, Ўля ПбеспечеМОя безПпасМПстО О аутеМтОфОкацОО. + +OAuth2 был разрабПтаМ Ўля тПгП, чтПбы бэкэМЎ ОлО API былО МезавОсОЌы Пт сервера, кПтПрый аутеМтОфОцОрует пПльзПвателя. + +НП в МашеЌ случае ПЎМП О тП же прОлПжеМОе **FastAPI** буЎет рабПтать с API О аутеМтОфОкацОей. + +Итак, рассЌПтрОЌ егП с этПй упрПщеММПй тПчкО зреМОя: + +* ППльзПватель ввПЎОт Ма фрПМтеМЎе `ОЌя пПльзПвателя` О `парПль` О МажОЌает `Enter`. +* ЀрПМтеМЎ (рабПтающОй в браузере пПльзПвателя) Птправляет этО `ОЌя пПльзПвателя` О `парПль` Ма ПпреЎелеММый URL в МашеЌ API (ПбъявлеММый с пПЌПщью параЌетра `tokenUrl="token"`). +* API прПверяет этО `ОЌя пПльзПвателя` О `парПль` О выЎает в Птвет "тПкеМ" (Ќы еще Ме реалОзПвалО МОчегП Оз этПгП). + * "ТПкеМ" - этП прПстП стрПка с МекПтПрыЌ сПЎержОЌыЌ, кПтПрПе Ќы ЌПжеЌ ОспПльзПвать пПзже Ўля верОфОкацОО пПльзПвателя. + * ОбычМП срПк ЎействОя тПкеМа Остекает через МекПтПрПе вреЌя. + * ТакОЌ ПбразПЌ, пПльзПвателю прОЎется сМПва вПйтО в сОстеЌу в какПй-тП ЌПЌеМт вреЌеМО. + * И еслО тПкеМ буЎет украЎеМ, тП рОск буЎет ЌеМьше, так как ПМ Ме пПхПж Ма пПстПяММый ключ, кПтПрый буЎет рабПтать вечМП (в бПльшОМстве случаев). +* ЀрПМтеМЎ вреЌеММП храМОт этПт тПкеМ в какПЌ-тП Ќесте. +* ППльзПватель щелкает Ќышью Ма фрПМтеМЎе, чтПбы перейтО в ЎругПй разЎел Ма фрПМтеМЎе. +* ЀрПМтеМЎу МеПбхПЎОЌП пПлучОть ЎПпПлМОтельМые ЎаММые Оз API. + * НП Ўля этПгП МеПбхПЎОЌа аутеМтОфОкацОя Ўля кПМкретМПй кПМечМПй тПчкО. + * ППэтПЌу Ўля аутеМтОфОкацОО в МашеЌ API ПМ пПсылает загПлПвПк `Authorization` сП зМачеМОеЌ `Bearer` плюс саЌ тПкеМ. + * ЕслО тПкеМ сПЎержОт `foobar`, тП сПЎержаМОе загПлПвка `Authorization` буЎет такОЌ: `Bearer foobar`. + +## Класс `OAuth2PasswordBearer` в **FastAPI** + +**FastAPI** преЎПставляет МескПлькП среЎств Ма разМых урПвМях абстракцОО Ўля реалОзацОО этОх фуМкцОй безПпасМПстО. + +В ЎаММПЌ прОЌере Ќы буЎеЌ ОспПльзПвать **OAuth2**, с аутеМтОфОкацОей пП парПлю, ОспПльзуя тПкеМ **Bearer**. Для этПгП Ќы ОспПльзуеЌ класс `OAuth2PasswordBearer`. + +!!! info "ДПпПлМОтельМая ОМфПрЌацОя" + ТПкеМ "bearer" - Ме еЎОМствеММый варОаМт, МП Ўля МашегП случая ПМ является МаОлучшОЌ. + + И этП ЌПжет быть лучшОЌ варОаМтПЌ Ўля бПльшОМства случаев ОспПльзПваМОя, еслО тПлькП вы Ме являетесь экспертПЌ в ПбластО OAuth2 О тПчМП зМаете, пПчеЌу ваЌ лучше пПЎхПЎОт какПй-тП ЎругПй варОаМт. + + В этПЌ случае **FastAPI** также преЎПставляет ОМструЌеМты Ўля егП реалОзацОО. + +ПрО сПзЎаМОО экзеЌпляра класса `OAuth2PasswordBearer` Ќы переЎаеЌ в МегП параЌетр `tokenUrl`. ЭтПт параЌетр сПЎержОт URL, кПтПрый клОеМт (фрПМтеМЎ, рабПтающОй в браузере пПльзПвателя) буЎет ОспПльзПвать Ўля ПтправкО `ОЌеМО пПльзПвателя` О `парПля` с целью пПлучеМОя тПкеМа. + +=== "Python 3.9+" + + ```Python hl_lines="8" + {!> ../../../docs_src/security/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="7" + {!> ../../../docs_src/security/tutorial001_an.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "ППЎсказка" + ПреЎпПчтОтельМее ОспПльзПвать версОю с аММПтацОей, еслО этП вПзЌПжМП. + + ```Python hl_lines="6" + {!> ../../../docs_src/security/tutorial001.py!} + ``` + +!!! tip "ППЎсказка" + ЗЎесь `tokenUrl="token"` ссылается Ма ПтМПсОтельМый URL `token`, кПтПрый Ќы еще Ме сПзЎалО. ППскПльку этП ПтМПсОтельМый URL, ПМ эквОвалеМтеМ `./token`. + + ППскПльку Ќы ОспПльзуеЌ ПтМПсОтельМый URL, еслО ваш API распПлПжеМ пП аЎресу `https://example.com/`, тП ПМ буЎет ссылаться Ма `https://example.com/token`. ЕслО же ваш API распПлПжеМ пП аЎресу `https://example.com/api/v1/`, тП ПМ буЎет ссылаться Ма `https://example.com/api/v1/token`. + + ИспПльзПваМОе ПтМПсОтельМПгП URL важМП Ўля тПгП, чтПбы ваше прОлПжеМОе прПЎПлжалП рабПтать Ўаже в такОх слПжМых случаях, как ПМП МахПЎОтся [за прПксО-серверПЌ](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. + +ЭтПт параЌетр Ме сПзЎает кПМечМую тПчку / *ПперацОю путО*, а Пбъявляет, чтП URL `/token` буЎет такОЌ, кПтПрый клОеМт ЎПлжеМ ОспПльзПвать Ўля пПлучеМОя тПкеМа. Эта ОМфПрЌацОя ОспПльзуется в OpenAPI, а затеЌ в ОМтерактОвМых сОстеЌах ЎПкуЌеМтацОО API. + +ВскПре Ќы сПзЎаЎОЌ О саЌу ПперацОю путО. + +!!! info "ДПпПлМОтельМая ОМфПрЌацОя" + ЕслО вы ПчеМь стрПгОй "пОтПМОст", тП ваЌ ЌПжет Ме пПМравОться стОль МазваМОя параЌетра `tokenUrl` вЌестП `token_url`. + + ЭтП связаМП с теЌ, чтП тут ОспПльзуется тП же ОЌя, чтП О в спецОфОкацОО OpenAPI. ТакОЌ ПбразПЌ, еслО ваЌ МеПбхПЎОЌП бПлее пПЎрПбМП ОзучОть какую-лОбП Оз этОх схеЌ безПпасМПстО, вы ЌПжете прПстП ОспПльзПвать кПпОрПваМОе/вставку, чтПбы МайтО ЎПпПлМОтельМую ОМфПрЌацОю П Мей. + +ПереЌеММая `oauth2_scheme` является экзеЌплярПЌ `OAuth2PasswordBearer`, МП ПМа также является "вызываеЌПй". + +Ее ЌПжМП вызвать слеЎующОЌ ПбразПЌ: + +```Python +oauth2_scheme(some, parameters) +``` + +ППэтПЌу ее ЌПжМП ОспПльзПвать вЌесте с `Depends`. + +### ИспПльзПваМОе + +Теперь вы ЌПжете переЎать ваш `oauth2_scheme` в завОсОЌПсть с пПЌПщью `Depends`. + +=== "Python 3.9+" + + ```Python hl_lines="12" + {!> ../../../docs_src/security/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="11" + {!> ../../../docs_src/security/tutorial001_an.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "ППЎсказка" + ПреЎпПчтОтельМее ОспПльзПвать версОю с аММПтацОей, еслО этП вПзЌПжМП. + + ```Python hl_lines="10" + {!> ../../../docs_src/security/tutorial001.py!} + ``` + +Эта завОсОЌПсть буЎет преЎПставлять `стрПку`, кПтПрая прОсваОвается параЌетру `token` в *фуМкцОО ПперацОО путО*. + +**FastAPI** буЎет зМать, чтП ПМ ЌПжет ОспПльзПвать эту завОсОЌПсть Ўля ПпреЎелеМОя "схеЌы безПпасМПстО" в схеЌе OpenAPI (О автПЌатОческПй ЎПкуЌеМтацОО пП API). + +!!! info "ТехМОческОе ЎеталО" + **FastAPI** буЎет зМать, чтП ПМ ЌПжет ОспПльзПвать класс `OAuth2PasswordBearer` (ПбъявлеММый в завОсОЌПстО) Ўля ПпреЎелеМОя схеЌы безПпасМПстО в OpenAPI, пПскПльку ПМ МаслеЎуется Пт `fastapi.security.oauth2.OAuth2`, кПтПрый, в свПю ПчереЎь, МаслеЎуется Пт `fastapi.security.base.SecurityBase`. + + Все утОлОты безПпасМПстО, ОМтегрОруеЌые в OpenAPI (О автПЌатОческая ЎПкуЌеМтацОя пП API), МаслеЎуются Пт `SecurityBase`, пПэтПЌу **FastAPI** ЌПжет зМать, как ОМтегрОрПвать Ох в OpenAPI. + +## ЧтП ПМ Ўелает + +ОМ буЎет Оскать в запрПсе загПлПвПк `Authorization` О прПверять, сПЎержОт лО ПМ зМачеМОе `Bearer` с МекПтПрыЌ тПкеМПЌ, О вПзвращать тПкеМ в вОЎе `стрПкО`. + +ЕслО ПМ Ме вОЎОт загПлПвка `Authorization` ОлО зМачеМОе Ме ОЌеет тПкеМа `Bearer`, тП в Птвет буЎет выЎаМа ПшОбка с кПЎПЌ сПстПяМОя 401 (`UNAUTHORIZED`). + +Для вПзврата ПшОбкО Ўаже Ме МужМП прПверять, существует лО тПкеМ. Вы ЌПжете быть увереМы, чтП еслО ваша фуМкцОя буЎет выпПлМОлась, тП в этПЌ тПкеМе есть `стрПка`. + +ПрПверОть этП ЌПжМП уже сейчас в ОМтерактОвМПй ЎПкуЌеМтацОО: + + + +Мы пПка Ме прПверяеЌ валОЎМПсть тПкеМа, МП Ўля Мачала МеплПхП. + +## РезюЌе + +ТакОЌ ПбразПЌ, всегП за 3-4 ЎПпПлМОтельМые стрПкО вы пПлучаете Мекую прОЌОтОвМую фПрЌу защОты. From a56d32c3a463eb83173d01bb42eac46511e98952 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:01:38 +0000 Subject: [PATCH 106/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4ccedda1d..1a0f15d30 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/first-steps.md`. PR [#10541](https://github.com/tiangolo/fastapi/pull/10541) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/handling-errors.md`. PR [#10375](https://github.com/tiangolo/fastapi/pull/10375) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/encoder.md`. PR [#10374](https://github.com/tiangolo/fastapi/pull/10374) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-updates.md`. PR [#10373](https://github.com/tiangolo/fastapi/pull/10373) by [@AlertRED](https://github.com/AlertRED). From 0ec0df50906a2fcb30e6c96c7206b185e61a3de4 Mon Sep 17 00:00:00 2001 From: DoHyun Kim Date: Tue, 23 Jan 2024 23:02:49 +0900 Subject: [PATCH 107/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/security/get-current-user.md`?= =?UTF-8?q?=20(#5737)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/security/get-current-user.md | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 docs/ko/docs/tutorial/security/get-current-user.md diff --git a/docs/ko/docs/tutorial/security/get-current-user.md b/docs/ko/docs/tutorial/security/get-current-user.md new file mode 100644 index 000000000..ce944b16d --- /dev/null +++ b/docs/ko/docs/tutorial/security/get-current-user.md @@ -0,0 +1,151 @@ +# 현재 사용자 가젞였Ʞ + +읎전 장에서 (의졎성 죌입 시슀템을 Ʞ반윌로 한)볎안 시슀템은 *겜로 작동 핚수*에서 `str`로 `token`을 제공했습니닀: + +```Python hl_lines="10" +{!../../../docs_src/security/tutorial001.py!} +``` + +귞러나 아직도 유용하지 않습니닀. + +현재 사용자륌 제공하도록 합시닀. + +## 유저 몚덞 생성하Ʞ + +뚌저 Pydantic 유저 몚덞을 만듀얎 볎겠습니닀. + +Pydantic을 사용하여 볞묞을 선얞하는 것곌 같은 방식윌로 닀륞 곳에서 사용할 수 있습니닀. + +=== "파읎썬 3.7 읎상" + + ```Python hl_lines="5 12-16" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +=== "파읎썬 3.10 읎상" + + ```Python hl_lines="3 10-14" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +## `get_current_user` 의졎성 생성하Ʞ + +의졎성 `get_current_user`륌 만듀얎 뎅시닀. + +의졎성읎 하위 의졎성을 가질 수 있닀는 것을 Ʞ억하십니까? + +`get_current_user`는 읎전에 생성한 것곌 동음한 `oauth2_scheme`곌 종속성을 갖게 됩니닀. + +읎전에 *겜로 동작*에서 직접 수행했던 것곌 동음하게 새 종속성 `get_current_user`는 하위 종속성 `oauth2_scheme`에서 `str`로 `token`을 수신합니닀. + +=== "파읎썬 3.7 읎상" + + ```Python hl_lines="25" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +=== "파읎썬 3.10 읎상" + + ```Python hl_lines="23" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +## 유저 가젞였Ʞ + +`get_current_user`는 토큰을 `str`로 췚하고 Pydantic `User` 몚덞을 반환하는 우늬가 만든 (가짜) 유틞늬티 핚수륌 사용합니닀. + +=== "파읎썬 3.7 읎상" + + ```Python hl_lines="19-22 26-27" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +=== "파읎썬 3.10 읎상" + + ```Python hl_lines="17-20 24-25" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +## 현재 유저 죌입하Ʞ + +읎제 *겜로 작동*에서 `get_current_user`와 동음한 `Depends`륌 사용할 수 있습니닀. + +=== "파읎썬 3.7 읎상" + + ```Python hl_lines="31" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +=== "파읎썬 3.10 읎상" + + ```Python hl_lines="29" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +Pydantic 몚덞읞 `User`로 `current_user`의 타입을 선얞하는 것을 알아알 합니닀. + +읎것은 몚든 완료 및 타입 검사륌 통핎 핚수 낎부에서 우늬륌 도욞 것입니닀. + +!!! 팁 + 요청 볞묞도 Pydantic 몚덞로 선얞된닀는 것을 Ʞ억할 것입니닀. + + 여Ʞ서 **FastAPI**는 `Depends`륌 사용하고 있Ʞ 때묞에 혌동되지 않습니닀. + +!!! 확읞 + 읎 의졎성 시슀템읎 섀계된 방식은 몚두 `User` 몚덞을 반환하는 닀양한 의졎성(닀륞 "의졎적읞")을 가질 수 있도록 합니닀. + + 핎당 타입의 데읎터륌 반환할 수 있는 의졎성읎 하나만 있는 것윌로 제한되지 않습니닀. + +## 닀륞 몚덞 + +읎제 *겜로 작동 핚수*에서 현재 사용자륌 직접 가젞올 수 있윌며 `Depends`륌 사용하여 **의졎성 죌입** 수쀀에서 볎안 메컀니슘을 처늬할 수 있습니닀. + +귞늬고 볎안 요구 사항에 대한 몚든 몚덞 또는 데읎터륌 사용할 수 있습니닀(읎 겜우 Pydantic 몚덞 `User`). + +귞러나 음부 특정 데읎터 몚덞, 큎래슀 또는 타입을 사용하도록 제한되지 않습니닀. + +몚덞에 `id`와 `email`읎 있고 `username`읎 없Ꞟ 원하십니까? 맞습니닀. 읎듀은 동음한 도구륌 사용할 수 있습니닀. + +`str`만 갖고 싶습니까? 아니멎 귞냥 `dict`륌 갖고 싶습니까? 아니멎 데읎터베읎슀 큎래슀 몚덞 읞슀턎슀륌 직접 갖고 싶습니까? 귞듀은 몚두 같은 방식윌로 작동합니닀. + +싀제로 애플늬쌀읎션에 로귞읞하는 사용자가 없지만 액섞슀 토큰만 있는 로뎇, 뮇 또는 Ʞ타 시슀템읎 있습니까? 닀시 말하지만 몚두 동음하게 작동합니닀. + +애플늬쌀읎션에 필요한 몚든 종류의 몚덞, 몚든 종류의 큎래슀, 몚든 종류의 데읎터베읎슀륌 사용하십시였. **FastAPI**는 의졎성 죌입 시슀템을 닀룚었습니닀. + +## 윔드 사읎슈 + +읎 예는 장황핎 볎음 수 있습니닀. 동음한 파음에서 볎안, 데읎터 몚덞, 유틞늬티 Ʞ능 및 *겜로 작동*을 혌합하고 있음을 엌두에 두십시였. + +귞러나 읎게 킀포읞튞입니닀. + +볎안곌 종속성 죌입 항목을 한 번만 작성하멎 됩니닀. + +귞늬고 원하는 만큌 복잡하게 만듀 수 있습니닀. 귞래도 유연성곌 핚께 한 곳에 한 번에 작성할 수 있습니닀. + +귞러나 동음한 볎안 시슀템을 사용하여 수천 개의 엔드포읞튞(*겜로 작동*)륌 가질 수 있습니닀. + +귞늬고 ê·žë“€ 몚두(또는 원하는 부분)는 읎러한 의졎성 또는 생성한 닀륞 의졎성을 재사용하는 읎점을 얻을 수 있습니닀. + +귞늬고 읎 수천 개의 *겜로 작동*은 몚두 3쀄 정도로 쀄음 수 있습니닀. + +=== "파읎썬 3.7 읎상" + + ```Python hl_lines="30-32" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +=== "파읎썬 3.10 읎상" + + ```Python hl_lines="28-30" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +## 요앜 + +읎제 *겜로 작동 핚수*에서 현재 사용자륌 직접 가젞올 수 있습니닀. + +우늬는 읎믞 읎듀 사읎에 있습니닀. + +사용자/큎띌읎얞튞가 싀제로 `username`곌 `password`륌 볎낎렀멎 *겜로 작동*을 추가하Ʞ만 하멎 됩니닀. + +닀음 장을 확읞핎 뎅시닀. From 058044fdb148d6af6a90fbd13001c6423209569e Mon Sep 17 00:00:00 2001 From: Kani Kim Date: Tue, 23 Jan 2024 23:04:27 +0900 Subject: [PATCH 108/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/features.md`=20(#10976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/features.md | 203 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 docs/ko/docs/features.md diff --git a/docs/ko/docs/features.md b/docs/ko/docs/features.md new file mode 100644 index 000000000..42a3ff172 --- /dev/null +++ b/docs/ko/docs/features.md @@ -0,0 +1,203 @@ +--- +hide: + - navigation +--- + +# Ʞ능 + +## FastAPI의 Ʞ능 + +**FastAPI**는 닀음곌 같은 Ʞ능을 제공합니닀: + +### 개방형 표쀀을 Ʞ반윌로 + +* 겜로작동, 맀개변수, 볞묞 요청, 볎안 ê·ž 왞의 선얞을 포핚한 API 생성을 위한 OpenAPI +* JSON Schema (OpenAPI 자첎가 JSON Schema륌 Ʞ반윌로 하고 있습니닀)륌 사용한 자동 데읎터 몚덞 묞서화. +* 닚순히 떠올렀서 덧붙읞 Ʞ능읎 아닙니닀. 섞심한 검토륌 거친 후, 읎러한 표쀀을 Ʞ반윌로 섀계되었습니닀. +* 읎는 또한 닀양한 얞얎로 자동적읞 **큎띌읎얞튞 윔드 생성**을 사용할 수 있게 지원합니닀. + +### 묞서 자동화 + +대화형 API 묞서와 웹 탐색 유저 읞터페읎슀륌 제공합니닀. 프레임워크가 OpenAPI륌 Ʞ반윌로 하Ʞ에, 2가지 옵션읎 Ʞ볞적윌로 듀얎간 여러 옵션읎 졎재합니닀. + +* 대화형 탐색 Swagger UI륌 읎용핎, 람띌우저에서 바로 여러분의 API륌 혞출하거나 테슀튞할 수 있습니닀. + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* ReDoc을 읎용핎 API 묞서화륌 대첎할 수 있습니닀. + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### ê·žì € 현대 파읎썬 + +(Pydantic 덕분에) FastAPI는 표쀀 **파읎썬 3.6 타입** 선얞에 Ʞ반하고 있습니닀. 새로 ë°°ìšž 묞법읎 없습니닀. ê·žì € 표쀀적읞 현대 파읎썬입니닀. + +만앜 여러분읎 파읎썬 타입을 얎떻게 사용하는지에 대한 2분 정도의 복습읎 필요하닀멎 (비록 여러분읎 FastAPI륌 사용하지 않는닀 하더띌도), 닀음의 짧은 자습서륌 확읞하섞요: [파읎썬 타입](python-types.md){.internal-link target=\_blank}. + +여러분은 타입을 읎용한 표쀀 파읎썬을 닀음곌 같읎 적을 수 있습니닀: + +```Python +from datetime import date + +from pydantic import BaseModel + +# 변수륌 str로 ì„ ì–ž +# ê·ž 후 핚수 안에서 펞집Ʞ 지원을 받윌섞요 +def main(user_id: str): + return user_id + + +# Pydantic 몚덞 +class User(BaseModel): + id: int + name: str + joined: date +``` + +위의 윔드는 닀음곌 같읎 사용될 수 있습니닀: + +```Python +my_user: User = User(id=3, name="John Doe", joined="2018-07-19") + +second_user_data = { + "id": 4, + "name": "Mary", + "joined": "2018-11-30", +} + +my_second_user: User = User(**second_user_data) +``` + +!!! 정볎 + `**second_user_data`가 뜻하는 것: + + `second_user_data` 딕셔너늬의 킀와 값을 í‚€-값 읞자로서 바로 넘겚쀍니닀. 닀음곌 동음합니닀: `User(id=4, name="Mary", joined="2018-11-30")` + +### 펞집Ʞ 지원 + +몚든 프레임워크는 사용하Ʞ 쉜고 직ꎀ적윌로 섀계되었윌며, 좋은 개발 겜험을 볎장하Ʞ 위핎 개발을 시작하Ʞ도 전에 몚든 결정듀은 여러 펞집Ʞ에서 테슀튞됩니닀. + +최귌 파읎썬 개발자 섀묞조사에서 "자동 완성"읎 가장 많읎 사용되는 Ʞ능읎띌는 것읎 밝혀졌습니닀. + +**FastAPI** 프레임워크의 몚든 부분은 읎륌 충족하Ʞ 위핎 섀계되었습니닀. 자동완성은 얎느 곳에서나 작동합니닀. + +여러분은 묞서로 닀시 돌아올 음읎 거의 없을 겁니닀. + +닀음은 펞집Ʞ가 얎떻게 여러분을 도와죌는지 볎여쀍니닀: + +* Visual Studio Code에서: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +* PyCharm에서: + +![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) + +여러분읎 읎전에 불가능하닀고 고렀했던 윔드도 완성할 수 있을 겁니닀. 예륌 듀얎, 요청에서 전달되는 (쀑첩될 수도 있는)JSON 볞묞 낎부에 있는 `price` 킀입니닀. + +잘못된 í‚€ 읎늄을 적을 음도, 묞서륌 왔닀 갔닀할 음도 없윌며, 혹은 마지막윌로 `username` 또는 `user_name`을 사용했는지 ì°Ÿêž° 위핎 위 아래로 슀크례할 음도 없습니닀. + +### 토막 정볎 + +얎느 곳에서나 선택적 구성읎 가능한 몚든 것에 합늬적읞 Ʞ볞값읎 섀정되얎 있습니닀. 몚든 맀개변수는 여러분읎 필요하거나, 원하는 API륌 정의하Ʞ 위핎 믞섞하게 조정할 수 있습니닀. + +하지만 Ʞ볞적윌로 몚든 것읎 "귞냥 작동합니닀". + +### 검슝 + +* 닀음을 포핚한, 대부분의 (혹은 몚든?) 파읎썬 **데읎터 타입** 검슝할 수 있습니닀: + * JSON 객첎 (`dict`). + * 아읎템 타입을 정의하는 JSON ë°°ì—Ž (`list`). + * 최소 Ꞟ읎와 최대 Ꞟ읎륌 정의하는 묞자엎 (`str`) 필드. + * 최솟값곌 최댓값을 가지는 숫자 (`int`, `float`), ê·ž 왞. + +* 닀음곌 같읎 더욱 읎색적읞 타입에 대핮 검슝할 수 있습니닀: + * URL. + * 읎메음. + * UUID. + * ...닀륞 것듀. + +몚든 검슝은 견고하멎서 잘 확늜된 **Pydantic**에 의핎 처늬됩니닀. + +### 볎안곌 읞슝 + +볎안곌 읞슝읎 통합되얎 있습니닀. 데읎터베읎슀나 데읎터 몚덞곌의 타협없읎 사용할 수 있습니닀. + +닀음을 포핚하는, 몚든 볎안 슀킀마가 OpenAPI에 정의되얎 있습니닀. + +* HTTP Basic. +* **OAuth2** (**JWT tokens** 또한 포핚). [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=\_blank}에 있는 자습서륌 확읞핎 볎섞요. +* 닀음에 듀얎 있는 API í‚€: + * 헀더. + * 맀개변수. + * ì¿ í‚€ 및 ê·ž 왞. + +추가적윌로 (**섞션 ì¿ í‚€**륌 포핚한) 몚든 볎안 Ʞ능은 Starlette에 있습니닀. + +몚두 재사용할 수 있는 도구와 컎포넌튞로 만듀얎젞 있얎 여러분의 시슀템, 데읎터 저장소, ꎀ계형 및 NoSQL 데읎터베읎슀 등곌 쉜게 통합할 수 있습니닀. + +### 의졎성 죌입 + +FastAPI는 사용하Ʞ 맀우 간펞하지만, 엄청난 의졎성 죌입시슀템을 포핚하고 있습니닀. + +* 의졎성은 의졎성을 가질수도 있얎, 읎륌 통핎 의졎성의 계잵읎나 **의졎성의 "귞래프"**륌 형성합니닀. +* 몚든 것읎 프레임워크에 의핎 **자동적윌로 처늬됩니닀**. +* 몚든 의졎성은 요청에서 데읎터륌 요구하여 자동 묞서화와 **겜로 작동 제앜을 강화할 수 있습니닀**. +* 의졎성에서 정의된 _겜로 작동_ 맀개변수에 대핎서도 **자동 검슝**읎 읎룚얎 집니닀. +* 복잡한 사용자의 읞슝 시슀템, **데읎터베읎슀 연결**, 등등을 지원합니닀. +* 데읎터베읎슀, 프론튞엔드 등곌 ꎀ렚되얎 **타협하지 않아도 됩니닀**. 하지만 ê·ž 몚든 것곌 쉜게 통합읎 가능합니닀. + +### 제한 없는 "플러귞읞" + +또는 닀륞 방법윌로, 귞것듀을 사용할 필요 없읎 필요한 윔드만 임포튞할 수 있습니닀. + +얎느 통합도 (의졎성곌 핚께) 사용하Ʞ 쉜게 섀계되얎 있얎, *겜로 작동*에 사용된 것곌 동음한 구조와 묞법을 사용하여 2쀄의 윔드로 여러분의 얎플늬쌀읎션에 사용할 "플러귞읞"을 만듀 수 있습니닀. + +### 테슀튞 결곌 + +* 100% 테슀튞 범위. +* 100% 타입읎 명시된 윔드 베읎슀. +* 상용 얎플늬쌀읎션에서의 사용. + +## Starlette Ʞ능 + +**FastAPI**는 Starlette륌 Ʞ반윌로 구축되었윌며, 읎와 완전히 혞환됩니닀. 따띌서, 여러분읎 볎유하고 있는 ì–Žë–€ 추가적읞 Starlette 윔드도 작동할 것입니닀. + +`FastAPI`는 싀제로 `Starlette`의 하위 큎래슀입니닀. 귞래서, 여러분읎 읎믞 Starlette을 알고 있거나 사용하고 있윌멎, 대부분의 Ʞ능읎 같은 방식윌로 작동할 것입니닀. + +**FastAPI**륌 사용하멎 여러분은 **Starlette**의 Ʞ능 대부분을 얻게 될 것입니닀(FastAPI가 닚순히 Starlette륌 강화했Ʞ 때묞입니닀): + +* 아죌 읞상적읞 성능. 읎는 **NodeJS**와 **Go**와 동등하게 사용 가능한 가장 빠륞 파읎썬 프레임워크 쀑 하나입니닀. +* **WebSocket** 지원. +* 프로섞슀 낎의 백귞띌욎드 작업. +* 시작곌 종료 읎벀튞. +* HTTPX êž°ë°˜ 테슀튞 큎띌읎얞튞. +* **CORS**, GZip, 정적 파음, 슀튞늬밍 응답. +* **섞션곌 ì¿ í‚€** 지원. +* 100% 테슀튞 범위. +* 100% 타입읎 명시된 윔드 베읎슀. + +## Pydantic Ʞ능 + +**FastAPI**는 Pydantic을 Ʞ반윌로 하며 Pydantic곌 완벜하게 혞환됩니닀. 귞래서 얎느 추가적읞 Pydantic 윔드륌 여러분읎 가지고 있든 작동할 것입니닀. + +Pydantic을 Ʞ반윌로 하는, 데읎터베읎슀륌 위한 ORM, ODM을 포핚한 왞부 띌읎람러늬륌 포핚합니닀. + +읎는 몚든 것읎 자동윌로 검슝되Ʞ 때묞에, 많은 겜우에서 요청을 통핎 얻은 동음한 객첎륌, **직접 데읎터베읎슀로** 넘겚쀄 수 있습니닀. + +반대로도 마찬가지읎며, 많은 겜우에서 여러분은 **직접 큎띌읎얞튞로** ê·žì € 객첎륌 넘겚쀄 수 있습니닀. + +**FastAPI**륌 사용하멎 (몚든 데읎터 처늬륌 위핎 FastAPI가 Pydantic을 Ʞ반윌로 하Ʞ 있Ʞ에) **Pydantic**의 몚든 Ʞ능을 얻게 됩니닀: + +* **얎렵지 않은 ì–žì–Ž**: + * 새로욎 슀킀마 정의 마읎크로 얞얎륌 배우지 않아도 됩니닀. + * 여러분읎 파읎썬 타입을 안닀멎, 여러분은 Pydantic을 얎떻게 사용하는지 아는 겁니닀. +* 여러분의 **IDE/며터/뇌**와 잘 얎욞늜니닀: + * Pydantic 데읎터 구조는 닚순 여러분읎 정의한 큎래슀의 읞슀턎슀읎Ʞ 때묞에, 자동 완성, 며팅, mypy 귞늬고 여러분의 직ꎀ까지 여러분의 검슝된 데읎터와 올바륎게 작동합니닀. +* **복잡한 구조**륌 검슝합니닀: + * 계잵적읞 Pydantic 몚덞, 파읎썬 `typing`의 `List`와 `Dict`, ê·ž 왞륌 사용합니닀. + * 귞늬고 검슝자는 복잡한 데읎터 슀킀마륌 명확하고 쉜게 정의 및 확읞하며 JSON 슀킀마로 묞서화합니닀. + * 여러분은 깊게 **쀑첩된 JSON** 객첎륌 가질 수 있윌며, 읎 객첎 몚두 검슝하고 섀명을 붙음 수 있습니닀. +* **확장 가능성**: + * Pydantic은 사용자 정의 데읎터 타입을 정의할 수 있게 하거나, 검슝자 데윔레읎터가 붙은 몚덞의 메소드륌 사용하여 검슝을 확장할 수 있습니닀. +* 100% 테슀튞 범위. From 3351674918894ac32cf041972b76e841c77efb1a Mon Sep 17 00:00:00 2001 From: Kani Kim Date: Tue, 23 Jan 2024 23:05:09 +0900 Subject: [PATCH 109/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/help/index.md`=20(#10983)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/help/index.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/ko/docs/help/index.md diff --git a/docs/ko/docs/help/index.md b/docs/ko/docs/help/index.md new file mode 100644 index 000000000..fc023071a --- /dev/null +++ b/docs/ko/docs/help/index.md @@ -0,0 +1,3 @@ +# 도움 + +도움을 죌고 받고, Ʞ여하고, 찞여합니닀. 🀝 From aa3ed353b3219b32095eeeceb77dfc5d4fd7c582 Mon Sep 17 00:00:00 2001 From: Matteo Date: Tue, 23 Jan 2024 15:06:33 +0100 Subject: [PATCH 110/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Italian=20translat?= =?UTF-8?q?ion=20for=20`docs/it/docs/index.md`=20(#5233)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/it/docs/index.md | 464 ++++++++++++++++++++++++++++++++++++++++++ docs/it/mkdocs.yml | 1 + 2 files changed, 465 insertions(+) create mode 100644 docs/it/docs/index.md create mode 100644 docs/it/mkdocs.yml diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md new file mode 100644 index 000000000..6190eb6aa --- /dev/null +++ b/docs/it/docs/index.md @@ -0,0 +1,464 @@ + +{!../../../docs/missing-translation.md!} + + +

+ FastAPI +

+

+ FastAPI framework, alte prestazioni, facile da imparare, rapido da implementare, pronto per il rilascio in produzione +

+

+ + Build Status + + + Coverage + + + Package version + +

+ +--- + +**Documentazione**: https://fastapi.tiangolo.com + +**Codice Sorgente**: https://github.com/tiangolo/fastapi + +--- + +FastAPI Ú un web framework moderno e veloce (a prestazioni elevate) che serve a creare API con Python 3.6+ basato sulle annotazioni di tipo di Python. + +Le sue caratteristiche principali sono: + +* **Velocità**: Prestazioni molto elevate, alla pari di **NodeJS** e **Go** (grazie a Starlette e Pydantic). [Uno dei framework Python più veloci in circolazione](#performance). +* **Veloce da programmare**: Velocizza il lavoro consentendo il rilascio di nuove funzionalità tra il 200% e il 300% più rapidamente. * +* **Meno bug**: Riduce di circa il 40% gli errori che commettono gli sviluppatori durante la scrittura del codice. * +* **Intuitivo**: Grande supporto per gli editor di testo con autocompletamento in ogni dove. In questo modo si può dedicare meno tempo al debugging. +* **Facile**: Progettato per essere facile da usare e imparare. Si riduce il tempo da dedicare alla lettura della documentazione. +* **Sintentico**: Minimizza la duplicazione di codice. Molteplici funzionalità, ognuna con la propria dichiarazione dei parametri. Meno errori. +* **Robusto**: Crea codice pronto per la produzione con documentazione automatica interattiva. +* **Basato sugli standard**: Basato su (e completamente compatibile con) gli open standard per le API: OpenAPI (precedentemente Swagger) e JSON Schema. + +* Stima basata sull'esito di test eseguiti su codice sorgente di applicazioni rilasciate in produzione da un team interno di sviluppatori. + +## Sponsor + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +Altri sponsor + +## Recensioni + +"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, e Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_I’m over the moon excited about **FastAPI**. It’s so fun!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" + +"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +## **Typer**, la FastAPI delle CLI + + + +Se stai sviluppando un'app CLI da usare nel terminale invece che una web API, ti consigliamo **Typer**. + +**Typer** Ú il fratello minore di FastAPI. Ed Ú stato ideato per essere la **FastAPI delle CLI**. ⌚ 🚀 + +## Requisiti + +Python 3.6+ + +FastAPI Ú basata su importanti librerie: + +* Starlette per le parti web. +* Pydantic per le parti dei dati. + +## Installazione + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +Per il rilascio in produzione, sarà necessario un server ASGI come Uvicorn oppure Hypercorn. + +
+ +```console +$ pip install uvicorn[standard] + +---> 100% +``` + +
+ +## Esempio + +### Crea un file + +* Crea un file `main.py` con: + +```Python +from fastapi import FastAPI +from typing import Optional + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: str = Optional[None]): + return {"item_id": item_id, "q": q} +``` + +
+Oppure usa async def... + +Se il tuo codice usa `async` / `await`, allora usa `async def`: + +```Python hl_lines="7 12" +from fastapi import FastAPI +from typing import Optional + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} +``` + +**Nota**: + +e vuoi approfondire, consulta la sezione _"In a hurry?"_ su `async` e `await` nella documentazione. + +
+ +### Esegui il server + +Puoi far partire il server così: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+Informazioni sul comando uvicorn main:app --reload... + +Vediamo il comando `uvicorn main:app` in dettaglio: + +* `main`: il file `main.py` (il "modulo" Python). +* `app`: l'oggetto creato dentro `main.py` con la riga di codice `app = FastAPI()`. +* `--reload`: ricarica il server se vengono rilevati cambiamenti del codice. Usalo solo durante la fase di sviluppo. + +
+ +### Testa l'API + +Apri il browser all'indirizzo http://127.0.0.1:8000/items/5?q=somequery. + +Vedrai la seguente risposta JSON: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +Hai appena creato un'API che: + +* Riceve richieste HTTP sui _paths_ `/` and `/items/{item_id}`. +* Entrambi i _paths_ accettano`GET` operations (conosciuti anche come HTTP _methods_). +* Il _path_ `/items/{item_id}` ha un _path parameter_ `item_id` che deve essere un `int`. +* Il _path_ `/items/{item_id}` ha una `str` _query parameter_ `q`. + +### Documentazione interattiva dell'API + +Adesso vai all'indirizzo http://127.0.0.1:8000/docs. + +Vedrai la documentazione interattiva dell'API (offerta da Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Documentazione interattiva alternativa + +Adesso accedi all'url http://127.0.0.1:8000/redoc. + +Vedrai la documentazione interattiva dell'API (offerta da ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## Esempio più avanzato + +Adesso modifica il file `main.py` per ricevere un _body_ da una richiesta `PUT`. + +Dichiara il _body_ usando le annotazioni di tipo standard di Python, grazie a Pydantic. + +```Python hl_lines="2 7-10 23-25" +from fastapi import FastAPI +from pydantic import BaseModel +from typing import Optional + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: bool = Optional[None] + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Optional[str] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +Il server dovrebbe ricaricarsi in automatico (perché hai specificato `--reload` al comando `uvicorn` lanciato precedentemente). + +### Aggiornamento della documentazione interattiva + +Adesso vai su http://127.0.0.1:8000/docs. + +* La documentazione interattiva dell'API verrà automaticamente aggiornata, includendo il nuovo _body_: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* Fai click sul pulsante "Try it out", che ti permette di inserire i parametri per interagire direttamente con l'API: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Successivamente, premi sul pulsante "Execute". L'interfaccia utente comunicherà con la tua API, invierà i parametri, riceverà i risultati della richiesta, e li mostrerà sullo schermo: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Aggiornamento della documentazione alternativa + +Ora vai su http://127.0.0.1:8000/redoc. + +* Anche la documentazione alternativa dell'API mostrerà il nuovo parametro della query e il _body_: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### Riepilogo + +Ricapitolando, Ú sufficiente dichiarare **una sola volta** i tipi dei parametri, del body, ecc. come parametri di funzioni. + +Questo con le annotazioni per i tipi standard di Python. + +Non c'Ú bisogno di imparare una nuova sintassi, metodi o classi specifici a una libreria, ecc. + +È normalissimo **Python 3.6+**. + +Per esempio, per un `int`: + +```Python +item_id: int +``` + +o per un modello `Item` più complesso: + +```Python +item: Item +``` + +...e con quella singola dichiarazione hai in cambio: + +* Supporto per gli editor di testo, incluso: + * Autocompletamento. + * Controllo sulle annotazioni di tipo. +* Validazione dei dati: + * Errori chiari e automatici quando i dati sono invalidi. + * Validazione anche per gli oggetti JSON più complessi. +* Conversione dei dati di input: da risorse esterne a dati e tipi di Python. È possibile leggere da: + * JSON. + * Path parameters. + * Query parameters. + * Cookies. + * Headers. + * Form. + * File. +* Conversione dei dati di output: converte dati e tipi di Python a dati per la rete (come JSON): + * Converte i tipi di Python (`str`, `int`, `float`, `bool`, `list`, ecc). + * Oggetti `datetime`. + * Oggetti `UUID`. + * Modelli del database. + * ...e molto di più. +* Generazione di una documentazione dell'API interattiva, con scelta dell'interfaccia grafica: + * Swagger UI. + * ReDoc. + +--- + +Tornando al precedente esempio, **FastAPI**: + +* Validerà che esiste un `item_id` nel percorso delle richieste `GET` e `PUT`. +* Validerà che `item_id` sia di tipo `int` per le richieste `GET` e `PUT`. + * Se non lo Ú, il client vedrà un errore chiaro e utile. +* Controllerà se ci sia un parametro opzionale chiamato `q` (per esempio `http://127.0.0.1:8000/items/foo?q=somequery`) per le richieste `GET`. + * Siccome il parametro `q` Ú dichiarato con `= None`, Ú opzionale. + * Senza il `None` sarebbe stato obbligatorio (come per il body della richiesta `PUT`). +* Per le richieste `PUT` su `/items/{item_id}`, leggerà il body come JSON, questo comprende: + * verifica che la richiesta abbia un attributo obbligatorio `name` e che sia di tipo `str`. + * verifica che la richiesta abbia un attributo obbligatorio `price` e che sia di tipo `float`. + * verifica che la richiesta abbia un attributo opzionale `is_offer` e che sia di tipo `bool`, se presente. + * Tutto questo funzionerebbe anche con oggetti JSON più complessi. +* Convertirà *da* e *a* JSON automaticamente. +* Documenterà tutto con OpenAPI, che può essere usato per: + * Sistemi di documentazione interattivi. + * Sistemi di generazione di codice dal lato client, per molti linguaggi. +* Fornirà 2 interfacce di documentazione dell'API interattive. + +--- + +Questa Ú solo la punta dell'iceberg, ma dovresti avere già un'idea di come il tutto funzioni. + +Prova a cambiare questa riga di codice: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...da: + +```Python + ... "item_name": item.name ... +``` + +...a: + +```Python + ... "item_price": item.price ... +``` + +...e osserva come il tuo editor di testo autocompleterà gli attributi e sarà in grado di riconoscere i loro tipi: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +Per un esempio più completo che mostra più funzionalità del framework, consulta Tutorial - Guida Utente. + +**Spoiler alert**: il tutorial - Guida Utente include: + +* Dichiarazione di **parameters** da altri posti diversi come: **headers**, **cookies**, **form fields** e **files**. +* Come stabilire **vincoli di validazione** come `maximum_length` o `regex`. +* Un sistema di **Dependency Injection** facile da usare e molto potente. +e potente. +* Sicurezza e autenticazione, incluso il supporto per **OAuth2** con **token JWT** e autenticazione **HTTP Basic**. +* Tecniche più avanzate (ma ugualmente semplici) per dichiarare **modelli JSON altamente nidificati** (grazie a Pydantic). +* E altre funzionalità (grazie a Starlette) come: + * **WebSockets** + * **GraphQL** + * test molto facili basati su `requests` e `pytest` + * **CORS** + * **Cookie Sessions** + * ...e altro ancora. + +## Prestazioni + +Benchmark indipendenti di TechEmpower mostrano che **FastAPI** basato su Uvicorn Ú uno dei framework Python più veloci in circolazione, solamente dietro a Starlette e Uvicorn (usate internamente da FastAPI). (*) + +Per approfondire, consulta la sezione Benchmarks. + +## Dipendenze opzionali + +Usate da Pydantic: + +* ujson - per un "parsing" di JSON più veloce. +* email_validator - per la validazione di email. + +Usate da Starlette: + +* requests - Richiesto se vuoi usare il `TestClient`. +* aiofiles - Richiesto se vuoi usare `FileResponse` o `StaticFiles`. +* jinja2 - Richiesto se vuoi usare la configurazione template di default. +* python-multipart - Richiesto se vuoi supportare il "parsing" con `request.form()`. +* itsdangerous - Richiesto per usare `SessionMiddleware`. +* pyyaml - Richiesto per il supporto dello `SchemaGenerator` di Starlette (probabilmente non ti serve con FastAPI). +* graphene - Richiesto per il supporto di `GraphQLApp`. +* ujson - Richiesto se vuoi usare `UJSONResponse`. + +Usate da FastAPI / Starlette: + +* uvicorn - per il server che carica e serve la tua applicazione. +* orjson - ichiesto se vuoi usare `ORJSONResponse`. + +Puoi installarle tutte con `pip install fastapi[all]`. + +## Licenza + +Questo progetto Ú concesso in licenza in base ai termini della licenza MIT. diff --git a/docs/it/mkdocs.yml b/docs/it/mkdocs.yml new file mode 100644 index 000000000..de18856f4 --- /dev/null +++ b/docs/it/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml From f021ccb9058429641aa6400db83eb37717d5827f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:09:28 +0000 Subject: [PATCH 111/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 1a0f15d30..66faea43b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/get-current-user.md`. PR [#5737](https://github.com/tiangolo/fastapi/pull/5737) by [@KdHyeon0661](https://github.com/KdHyeon0661). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/first-steps.md`. PR [#10541](https://github.com/tiangolo/fastapi/pull/10541) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/handling-errors.md`. PR [#10375](https://github.com/tiangolo/fastapi/pull/10375) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/encoder.md`. PR [#10374](https://github.com/tiangolo/fastapi/pull/10374) by [@AlertRED](https://github.com/AlertRED). From 6d46b60cb3a84a1746e7aec36cf22bec5f495860 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:09:56 +0000 Subject: [PATCH 112/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 66faea43b..94e1b062e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/features.md`. PR [#10976](https://github.com/tiangolo/fastapi/pull/10976) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/get-current-user.md`. PR [#5737](https://github.com/tiangolo/fastapi/pull/5737) by [@KdHyeon0661](https://github.com/KdHyeon0661). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/first-steps.md`. PR [#10541](https://github.com/tiangolo/fastapi/pull/10541) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/handling-errors.md`. PR [#10375](https://github.com/tiangolo/fastapi/pull/10375) by [@AlertRED](https://github.com/AlertRED). From 189f679f9babaa1c31e6661d861f82601fc98173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:10:30 +0300 Subject: [PATCH 113/222] =?UTF-8?q?=F0=9F=8C=90=20Update=20Turkish=20trans?= =?UTF-8?q?lation=20for=20`docs/tr/docs/benchmarks.md`=20(#11005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/benchmarks.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/tr/docs/benchmarks.md b/docs/tr/docs/benchmarks.md index 1ce3c758f..eb5472869 100644 --- a/docs/tr/docs/benchmarks.md +++ b/docs/tr/docs/benchmarks.md @@ -1,34 +1,34 @@ # Kıyaslamalar -Bağımsız TechEmpower kıyaslamaları gösteriyor ki Uvicorn'la beraber çalışan **FastAPI** uygulamaları Python'un en hızlı frameworklerinden birisi , sadece Starlette ve Uvicorn'dan daha dÌşÌk sıralamada (FastAPI bu frameworklerin ÃŒzerine kurulu). (*) +Bağımsız TechEmpower kıyaslamaları gösteriyor ki en hızlı Python frameworklerinden birisi olan Uvicorn ile çalıştırılan **FastAPI** uygulamaları, sadece Starlette ve Uvicorn'dan daha dÌşÌk sıralamada (FastAPI bu frameworklerin ÃŒzerine kurulu) yer alıyor. (*) Fakat kıyaslamaları ve karşılaştırmaları incelerken şunları aklınızda bulundurmalısınız. -## Kıyaslamalar ve hız +## Kıyaslamalar ve Hız -Kıyaslamaları incelediğinizde, farklı özelliklere sahip birçok araçların eşdeğer olarak karşılaştırıldığını görmek yaygındır. +Kıyaslamaları incelediğinizde, farklı özelliklere sahip araçların eşdeğer olarak karşılaştırıldığını yaygın bir şekilde görebilirsiniz. -Özellikle, Uvicorn, Starlette ve FastAPI'ın birlikte karşılaştırıldığını görmek için (diğer birçok araç arasında). +Özellikle, (diğer birçok araç arasında) Uvicorn, Starlette ve FastAPI'ın birlikte karşılaştırıldığını görebilirsiniz. -Araç tarafından çözÃŒlen sorun ne kadar basitse, o kadar iyi performans alacaktır. Ve kıyaslamaların çoğu, araç tarafından sağlanan ek özellikleri test etmez. +Aracın çözdÌğÌ problem ne kadar basitse, performansı o kadar iyi olacaktır. Ancak kıyaslamaların çoğu, aracın sağladığı ek özellikleri test etmez. Hiyerarşi şöyledir: * **Uvicorn**: bir ASGI sunucusu - * **Starlette**: (Uvicorn'u kullanır) bir web microframeworkÃŒ - * **FastAPI**: (Starlette'i kullanır) data validation vb. ile API'lar oluşturmak için çeşitli ek özelliklere sahip bir API frameworkÃŒ + * **Starlette**: (Uvicorn'u kullanır) bir web mikroframeworkÃŒ + * **FastAPI**: (Starlette'i kullanır) veri doğrulama vb. çeşitli ek özelliklere sahip, API oluşturmak için kullanılan bir API mikroframeworkÃŒ * **Uvicorn**: - * Sunucunun kendisi dışında ekstra bir kod içermediği için en iyi performansa sahip olacaktır - * Direkt olarak Uvicorn'da bir uygulama yazmazsınız. Bu, en azından Starlette tarafından sağlanan tÃŒm kodu (veya **FastAPI**) az çok içermesi gerektiği anlamına gelir. Ve eğer bunu yaptıysanız, son uygulamanız bir framework kullanmak ve uygulama kodlarını ve bugları en aza indirmekle aynı ek yÃŒke sahip olacaktır. + * Sunucunun kendisi dışında ekstra bir kod içermediği için en iyi performansa sahip olacaktır. + * Doğrudan Uvicorn ile bir uygulama yazmazsınız. Bu, yazdığınız kodun en azından Starlette tarafından sağlanan tÃŒm kodu (veya **FastAPI**) az çok içermesi gerektiği anlamına gelir. Eğer bunu yaptıysanız, son uygulamanız bir framework kullanmak ve uygulama kodlarını ve hataları en aza indirmekle aynı ek yÃŒke sahip olacaktır. * Eğer Uvicorn'u karşılaştırıyorsanız, Daphne, Hypercorn, uWSGI, vb. uygulama sunucuları ile karşılaştırın. * **Starlette**: - * Uvicorn'dan sonraki en iyi performansa sahip olacak. Aslında, Starlette çalışmak için Uvicorn'u kullanıyor. Dolayısıyla, muhtemelen daha fazla kod çalıştırmak zorunda kaldığında Uvicorn'dan sadece "daha yavaş" olabilir. - * Ancak routing based on paths ile vb. basit web uygulamaları oluşturmak için araçlar sağlar. - * Eğer Starlette'i karşılaştırıyorsanız, Sanic, Flask, Django, vb. frameworkler (veya microframeworkler) ile karşılaştırın. + * Uvicorn'dan sonraki en iyi performansa sahip olacaktır. İşin aslı, Starlette çalışmak için Uvicorn'u kullanıyor. Dolayısıyla, daha fazla kod çalıştırmaası gerektiğinden muhtemelen Uvicorn'dan sadece "daha yavaş" olabilir. + * Ancak yol bazlı yönlendirme vb. basit web uygulamaları oluşturmak için araçlar sağlar. + * Eğer Starlette'i karşılaştırıyorsanız, Sanic, Flask, Django, vb. frameworkler (veya mikroframeworkler) ile karşılaştırın. * **FastAPI**: - * Starlette'in Uvicorn'u kullandığı ve ondan daha hızlı olamayacağı gibi, **FastAPI** da Starlette'i kullanır, bu yÃŒzden ondan daha hızlı olamaz. - * FastAPI, Starlette'e ek olarak daha fazla özellik sunar. Data validation ve serialization gibi API'lar oluştururken neredeyse ve her zaman ihtiyaç duyduğunuz özellikler. Ve bunu kullanarak, ÃŒcretsiz olarak otomatik dokÃŒmantasyon elde edersiniz (otomatik dokÃŒmantasyon çalışan uygulamalara ek yÃŒk getirmez, başlangıçta oluşturulur). - * FastAPI'ı kullanmadıysanız ve Starlette'i doğrudan kullandıysanız (veya başka bir araç, Sanic, Flask, Responder, vb.) tÃŒm data validation'ı ve serialization'ı kendiniz sağlamanız gerekir. Dolayısıyla, son uygulamanız FastAPI kullanılarak oluşturulmuş gibi hâlâ aynı ek yÃŒke sahip olacaktır. Çoğu durumda, uygulamalarda yazılan kodun bÃŒyÃŒk çoğunluğunu data validation ve serialization oluşturur. - * Dolayısıyla, FastAPI'ı kullanarak geliştirme sÃŒresinden, buglardan, kod satırlarından tasarruf edersiniz ve muhtemelen kullanmasaydınız aynı performansı (veya daha iyisini) elde edersiniz. (hepsini kodunuza uygulamak zorunda kalacağınız gibi) - * Eğer FastAPI'ı karşılaştırıyorsanız, Flask-apispec, NestJS, Molten, vb. gibi data validation, serialization ve dokÃŒmantasyon sağlayan bir web uygulaması frameworkÃŒ ile (veya araç setiyle) karşılaştırın. Entegre otomatik data validation, serialization ve dokÃŒmantasyon içeren frameworkler. + * Starlette'in Uvicorn'u kullandığı ve ondan daha hızlı olamayacağı gibi, **FastAPI**'da Starlette'i kullanır, dolayısıyla ondan daha hızlı olamaz. + * FastAPI, Starlette'e ek olarak daha fazla özellik sunar. Bunlar veri doğrulama ve dönÌşÌmÃŒ gibi API'lar oluştururken neredeyse ve her zaman ihtiyaç duyduğunuz özelliklerdir. Ve bunu kullanarak, ÃŒcretsiz olarak otomatik dokÃŒmantasyon elde edersiniz (otomatik dokÃŒmantasyon çalışan uygulamalara ek yÃŒk getirmez, başlangıçta oluşturulur). + * FastAPI'ı kullanmadıysanız ve Starlette'i doğrudan kullandıysanız (veya başka bir araç, Sanic, Flask, Responder, vb.) tÃŒm veri doğrulama ve dönÌştÃŒrme araçlarını kendiniz geliştirmeniz gerekir. Dolayısıyla, son uygulamanız FastAPI kullanılarak oluşturulmuş gibi hâlâ aynı ek yÃŒke sahip olacaktır. Çoğu durumda, uygulamalarda yazılan kodun bÃŒyÃŒk bir kısmını veri doğrulama ve dönÌştÃŒrme kodları oluşturur. + * Dolayısıyla, FastAPI'ı kullanarak geliştirme sÃŒresinden, hatalardan, kod satırlarından tasarruf edersiniz ve kullanmadığınız durumda (birçok özelliği geliştirmek zorunda kalmakla birlikte) muhtemelen aynı performansı (veya daha iyisini) elde ederdiniz. + * Eğer FastAPI'ı karşılaştırıyorsanız, Flask-apispec, NestJS, Molten, vb. gibi veri doğrulama, dönÌştÃŒrme ve dokÃŒmantasyon sağlayan bir web uygulaması frameworkÃŒ ile (veya araç setiyle) karşılaştırın. From 9e06513033d881001b04616084348ee6300e98e6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:10:41 +0000 Subject: [PATCH 114/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 94e1b062e..f8c4589c6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/help/index.md`. PR [#10983](https://github.com/tiangolo/fastapi/pull/10983) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/features.md`. PR [#10976](https://github.com/tiangolo/fastapi/pull/10976) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/get-current-user.md`. PR [#5737](https://github.com/tiangolo/fastapi/pull/5737) by [@KdHyeon0661](https://github.com/KdHyeon0661). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/first-steps.md`. PR [#10541](https://github.com/tiangolo/fastapi/pull/10541) by [@AlertRED](https://github.com/AlertRED). From 7586688cc961791afbfc3c568aba2b3fecea27c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:11:15 +0300 Subject: [PATCH 115/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/about/index.md`=20(#11006)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/about/index.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/tr/docs/about/index.md diff --git a/docs/tr/docs/about/index.md b/docs/tr/docs/about/index.md new file mode 100644 index 000000000..e9dee5217 --- /dev/null +++ b/docs/tr/docs/about/index.md @@ -0,0 +1,3 @@ +# Hakkında + +FastAPI, tasarımı, ilham kaynağı ve daha fazlası hakkında. 🀓 From 39cff8d7d6dea15c4b6e767dec5317b949f4e645 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:12:29 +0000 Subject: [PATCH 116/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f8c4589c6..baae05a03 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Italian translation for `docs/it/docs/index.md`. PR [#5233](https://github.com/tiangolo/fastapi/pull/5233) by [@matteospanio](https://github.com/matteospanio). * 🌐 Add Korean translation for `docs/ko/docs/help/index.md`. PR [#10983](https://github.com/tiangolo/fastapi/pull/10983) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/features.md`. PR [#10976](https://github.com/tiangolo/fastapi/pull/10976) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/get-current-user.md`. PR [#5737](https://github.com/tiangolo/fastapi/pull/5737) by [@KdHyeon0661](https://github.com/KdHyeon0661). From 754ea10fcc745975473c10745e543b162a015961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:13:01 +0300 Subject: [PATCH 117/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/help/index.md`=20(#11013)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/help/index.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/tr/docs/help/index.md diff --git a/docs/tr/docs/help/index.md b/docs/tr/docs/help/index.md new file mode 100644 index 000000000..cef0914ce --- /dev/null +++ b/docs/tr/docs/help/index.md @@ -0,0 +1,3 @@ +# Yardım + +Yardım alın, yardım edin, katkıda bulunun, dahil olun. 🀝 From 2341f7210137f4b85b361fd2dfd21a6261d62208 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:15:50 +0000 Subject: [PATCH 118/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index baae05a03..bff875447 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Update Turkish translation for `docs/tr/docs/benchmarks.md`. PR [#11005](https://github.com/tiangolo/fastapi/pull/11005) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Italian translation for `docs/it/docs/index.md`. PR [#5233](https://github.com/tiangolo/fastapi/pull/5233) by [@matteospanio](https://github.com/matteospanio). * 🌐 Add Korean translation for `docs/ko/docs/help/index.md`. PR [#10983](https://github.com/tiangolo/fastapi/pull/10983) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/features.md`. PR [#10976](https://github.com/tiangolo/fastapi/pull/10976) by [@KaniKim](https://github.com/KaniKim). From a12c5db74c6f12d90761356250ff3e2d72d678d4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:16:59 +0000 Subject: [PATCH 119/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index bff875447..09f599436 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/about/index.md`. PR [#11006](https://github.com/tiangolo/fastapi/pull/11006) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Update Turkish translation for `docs/tr/docs/benchmarks.md`. PR [#11005](https://github.com/tiangolo/fastapi/pull/11005) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Italian translation for `docs/it/docs/index.md`. PR [#5233](https://github.com/tiangolo/fastapi/pull/5233) by [@matteospanio](https://github.com/matteospanio). * 🌐 Add Korean translation for `docs/ko/docs/help/index.md`. PR [#10983](https://github.com/tiangolo/fastapi/pull/10983) by [@KaniKim](https://github.com/KaniKim). From 30f1a1c4efbcfb4025090a06b4ac94d29fc0b9b7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 14:19:05 +0000 Subject: [PATCH 120/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 09f599436..0379bd921 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/help/index.md`. PR [#11013](https://github.com/tiangolo/fastapi/pull/11013) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/about/index.md`. PR [#11006](https://github.com/tiangolo/fastapi/pull/11006) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Update Turkish translation for `docs/tr/docs/benchmarks.md`. PR [#11005](https://github.com/tiangolo/fastapi/pull/11005) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Italian translation for `docs/it/docs/index.md`. PR [#5233](https://github.com/tiangolo/fastapi/pull/5233) by [@matteospanio](https://github.com/matteospanio). From 30f31540fc3bfe8725cc1ebee0a440c4812539c9 Mon Sep 17 00:00:00 2001 From: mojtaba <121169359+mojtabapaso@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:36:11 +0330 Subject: [PATCH 121/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Persian=20translat?= =?UTF-8?q?ion=20for=20`docs/fa/docs/tutorial/security/index.md`=20(#9945)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fa/docs/tutorial/security/index.md | 100 ++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 docs/fa/docs/tutorial/security/index.md diff --git a/docs/fa/docs/tutorial/security/index.md b/docs/fa/docs/tutorial/security/index.md new file mode 100644 index 000000000..4e68ba961 --- /dev/null +++ b/docs/fa/docs/tutorial/security/index.md @@ -0,0 +1,100 @@ +# امنیت + +رو؎‌های مختلفی ؚرای مدیریت امنیت، تأیید هویت و اعتؚارسنجی وجود دارد. + +عموماً این یک موضوع ٟیچیده و "سخت" است. + +در ؚسیاری از فریم ورک ها و سیستم‌ها، فقط مدیریت امنیت و تأیید هویت نیاز ØšÙ‡ تلا؎ و کد نویسی زیادی دارد (در ؚسیاری از موارد می‌تواند 50% یا ؚی؎تر کل کد نو؎ته ؎ده ؚا؎د). + + +فریم ورک **FastAPI** اؚزارهای متعددی را در اختیار ؎ما قرار می دهد تا ØšÙ‡ راحتی، ؚا سرعت، ØšÙ‡ صورت استاندارد و ؚدون نیاز ØšÙ‡ مطالعه و یادگیری همه جز؊یات امنیت، در مدیریت **امنیت** ØšÙ‡ ؎ما کمک کند. + +اما Ù‚ØšÙ„ از آن، ؚیایید ؚرخی از مفاهیم کوچک را ؚررسی کنیم. + +## عجله دارید؟ + +اگر ØšÙ‡ هیچ یک از این اصطلاحات اهمیت نمی دهید و فقط نیاز ØšÙ‡ افزودن امنیت ؚا تأیید هویت ؚر اساس نام کارؚری و رمز عؚور دارید، *همین الان* ØšÙ‡ فصل های ؚعدی ؚروید. + +## ٟروتکل استاندارد OAuth2 + +ٟروتکل استاندارد OAuth2 یک م؎خصه است که چندین رو؎ ؚرای مدیریت تأیید هویت و اعتؚار سنجی تعریف می کند. + +این م؎خصه ؚسیار گسترده است و چندین حالت استفاده ٟیچیده را ٟو؎؎ می دهد. + +در آن رو؎ هایی ؚرای تأیید هویت ؚا استفاده از "ؚرنامه های ؎خص ثالث" وجود دارد. + +این همان چیزی است که تمامی سیستم های ؚا "ورود ؚا فیسؚوک، گوگل، توییتر، گیت هاؚ" در ٟایین آن را استفاده می کنند. + +### ٟروتکل استاندارد OAuth 1 + +ٟروتکل استاندارد OAuth1 نیز وجود دا؎ت که ؚا OAuth2 خیلی متفاوت است و ٟیچیدگی ؚی؎تری دا؎ت، زیرا ؎امل م؎خصات مستقیم در مورد رمزگذاری ارتؚاط ؚود. + +در حال حاضر OAuth1 ؚسیار محؚوؚ یا استفاده ؎ده نیست. + +ٟروتکل استاندارد OAuth2 رو؎ رمزگذاری ارتؚاط را م؎خص نمی کند، ØšÙ„Ú©Ù‡ انت؞ار دارد که ؚرنامه ؎ما ؚا HTTPS سرویس دهی ؎ود. + +!!! نکته + در ؚخ؎ در مورد **استقرار** ، ؎ما یاد خواهید گرفت که چگونه ؚا استفاده از Traefik و Let's Encrypt رایگان HTTPS را راه اندازی کنید. + +## استاندارد OpenID Connect + +استاندارد OpenID Connect، م؎خصه‌ای دیگر است که ؚر ٟایه **OAuth2** ساخته ؎ده است. + +این م؎خصه، ØšÙ‡ گستر؎ OAuth2 می‌ٟردازد و ؚرخی مواردی که در OAuth2 نسؚتاً تردید ؚرانگیز هستند را م؎خص می‌کند تا سعی ؎ود آن را ؚا سایر سیستم‌ها قاؚل ارتؚاط کند. + +ØšÙ‡ عنوان مثال، ورود ØšÙ‡ سیستم گوگل از OpenID Connect استفاده می‌کند (که در زیر از OAuth2 استفاده می‌کند). + +اما ورود ØšÙ‡ سیستم فیسؚوک، از OpenID Connect ٟ؎تیؚانی نمی‌کند. ØšÙ‡ جای آن، نسخه خود؎ از OAuth2 را دارد. + +### استاندارد OpenID (نه "OpenID Connect" ) + +همچنین م؎خصه "OpenID" نیز وجود دا؎ت که سعی در حل مسا؊ل م؎اؚه OpenID Connect دا؎ت، اما ؚر ٟایه OAuth2 ساخته ن؎ده ؚود. + +ؚناؚراین، یک سیستم جداگانه ؚود. + +اکنون این م؎خصه کمتر استفاده می‌؎ود و محؚوؚیت زیادی ندارد. + +## استاندارد OpenAPI + +استاندارد OpenAPI (قؚلاً ؚا نام Swagger ؎ناخته می‌؎د) یک open specification ؚرای ساخت APIs (که در حال حاضر جز؊ی از ؚنیاد لینوکس میؚا؎د) است. + +فریم ورک **FastAPI** ؚر اساس **OpenAPI** است. + +این خاصیت، امکان دارد تا چندین راؚط مستندات تعاملی خودکار(automatic interactive documentation interfaces)، تولید کد و غیره وجود دا؎ته ؚا؎د. + +م؎خصه OpenAPI رو؎ی ؚرای تعریف چندین "schemes" دارد. + +ؚا استفاده از آن‌ها، ؎ما می‌توانید از همه این اؚزارهای مؚتنی ؚر استاندارد استفاده کنید، از جمله این سیستم‌های مستندات تعاملی(interactive documentation systems). + +استاندارد OpenAPI ؎یوه‌های امنیتی زیر را تعریف می‌کند: + +* ؎یوه `apiKey`: یک کلید اختصاصی ؚرای ؚرنامه که می‌تواند از موارد زیر استفاده ؎ود: + * ٟارامتر جستجو. + * هدر. + * کوکی. +* ؎یوه `http`: سیستم‌های استاندارد احراز هویت HTTP، از جمله: + * مقدار `bearer`: یک هدر `Authorization` ؚا مقدار `Bearer` ØšÙ‡ همراه یک توکن. این از OAuth2 ØšÙ‡ ارث ؚرده ؎ده است. + * احراز هویت ٟایه HTTP. + * ویژگی HTTP Digest و غیره. +* ؎یوه `oauth2`: تمام رو؎‌های OAuth2 ؚرای مدیریت امنیت (ØšÙ‡ نام "flows"). + * چندین از این flows ؚرای ساخت یک ارا؊ه‌دهنده احراز هویت OAuth 2.0 مناسؚ هستند (مانند گوگل، فیسؚوک، توییتر، گیت‌هاؚ و غیره): + * ویژگی `implicit` + * ویژگی `clientCredentials` + * ویژگی `authorizationCode` + * اما یک "flow" خاص وجود دارد که می‌تواند ØšÙ‡ طور کامل ؚرای مدیریت احراز هویت در همان ؚرنامه ØšÙ‡ کار رود: + * ؚررسی `password`: چند فصل ؚعدی ØšÙ‡ مثال‌های این مورد خواهیم ٟرداخت. +* ؎یوه `openIdConnect`: یک رو؎ ؚرای تعریف نحوه ک؎ف داده‌های احراز هویت OAuth2 ØšÙ‡ صورت خودکار. + * ک؎ف خودکار این موضوع را که در م؎خصه OpenID Connect تعریف ؎ده است، م؎خص می‌کند. + +!!! نکته + ادغام سایر ارا؊ه‌دهندگان احراز هویت/اجازه‌دهی مانند گوگل، فیسؚوک، توییتر، گیت‌هاؚ و غیره نیز امکان‌ٟذیر و نسؚتاً آسان است. + + Ù…ØŽÚ©Ù„ ٟیچیده‌ترین مس؊له، ساخت یک ارا؊ه‌دهنده احراز هویت/اجازه‌دهی مانند آن‌ها است، اما **FastAPI** اؚزارهای لازم ؚرای انجام این کار را ؚا سهولت ØšÙ‡ ؎ما می‌دهد و همه کارهای سنگین را ؚرای ؎ما انجام می‌دهد. + +## اؚزارهای **FastAPI** + +فریم ورک FastAPI اؚزارهایی ؚرای هر یک از این ؎یوه‌های امنیتی در ماژول`fastapi.security` فراهم می‌کند که استفاده از این مکانیزم‌های امنیتی را ساده‌تر می‌کند. + +در فصل‌های ؚعدی، ؎ما یاد خواهید گرفت که چگونه ؚا استفاده از این اؚزارهای ارا؊ه ؎ده توسط **FastAPI**، امنیت را ØšÙ‡ API خود اضافه کنید. + +همچنین، خواهید دید که چگونه ØšÙ‡ صورت خودکار در سیستم مستندات تعاملی ادغام می‌؎ود. From 9a5181abfcea5cfa6cbaf3439304ec676272ed95 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 15:06:34 +0000 Subject: [PATCH 122/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0379bd921..0755b6826 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Persian translation for `docs/fa/docs/tutorial/security/index.md`. PR [#9945](https://github.com/tiangolo/fastapi/pull/9945) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Add Turkish translation for `docs/tr/docs/help/index.md`. PR [#11013](https://github.com/tiangolo/fastapi/pull/11013) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/about/index.md`. PR [#11006](https://github.com/tiangolo/fastapi/pull/11006) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Update Turkish translation for `docs/tr/docs/benchmarks.md`. PR [#11005](https://github.com/tiangolo/fastapi/pull/11005) by [@hasansezertasan](https://github.com/hasansezertasan). From aae29cac5c1b25722bd5d7ce1796d4930998ca85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:02:27 +0300 Subject: [PATCH 123/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/learn/index.md`=20(#11014)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/learn/index.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/tr/docs/learn/index.md diff --git a/docs/tr/docs/learn/index.md b/docs/tr/docs/learn/index.md new file mode 100644 index 000000000..52e3aa54d --- /dev/null +++ b/docs/tr/docs/learn/index.md @@ -0,0 +1,5 @@ +# Öğren + +**FastAPI** öğrenmek için giriş bölÃŒmleri ve öğreticiler burada yer alıyor. + +Burayı, bir **kitap**, bir **kurs**, ve FastAPI öğrenmenin **resmi** ve önerilen yolu olarak dÌşÌnÃŒlebilirsiniz. 😎 From 6aa521aa03772cea0e9eb0b31f36fb41f8f15991 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 16:02:56 +0000 Subject: [PATCH 124/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0755b6826..7d2dc438f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/learn/index.md`. PR [#11014](https://github.com/tiangolo/fastapi/pull/11014) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/security/index.md`. PR [#9945](https://github.com/tiangolo/fastapi/pull/9945) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Add Turkish translation for `docs/tr/docs/help/index.md`. PR [#11013](https://github.com/tiangolo/fastapi/pull/11013) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/about/index.md`. PR [#11006](https://github.com/tiangolo/fastapi/pull/11006) by [@hasansezertasan](https://github.com/hasansezertasan). From dcf8b24ece34a7aa8f3c28d1e962733aebe97a05 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Tue, 23 Jan 2024 17:04:13 +0100 Subject: [PATCH 125/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/benchmarks.md`=20(#10866)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/benchmarks.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/de/docs/benchmarks.md diff --git a/docs/de/docs/benchmarks.md b/docs/de/docs/benchmarks.md new file mode 100644 index 000000000..6efd56e83 --- /dev/null +++ b/docs/de/docs/benchmarks.md @@ -0,0 +1,34 @@ +# Benchmarks + +UnabhÀngige TechEmpower-Benchmarks zeigen, **FastAPI**-Anwendungen, die unter Uvicorn ausgefÃŒhrt werden, gehören zu den schnellsten existierenden Python-Frameworks, nur Starlette und Uvicorn selbst (intern von FastAPI verwendet) sind schneller. + +Beim Ansehen von Benchmarks und Vergleichen sollten Sie jedoch Folgende Punkte beachten. + +## Benchmarks und Geschwindigkeit + +Wenn Sie sich die Benchmarks ansehen, werden hÀufig mehrere Tools mit unterschiedlichen Eigenschaften als gleichwertig verglichen. + +Konkret geht es darum, Uvicorn, Starlette und FastAPI miteinander zu vergleichen (neben vielen anderen Tools). + +Je einfacher das Problem, welches durch das Tool gelöst wird, desto besser ist die Performanz. Und die meisten Benchmarks testen nicht die zusÀtzlichen Funktionen, welche das Tool bietet. + +Die Hierarchie ist wie folgt: + +* **Uvicorn**: ein ASGI-Server + * **Starlette**: (verwendet Uvicorn) ein Web-Mikroframework + * **FastAPI**: (verwendet Starlette) ein API-Mikroframework mit mehreren zusÀtzlichen Funktionen zum Erstellen von APIs, mit Datenvalidierung, usw. + +* **Uvicorn**: + * Bietet die beste Leistung, da außer dem Server selbst nicht viel zusÀtzlicher Code vorhanden ist. + * Sie wÃŒrden eine Anwendung nicht direkt in Uvicorn schreiben. Das wÃŒrde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten mÃŒsste. Und wenn Sie das tÀten, hÀtte Ihre endgÃŒltige Anwendung den gleichen Overhead wie die Verwendung eines Frameworks nebst Minimierung Ihres Anwendungscodes und der Fehler. + * Wenn Sie Uvicorn vergleichen, vergleichen Sie es mit Anwendungsservern wie Daphne, Hypercorn, uWSGI, usw. +* **Starlette**: + * Wird nach Uvicorn die nÀchstbeste Performanz erbringen. TatsÀchlich nutzt Starlette intern Uvicorn. Daher kann es wahrscheinlich nur „langsamer“ als Uvicorn sein, weil mehr Code ausgefÃŒhrt wird. + * Aber es bietet Ihnen die Tools zum Erstellen einfacher Webanwendungen, mit Routing basierend auf Pfaden, usw. + * Wenn Sie Starlette vergleichen, vergleichen Sie es mit Webframeworks (oder Mikroframeworks) wie Sanic, Flask, Django, usw. +* **FastAPI**: + * So wie Starlette Uvicorn verwendet und nicht schneller als dieses sein kann, verwendet **FastAPI** Starlette, sodass es nicht schneller als dieses sein kann. + * FastAPI bietet zusÀtzlich zu Starlette weitere Funktionen. Funktionen, die Sie beim Erstellen von APIs fast immer benötigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlos automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusÀtzlichen Aufwand fÃŒr laufende Anwendungen, sie wird beim Start generiert). + * Wenn Sie FastAPI nicht, und direkt Starlette (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden wÃŒrden, mÃŒssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hÀtte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wÀre. Und in vielen FÀllen ist diese Datenvalidierung und Serialisierung der größte Teil des in Anwendungen geschriebenen Codes. + * Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und wÃŒrden wahrscheinlich die gleiche Leistung (oder eine bessere) erzielen, die Sie hÀtten, wenn Sie es nicht verwenden wÃŒrden (da Sie alles in Ihrem Code implementieren mÃŒssten). + * Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendung-Framework (oder einer Reihe von Tools), welche Datenvalidierung, Serialisierung und Dokumentation bereitstellen, wie Flask-apispec, NestJS, Molten, usw. – Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation. From 4c077492aec56aba2f0bf6a8b16c7f7212a0382f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 16:04:37 +0000 Subject: [PATCH 126/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7d2dc438f..0a9b35362 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/benchmarks.md`. PR [#10866](https://github.com/tiangolo/fastapi/pull/10866) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Turkish translation for `docs/tr/docs/learn/index.md`. PR [#11014](https://github.com/tiangolo/fastapi/pull/11014) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/security/index.md`. PR [#9945](https://github.com/tiangolo/fastapi/pull/9945) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Add Turkish translation for `docs/tr/docs/help/index.md`. PR [#11013](https://github.com/tiangolo/fastapi/pull/11013) by [@hasansezertasan](https://github.com/hasansezertasan). From 8e9af7932c3ee53a7263044c53b88341f0b87745 Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Tue, 23 Jan 2024 12:31:56 -0500 Subject: [PATCH 127/222] =?UTF-8?q?=F0=9F=94=A7=20Add=20Italian=20to=20`mk?= =?UTF-8?q?docs.yml`=20(#11016)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/mkdocs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index d34e919bd..2b843e026 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -283,6 +283,8 @@ extra: name: hu - magyar - link: /id/ name: id - Bahasa Indonesia + - link: /it/ + name: it - italiano - link: /ja/ name: ja - 日本語 - link: /ko/ From e96e74ad36c77273018e87932ad1de7a19aeb67b Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jan 2024 17:32:19 +0000 Subject: [PATCH 128/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0a9b35362..9e28af40b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -109,6 +109,7 @@ hide: ### Internal +* 🔧 Add Italian to `mkdocs.yml`. PR [#11016](https://github.com/tiangolo/fastapi/pull/11016) by [@alejsdev](https://github.com/alejsdev). * 🔚 Verify `mkdocs.yml` languages in CI, update `docs.py`. PR [#11009](https://github.com/tiangolo/fastapi/pull/11009) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update config in `label-approved.yml` to accept translations with 1 reviewer. PR [#11007](https://github.com/tiangolo/fastapi/pull/11007) by [@alejsdev](https://github.com/alejsdev). * 👷 Add changes-requested handling in GitHub Action issue manager. PR [#10971](https://github.com/tiangolo/fastapi/pull/10971) by [@tiangolo](https://github.com/tiangolo). From 9ee70f82e7691246d78446c0ff04c1e4496bf383 Mon Sep 17 00:00:00 2001 From: Jessica Temporal Date: Thu, 25 Jan 2024 23:53:05 +0900 Subject: [PATCH 129/222] =?UTF-8?q?=F0=9F=93=9D=20Add=20External=20Link:?= =?UTF-8?q?=20Tips=20on=20migrating=20from=20Flask=20to=20FastAPI=20and=20?= =?UTF-8?q?vice-versa=20(#11029)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 00d6f696d..44b064fe9 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -1,5 +1,9 @@ Articles: English: + - author: Jessica Temporal + author_link: https://jtemporal.com/socials + link: https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/ + title: Tips on migrating from Flask to FastAPI and vice-versa - author: Ankit Anchlia author_link: https://linkedin.com/in/aanchlia21 link: https://hackernoon.com/explore-how-to-effectively-use-jwt-with-fastapi @@ -302,6 +306,11 @@ Articles: author_link: https://qiita.com/mtitg link: https://qiita.com/mtitg/items/47770e9a562dd150631d title: FastAPIDB接続しおCRUDするPython補APIサヌバヌを構築 + Portuguese: + - author: Jessica Temporal + author_link: https://jtemporal.com/socials + link: https://jtemporal.com/dicas-para-migrar-de-flask-para-fastapi-e-vice-versa/ + title: Dicas para migrar uma aplicação de Flask para FastAPI e vice-versa Russian: - author: Troy Köhler author_link: https://www.linkedin.com/in/trkohler/ From 9af7f2a5d5e6ce37ecfe2449f645f69881abc953 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 14:53:25 +0000 Subject: [PATCH 130/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9e28af40b..5d31e5261 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Add External Link: Tips on migrating from Flask to FastAPI and vice-versa. PR [#11029](https://github.com/tiangolo/fastapi/pull/11029) by [@jtemporal](https://github.com/jtemporal). * 📝 Deprecate old tutorials: Peewee, Couchbase, encode/databases. PR [#10979](https://github.com/tiangolo/fastapi/pull/10979) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix typo in `fastapi/security/oauth2.py`. PR [#10972](https://github.com/tiangolo/fastapi/pull/10972) by [@RafalSkolasinski](https://github.com/RafalSkolasinski). * 📝 Update `HTTPException` details in `docs/en/docs/tutorial/handling-errors.md`. PR [#5418](https://github.com/tiangolo/fastapi/pull/5418) by [@papb](https://github.com/papb). From e55c7ccbcb723b5d290d29c20df530cfc7df4d72 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Thu, 25 Jan 2024 15:53:41 +0100 Subject: [PATCH 131/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/query-params.md`=20(#10293)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/query-params.md | 226 ++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 docs/de/docs/tutorial/query-params.md diff --git a/docs/de/docs/tutorial/query-params.md b/docs/de/docs/tutorial/query-params.md new file mode 100644 index 000000000..1b9b56bea --- /dev/null +++ b/docs/de/docs/tutorial/query-params.md @@ -0,0 +1,226 @@ +# Query-Parameter + +Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als „Query“-Parameter interpretiert. + +```Python hl_lines="9" +{!../../../docs_src/query_params/tutorial001.py!} +``` + +Query-Parameter (Deutsch: Abfrage-Parameter) sind die SchlÃŒssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen. + +Zum Beispiel sind in der URL: + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +... die Query-Parameter: + +* `skip`: mit dem Wert `0` +* `limit`: mit dem Wert `10` + +Da sie Teil der URL sind, sind sie „naturgemÀß“ Strings. + +Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), werden sie zu diesem Typ konvertiert, und gegen diesen validiert. + +Die gleichen Prozesse, die fÃŒr Pfad-Parameter stattfinden, werden auch auf Query-Parameter angewendet: + +* Editor UnterstÃŒtzung (natÃŒrlich) +* „Parsen“ der Daten +* Datenvalidierung +* Automatische Dokumentation + +## Defaultwerte + +Da Query-Parameter nicht ein festgelegter Teil des Pfades sind, können sie optional sein und Defaultwerte haben. + +Im obigen Beispiel haben sie die Defaultwerte `skip=0` und `limit=10`. + +Wenn Sie also zur URL: + +``` +http://127.0.0.1:8000/items/ +``` + +gehen, so ist das das gleiche wie die URL: + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +Aber wenn Sie zum Beispiel zu: + +``` +http://127.0.0.1:8000/items/?skip=20 +``` + +gehen, werden die Parameter-Werte Ihrer Funktion sein: + +* `skip=20`: da Sie das in der URL gesetzt haben +* `limit=10`: weil das der Defaultwert ist + +## Optionale Parameter + +Auf die gleiche Weise können Sie optionale Query-Parameter deklarieren, indem Sie deren Defaultwert auf `None` setzen: + +=== "Python 3.10+" + + ```Python hl_lines="7" + {!> ../../../docs_src/query_params/tutorial002_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9" + {!> ../../../docs_src/query_params/tutorial002.py!} + ``` + +In diesem Fall wird der Funktionsparameter `q` optional, und standardmÀßig `None` sein. + +!!! check + Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein. + +## Query-Parameter Typkonvertierung + +Sie können auch `bool`-Typen deklarieren und sie werden konvertiert: + +=== "Python 3.10+" + + ```Python hl_lines="7" + {!> ../../../docs_src/query_params/tutorial003_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9" + {!> ../../../docs_src/query_params/tutorial003.py!} + ``` + +Wenn Sie nun zu: + +``` +http://127.0.0.1:8000/items/foo?short=1 +``` + +oder + +``` +http://127.0.0.1:8000/items/foo?short=True +``` + +oder + +``` +http://127.0.0.1:8000/items/foo?short=true +``` + +oder + +``` +http://127.0.0.1:8000/items/foo?short=on +``` + +oder + +``` +http://127.0.0.1:8000/items/foo?short=yes +``` + +gehen, oder zu irgendeiner anderen Variante der Groß-/Kleinschreibung (Alles groß, Anfangsbuchstabe groß, usw.), dann wird Ihre Funktion den Parameter `short` mit dem `bool`-Wert `True` sehen, ansonsten mit dem Wert `False`. + +## Mehrere Pfad- und Query-Parameter + +Sie können mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiß, was welches ist. + +Und Sie mÃŒssen sie auch nicht in einer spezifischen Reihenfolge deklarieren. + +Parameter werden anhand ihres Namens erkannt: + +=== "Python 3.10+" + + ```Python hl_lines="6 8" + {!> ../../../docs_src/query_params/tutorial004_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="8 10" + {!> ../../../docs_src/query_params/tutorial004.py!} + ``` + +## Erforderliche Query-Parameter + +Wenn Sie einen Defaultwert fÃŒr Nicht-Pfad-Parameter deklarieren (Bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich. + +Wenn Sie keinen spezifischen Wert haben wollen, sondern der Parameter einfach optional sein soll, dann setzen Sie den Defaultwert auf `None`. + +Aber wenn Sie wollen, dass ein Query-Parameter erforderlich ist, vergeben Sie einfach keinen Defaultwert: + +```Python hl_lines="6-7" +{!../../../docs_src/query_params/tutorial005.py!} +``` + +Hier ist `needy` ein erforderlicher Query-Parameter vom Typ `str`. + +Wenn Sie in Ihrem Browser eine URL wie: + +``` +http://127.0.0.1:8000/items/foo-item +``` + +... öffnen, ohne den benötigten Parameter `needy`, dann erhalten Sie einen Fehler wie den folgenden: + +```JSON +{ + "detail": [ + { + "type": "missing", + "loc": [ + "query", + "needy" + ], + "msg": "Field required", + "input": null, + "url": "https://errors.pydantic.dev/2.1/v/missing" + } + ] +} +``` + +Da `needy` ein erforderlicher Parameter ist, mÃŒssen Sie ihn in der URL setzen: + +``` +http://127.0.0.1:8000/items/foo-item?needy=sooooneedy +``` + +... Das funktioniert: + +```JSON +{ + "item_id": "foo-item", + "needy": "sooooneedy" +} +``` + +Und natÃŒrlich können Sie einige Parameter als erforderlich, einige mit Defaultwert, und einige als vollstÀndig optional definieren: + +=== "Python 3.10+" + + ```Python hl_lines="8" + {!> ../../../docs_src/query_params/tutorial006_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="10" + {!> ../../../docs_src/query_params/tutorial006.py!} + ``` + +In diesem Fall gibt es drei Query-Parameter: + +* `needy`, ein erforderlicher `str`. +* `skip`, ein `int` mit einem Defaultwert `0`. +* `limit`, ein optionales `int`. + +!!! tip "Tipp" + Sie können auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#vordefinierte-parameterwerte){.internal-link target=_blank}. From 28e679d6dccabce4336901f840f125237f6bed12 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 14:55:49 +0000 Subject: [PATCH 132/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5d31e5261..6434871d8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/query-params.md`. PR [#10293](https://github.com/tiangolo/fastapi/pull/10293) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/benchmarks.md`. PR [#10866](https://github.com/tiangolo/fastapi/pull/10866) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Turkish translation for `docs/tr/docs/learn/index.md`. PR [#11014](https://github.com/tiangolo/fastapi/pull/11014) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/security/index.md`. PR [#9945](https://github.com/tiangolo/fastapi/pull/9945) by [@mojtabapaso](https://github.com/mojtabapaso). From ecee093e340de9221558e06fe34c9d80f2609819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:56:05 +0300 Subject: [PATCH 133/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/how-to/index.md`=20(#11021)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/how-to/index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/tr/docs/how-to/index.md diff --git a/docs/tr/docs/how-to/index.md b/docs/tr/docs/how-to/index.md new file mode 100644 index 000000000..8ece29515 --- /dev/null +++ b/docs/tr/docs/how-to/index.md @@ -0,0 +1,11 @@ +# Nasıl Yapılır - Tarifler + +Burada çeşitli konular hakkında farklı tarifler veya "nasıl yapılır" kılavuzları yer alıyor. + +Bu fikirlerin bÃŒyÃŒk bir kısmı aşağı yukarı **bağımsız** olacaktır, çoğu durumda bunları sadece **projenize** hitap ediyorsa incelemelisiniz. + +Projeniz için ilginç ve yararlı görÃŒnen bir şey varsa devam edin ve inceleyin, aksi halde bunları atlayabilirsiniz. + +!!! tip "İpucu" + + **FastAPI**'ı dÃŒzgÃŒn (ve önerilen) şekilde öğrenmek istiyorsanız [Öğretici - Kullanıcı Rehberi](../tutorial/index.md){.internal-link target=_blank}'ni bölÃŒm bölÃŒm okuyun. From 3e98fb9c8390f068bb6b40bbe12c6abbddaadaed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:57:16 +0300 Subject: [PATCH 134/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/resources/index.md`=20(#11020)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/resources/index.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/tr/docs/resources/index.md diff --git a/docs/tr/docs/resources/index.md b/docs/tr/docs/resources/index.md new file mode 100644 index 000000000..fc71a9ca1 --- /dev/null +++ b/docs/tr/docs/resources/index.md @@ -0,0 +1,3 @@ +# Kaynaklar + +Ek kaynaklar, dış bağlantılar, makaleler ve daha fazlası. ✈ From 01c56c059e71ff1c902bc1b4dcf672a0f6ca7e58 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 14:58:23 +0000 Subject: [PATCH 135/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6434871d8..7e8e8487d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/how-to/index.md`. PR [#11021](https://github.com/tiangolo/fastapi/pull/11021) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add German translation for `docs/de/docs/tutorial/query-params.md`. PR [#10293](https://github.com/tiangolo/fastapi/pull/10293) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/benchmarks.md`. PR [#10866](https://github.com/tiangolo/fastapi/pull/10866) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Turkish translation for `docs/tr/docs/learn/index.md`. PR [#11014](https://github.com/tiangolo/fastapi/pull/11014) by [@hasansezertasan](https://github.com/hasansezertasan). From 06bdf03bcee34761ca94b97c2aa93b4dd01f667c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 14:59:03 +0000 Subject: [PATCH 136/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7e8e8487d..cf9a031ac 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/resources/index.md`. PR [#11020](https://github.com/tiangolo/fastapi/pull/11020) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/how-to/index.md`. PR [#11021](https://github.com/tiangolo/fastapi/pull/11021) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add German translation for `docs/de/docs/tutorial/query-params.md`. PR [#10293](https://github.com/tiangolo/fastapi/pull/10293) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/benchmarks.md`. PR [#10866](https://github.com/tiangolo/fastapi/pull/10866) by [@nilslindemann](https://github.com/nilslindemann). From 5d74e58e952e9286d8352fb9f2e904fad8746f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:59:43 +0300 Subject: [PATCH 137/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/history-design-future.md`=20(#11012)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/history-design-future.md | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 docs/tr/docs/history-design-future.md diff --git a/docs/tr/docs/history-design-future.md b/docs/tr/docs/history-design-future.md new file mode 100644 index 000000000..950fcf37d --- /dev/null +++ b/docs/tr/docs/history-design-future.md @@ -0,0 +1,79 @@ +# Geçmişi, Tasarımı ve Geleceği + +Bir sÃŒre önce, bir **FastAPI** kullanıcısı sordu: + +> Bu projenin geçmişi nedir? Birkaç hafta içinde hiçbir yerden harika bir şeye dönÌşmÌş gibi görÃŒnÃŒyor [...] + +İşte o geçmişin bir kısmı. + +## Alternatifler + +Bir sÃŒredir karmaşık gereksinimlere sahip API'lar oluşturuyor (Makine Öğrenimi, dağıtık sistemler, asenkron işler, NoSQL veritabanları vb.) ve farklı geliştirici ekiplerini yönetiyorum. + +Bu sÃŒreçte birçok alternatifi araştırmak, test etmek ve kullanmak zorunda kaldım. + +**FastAPI**'ın geçmişi, bÃŒyÃŒk ölçÌde önceden geliştirilen araçların geçmişini kapsıyor. + +[Alternatifler](alternatives.md){.internal-link target=_blank} bölÃŒmÃŒnde belirtildiği gibi: + +
+ +Başkalarının daha önceki çalışmaları olmasaydı, **FastAPI** var olmazdı. + +Geçmişte oluşturulan pek çok araç **FastAPI**'a ilham kaynağı olmuştur. + +Yıllardır yeni bir framework oluşturmaktan kaçınıyordum. Başlangıçta **FastAPI**'ın çözdÌğÌ sorunları çözebilmek için pek çok farklı framework, eklenti ve araç kullanmayı denedim. + +Ancak bir noktada, geçmişteki diğer araçlardan en iyi fikirleri alarak bÃŒtÃŒn bu çözÃŒmleri kapsayan, ayrıca bÃŒtÃŒn bunları Python'ın daha önce mevcut olmayan özelliklerini (Python 3.6+ ile gelen tip belirteçleri) kullanarak yapan bir şey ÃŒretmekten başka bir seçenek kalmamıştı. + +
+ +## Araştırma + +Önceki alternatifleri kullanarak hepsinden bir şeyler öğrenip, fikirler alıp, bunları kendim ve çalıştığım geliştirici ekipler için en iyi şekilde birleştirebilme şansım oldu. + +Mesela, ideal olarak standart Python tip belirteçlerine dayanması gerektiği açıktı. + +Ayrıca, en iyi yaklaşım zaten mevcut olan standartları kullanmaktı. + +Sonuç olarak, **FastAPI**'ı kodlamaya başlamadan önce, birkaç ay boyunca OpenAPI, JSON Schema, OAuth2 ve benzerlerinin tanımlamalarını inceledim. İlişkilerini, örtÌştÃŒkleri noktaları ve farklılıklarını anlamaya çalıştım. + +## Tasarım + +Sonrasında, (**FastAPI** kullanan bir geliştirici olarak) sahip olmak istediğim "API"ı tasarlamak için biraz zaman harcadım. + +Çeşitli fikirleri en popÃŒler Python editörlerinde test ettim: PyCharm, VS Code, Jedi tabanlı editörler. + +Bu test, en son Python Developer Survey'ine göre, kullanıcıların yaklaşık %80'inin kullandığı editörleri kapsıyor. + +Bu da demek oluyor ki **FastAPI**, Python geliştiricilerinin %80'inin kullandığı editörlerle test edildi. Ve diğer editörlerin çoğu benzer şekilde çalıştığından, avantajları neredeyse tÃŒm editörlerde çalışacaktır. + +Bu şekilde, kod tekrarını mÃŒmkÃŒn olduğunca azaltmak, her yerde otomatik tamamlama, tip ve hata kontrollerine sahip olmak için en iyi yolları bulabildim. + +Hepsi, tÃŒm geliştiriciler için en iyi geliştirme deneyimini sağlayacak şekilde. + +## Gereksinimler + +Çeşitli alternatifleri test ettikten sonra, avantajlarından dolayı **Pydantic**'i kullanmaya karar verdim. + +Sonra, JSON Schema ile tamamen uyumlu olmasını sağlamak, kısıtlama bildirimlerini tanımlamanın farklı yollarını desteklemek ve birkaç editördeki testlere dayanarak editör desteğini (tip kontrolleri, otomatik tamamlama) geliştirmek için katkıda bulundum. + +Geliştirme sırasında, diğer ana gereksinim olan **Starlette**'e de katkıda bulundum. + +## Geliştirme + +**FastAPI**'ı oluşturmaya başladığımda, parçaların çoğu zaten yerindeydi, tasarım tanımlanmıştı, gereksinimler ve araçlar hazırdı, standartlar ve tanımlamalar hakkındaki bilgi net ve tazeydi. + +## Gelecek + +Şimdiye kadar, **FastAPI**'ın fikirleriyle birçok kişiye faydalı olduğu apaçık ortada. + +Birçok kullanım durumuna daha iyi uyduğu için, önceki alternatiflerin yerine seçiliyor. + +Ben ve ekibim dahil, birçok geliştirici ve ekip projelerinde **FastAPI**'ya bağlı. + +Tabi, geliştirilecek birçok özellik ve iyileştirme mevcut. + +**FastAPI**'ın önÃŒnde harika bir gelecek var. + +[Yardımlarınız](help-fastapi.md){.internal-link target=_blank} çok değerlidir. From 1b01cbe0927d3dc7ababf4d5dd52cc0c4874e296 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 15:03:50 +0000 Subject: [PATCH 138/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index cf9a031ac..b6ac779a8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/history-design-future.md`. PR [#11012](https://github.com/tiangolo/fastapi/pull/11012) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/resources/index.md`. PR [#11020](https://github.com/tiangolo/fastapi/pull/11020) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/how-to/index.md`. PR [#11021](https://github.com/tiangolo/fastapi/pull/11021) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add German translation for `docs/de/docs/tutorial/query-params.md`. PR [#10293](https://github.com/tiangolo/fastapi/pull/10293) by [@nilslindemann](https://github.com/nilslindemann). From d693d0a980eb7aaa3b98ed7731057543493c014c Mon Sep 17 00:00:00 2001 From: Luccas Mateus Date: Thu, 25 Jan 2024 12:05:24 -0300 Subject: [PATCH 139/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/schema-extra-example.md`?= =?UTF-8?q?=20(#4065)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/tutorial/schema-extra-example.md | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 docs/pt/docs/tutorial/schema-extra-example.md diff --git a/docs/pt/docs/tutorial/schema-extra-example.md b/docs/pt/docs/tutorial/schema-extra-example.md new file mode 100644 index 000000000..0355450fa --- /dev/null +++ b/docs/pt/docs/tutorial/schema-extra-example.md @@ -0,0 +1,109 @@ +# Declare um exemplo dos dados da requisição + +Você pode declarar exemplos dos dados que a sua aplicação pode receber. + +Aqui estão várias formas de se fazer isso. + +## `schema_extra` do Pydantic + +Você pode declarar um `example` para um modelo Pydantic usando `Config` e `schema_extra`, conforme descrito em Documentação do Pydantic: Schema customization: + +```Python hl_lines="15-23" +{!../../../docs_src/schema_extra_example/tutorial001.py!} +``` + +Essas informações extras serão adicionadas como se encontram no **JSON Schema** de resposta desse modelo e serão usadas na documentação da API. + +!!! tip "Dica" + Você pode usar a mesma técnica para estender o JSON Schema e adicionar suas próprias informações extras de forma personalizada. + + Por exemplo, você pode usar isso para adicionar metadados para uma interface de usuário de front-end, etc. + +## `Field` de argumentos adicionais + +Ao usar `Field ()` com modelos Pydantic, você também pode declarar informações extras para o **JSON Schema** passando quaisquer outros argumentos arbitrários para a função. + +Você pode usar isso para adicionar um `example` para cada campo: + +```Python hl_lines="4 10-13" +{!../../../docs_src/schema_extra_example/tutorial002.py!} +``` + +!!! warning "Atenção" + Lembre-se de que esses argumentos extras passados ​​não adicionarão nenhuma validação, apenas informações extras, para fins de documentação. + +## `example` e `examples` no OpenAPI + +Ao usar quaisquer dos: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +você também pode declarar um dado `example` ou um grupo de `examples` com informações adicionais que serão adicionadas ao **OpenAPI**. + +### `Body` com `example` + +Aqui nós passamos um `example` dos dados esperados por `Body()`: + +```Python hl_lines="21-26" +{!../../../docs_src/schema_extra_example/tutorial003.py!} +``` + +### Exemplo na UI da documentação + +Com qualquer um dos métodos acima, os `/docs` vão ficar assim: + + + +### `Body` com vários `examples` + +Alternativamente ao único `example`, você pode passar `examples` usando um `dict` com **vários examples**, cada um com informações extras que serão adicionadas no **OpenAPI** também. + +As chaves do `dict` identificam cada exemplo, e cada valor é outro `dict`. + +Cada `dict` de exemplo específico em `examples` pode conter: + +* `summary`: Pequena descrição do exemplo. +* `description`: Uma descrição longa que pode conter texto em Markdown. +* `value`: O próprio exemplo mostrado, ex: um `dict`. +* `externalValue`: alternativa ao `value`, uma URL apontando para o exemplo. Embora isso possa não ser suportado por tantas ferramentas quanto `value`. + +```Python hl_lines="22-48" +{!../../../docs_src/schema_extra_example/tutorial004.py!} +``` + +### Exemplos na UI da documentação + +Com `examples` adicionado a `Body()`, os `/docs` vão ficar assim: + + + +## Detalhes técnicos + +!!! warning "Atenção" + Esses são detalhes muito técnicos sobre os padrões **JSON Schema** e **OpenAPI**. + + Se as ideias explicadas acima já funcionam para você, isso pode ser o suficiente, e você provavelmente não precisa desses detalhes, fique à vontade para pular. + +Quando você adiciona um exemplo dentro de um modelo Pydantic, usando `schema_extra` ou` Field(example="something") `esse exemplo é adicionado ao **JSON Schema** para esse modelo Pydantic. + +E esse **JSON Schema** do modelo Pydantic está incluído no **OpenAPI** da sua API e, em seguida, é usado na UI da documentação. + +O **JSON Schema** na verdade não tem um campo `example` nos padrões. Versões recentes do JSON Schema definem um campo `examples`, mas o OpenAPI 3.0.3 é baseado numa versão mais antiga do JSON Schema que não tinha `examples`. + +Por isso, o OpenAPI 3.0.3 definiu o seu próprio `example` para a versão modificada do **JSON Schema** que é usada, para o mesmo próposito (mas é apenas `example` no singular, não `examples`), e é isso que é usado pela UI da documentação da API(usando o Swagger UI). + +Portanto, embora `example` não seja parte do JSON Schema, é parte da versão customizada do JSON Schema usada pelo OpenAPI, e é isso que vai ser usado dentro da UI de documentação. + +Mas quando você usa `example` ou `examples` com qualquer um dos outros utilitários (`Query()`, `Body()`, etc.) esses exemplos não são adicionados ao JSON Schema que descreve esses dados (nem mesmo para versão própria do OpenAPI do JSON Schema), eles são adicionados diretamente à declaração da *operação de rota* no OpenAPI (fora das partes do OpenAPI que usam o JSON Schema). + +Para `Path()`, `Query()`, `Header()`, e `Cookie()`, o `example` e `examples` são adicionados a definição do OpenAPI, dentro do `Parameter Object` (na especificação). + +E para `Body()`, `File()`, e `Form()`, o `example` e `examples` são de maneira equivalente adicionados para a definição do OpenAPI, dentro do `Request Body Object`, no campo `content`, no `Media Type Object` (na especificação). + +Por outro lado, há uma versão mais recente do OpenAPI: **3.1.0**, lançada recentemente. Baseado no JSON Schema mais recente e a maioria das modificações da versão customizada do OpenAPI do JSON Schema são removidas, em troca dos recursos das versões recentes do JSON Schema, portanto, todas essas pequenas diferenças são reduzidas. No entanto, a UI do Swagger atualmente não oferece suporte a OpenAPI 3.1.0, então, por enquanto, é melhor continuar usando as opções acima. From 92feb735317996ef81763da370efa92c61a6d925 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jan 2024 15:09:59 +0000 Subject: [PATCH 140/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b6ac779a8..a2b2199a8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/schema-extra-example.md`. PR [#4065](https://github.com/tiangolo/fastapi/pull/4065) by [@luccasmmg](https://github.com/luccasmmg). * 🌐 Add Turkish translation for `docs/tr/docs/history-design-future.md`. PR [#11012](https://github.com/tiangolo/fastapi/pull/11012) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/resources/index.md`. PR [#11020](https://github.com/tiangolo/fastapi/pull/11020) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/how-to/index.md`. PR [#11021](https://github.com/tiangolo/fastapi/pull/11021) by [@hasansezertasan](https://github.com/hasansezertasan). From 7ee93035515abbbb32c0dd14e6b9e9464a8fe50b Mon Sep 17 00:00:00 2001 From: Donny Peeters <46660228+Donnype@users.noreply.github.com> Date: Sat, 27 Jan 2024 10:08:54 +0100 Subject: [PATCH 141/222] =?UTF-8?q?=F0=9F=93=9D=20Add=20External=20Link:?= =?UTF-8?q?=2010=20Tips=20for=20adding=20SQLAlchemy=20to=20FastAPI=20(#110?= =?UTF-8?q?36)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 44b064fe9..58e7acefe 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -1,5 +1,9 @@ Articles: English: + - author: Donny Peeters + author_link: https://github.com/Donnype + link: https://bitestreams.com/blog/fastapi-sqlalchemy/ + title: 10 Tips for adding SQLAlchemy to FastAPI - author: Jessica Temporal author_link: https://jtemporal.com/socials link: https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/ From e196abad3ed64d0b25054e1d7a9ed558cb9b3294 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:09:13 +0000 Subject: [PATCH 142/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a2b2199a8..a778d7fbf 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Add External Link: 10 Tips for adding SQLAlchemy to FastAPI. PR [#11036](https://github.com/tiangolo/fastapi/pull/11036) by [@Donnype](https://github.com/Donnype). * 📝 Add External Link: Tips on migrating from Flask to FastAPI and vice-versa. PR [#11029](https://github.com/tiangolo/fastapi/pull/11029) by [@jtemporal](https://github.com/jtemporal). * 📝 Deprecate old tutorials: Peewee, Couchbase, encode/databases. PR [#10979](https://github.com/tiangolo/fastapi/pull/10979) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix typo in `fastapi/security/oauth2.py`. PR [#10972](https://github.com/tiangolo/fastapi/pull/10972) by [@RafalSkolasinski](https://github.com/RafalSkolasinski). From 2378cfd56ab87738edd16e97e11716c8d9a80b9b Mon Sep 17 00:00:00 2001 From: Kani Kim Date: Sat, 27 Jan 2024 18:11:46 +0900 Subject: [PATCH 143/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`/docs/ko/docs/tutorial/body.md`=20(#11000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/body.md | 213 ++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 docs/ko/docs/tutorial/body.md diff --git a/docs/ko/docs/tutorial/body.md b/docs/ko/docs/tutorial/body.md new file mode 100644 index 000000000..931728572 --- /dev/null +++ b/docs/ko/docs/tutorial/body.md @@ -0,0 +1,213 @@ +# 요청 볞묞 + +큎띌읎얞튞(람띌우저띌고 핎뎅시닀)로부터 여러분의 API로 데읎터륌 볎낎알 할 때, **요청 볞묞**윌로 볎냅니닀. + +**요청** 볞묞은 큎띌읎얞튞에서 API로 볎낎지는 데읎터입니닀. **응답** 볞묞은 API가 큎띌읎얞튞로 볎낎는 데읎터입니닀. + +여러분의 API는 대부분의 겜우 **응답** 볞묞을 볎낎알 합니닀. 하지만 큎띌읎얞튞는 **요청** 볞묞을 ë§€ 번 볎낌 필요가 없습니닀. + +**요청** 볞묞을 선얞하Ʞ 위핎서 몚든 강력핚곌 읎점을 갖춘 Pydantic 몚덞을 사용합니닀. + +!!! 정볎 + 데읎터륌 볎낎Ʞ 위핎, (좀 더 볎펞적읞) `POST`, `PUT`, `DELETE` 혹은 `PATCH` 쀑에 하나륌 사용하는 것읎 좋습니닀. + + `GET` 요청에 볞묞을 닎아 볎낎는 것은 명섞서에 정의되지 않은 행동입니닀. 귞럌에도 불구하고, 읎 방식은 아죌 복잡한/극한의 사용 상황에서만 FastAPI에 의핎 지원됩니닀. + + `GET` 요청에 볞묞을 닮는 것은 권장되지 않Ʞ에, Swagger UI같은 대화형 묞서에서는 `GET` 사용시 닎Ʞ는 볞묞에 대한 묞서륌 표시하지 않윌며, 쀑간에 있는 프록시는 읎륌 지원하지 않을 수도 있습니닀. + +## Pydantic의 `BaseModel` 임포튞 + +뚌저 `pydantic`에서 `BaseModel`륌 임포튞핎알 합니닀: + +=== "Python 3.10+" + + ```Python hl_lines="2" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +## 여러분의 데읎터 몚덞 만듀Ʞ + +`BaseModel`륌 상속받은 큎래슀로 여러분의 데읎터 몚덞을 선얞합니닀. + +몚든 얎튞늬뷰튞에 대핮 표쀀 파읎썬 타입을 사용합니닀: + +=== "Python 3.10+" + + ```Python hl_lines="5-9" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="7-11" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +쿌늬 맀개변수륌 ì„ ì–ží•  때와 같읎, 몚덞 얎튞늬뷰튞가 Ʞ볞 값을 가지고 있얎도 읎는 필수가 아닙니닀. 귞왞에는 필수입니닀. ê·žì € `None`을 사용하여 선택적윌로 만듀 수 있습니닀. + +예륌 듀멎, 위의 읎 몚덞은 JSON "`object`" (혹은 파읎썬 `dict`)을 닀음곌 같읎 선얞합니닀: + +```JSON +{ + "name": "Foo", + "description": "선택적읞 섀명란", + "price": 45.2, + "tax": 3.5 +} +``` + +...`description`곌 `tax`는 (Ʞ볞 값읎 `None`윌로 되얎 있얎) 선택적읎Ʞ 때묞에, 읎 JSON "`object`"는 닀음곌 같은 상황에서도 유횚합니닀: + +```JSON +{ + "name": "Foo", + "price": 45.2 +} +``` + +## 맀개변수로서 선얞하Ʞ + +여러분의 *겜로 작동*에 추가하Ʞ 위핎, 겜로 맀개변수 귞늬고 쿌늬 맀개변수에서 선얞했던 것곌 같은 방식윌로 선얞하멎 됩니닀. + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +...귞늬고 만듀얎낞 몚덞읞 `Item`윌로 타입을 선얞합니닀. + +## 결곌 + +위에서의 닚순한 파읎썬 타입 선얞윌로, **FastAPI**는 닀음곌 같읎 동작합니닀: + +* 요청의 볞묞을 JSON윌로 읜얎 듀입니닀. +* (필요하닀멎) 대응되는 타입윌로 변환합니닀. +* 데읎터륌 검슝합니닀. + * 만앜 데읎터가 유횚하지 않닀멎, 정확히 ì–Žë–€ 것읎 귞늬고 얎디에서 데읎터가 잘 못 되었는지 지시하는 친절하고 명료한 에러륌 반환할 것입니닀. +* 맀개변수 `item`에 포핚된 수신 데읎터륌 제공합니닀. + * 핚수 낎에서 맀개변수륌 `Item` 타입윌로 선얞했Ʞ 때묞에, 몚든 얎튞늬뷰튞와 귞에 대한 타입에 대한 펞집Ʞ 지원(완성 등)을 또한 받을 수 있습니닀. +* 여러분의 몚덞을 위한 JSON 슀킀마 정의륌 생성합니닀. 여러분의 프로젝튞에 적합하닀멎 여러분읎 사용하고 싶은 ê³³ 얎디에서나 사용할 수 있습니닀. +* 읎러한 슀킀마는, 생성된 OpenAPI 슀킀마 음부가 될 것읎며, 자동 묞서화 UI에 사용됩니닀. + +## 자동 묞서화 + +몚덞의 JSON 슀킀마는 생성된 OpenAPI 슀킀마에 포핚되며 대화형 API 묞서에 표시됩니닀: + + + +읎륌 필요로 하는 각각의 *겜로 작동*낎부의 API 묞서에도 사용됩니닀: + + + +## 펞집Ʞ 지원 + +펞집Ʞ에서, 핚수 낎에서 타입 힌튞와 완성을 얎디서나 (만앜 Pydantic model 대신에 `dict`을 받을 겜우 나타나지 않을 수 있습니닀) 받을 수 있습니닀: + + + +잘못된 타입 연산에 대한 에러 확읞도 받을 수 있습니닀: + + + +닚순한 우연읎 아닙니닀. 프레임워크 전첎가 읎러한 디자읞을 쀑심윌로 섀계되었습니닀. + +ê·ž ì–Žë–€ 싀행 전에, 몚든 펞집Ʞ에서 작동할 수 있도록 볎장하Ʞ 위핎 섀계 닚계에서 혹독하게 테슀튞되었습니닀. + +읎륌 지원하Ʞ 위핎 Pydantic 자첎에서 몇몇 변겜점읎 있었습니닀. + +읎전 슀크늰샷은 Visual Studio Code륌 찍은 것입니닀. + +하지만 똑같은 펞집Ʞ 지원을 PyCharm에서 받을 수 있거나, 대부분의 닀륞 펞집Ʞ에서도 받을 수 있습니닀: + + + +!!! 팁 + 만앜 PyCharm륌 펞집Ʞ로 사용한닀멎, Pydantic PyCharm Plugin을 사용할 수 있습니닀. + + 닀음 사항을 포핚핎 Pydantic 몚덞에 대한 펞집Ʞ 지원을 향상시킵니닀: + + * 자동 완성 + * 타입 확읞 + * 늬팩토링 + * 검색 + * 점검 + +## 몚덞 사용하Ʞ + +핚수 안에서 몚덞 객첎의 몚든 얎튞늬뷰튞에 직접 ì ‘ê·Œ 가능합니닀: + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/body/tutorial002_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="21" + {!> ../../../docs_src/body/tutorial002.py!} + ``` + +## 요청 볞묞 + 겜로 맀개변수 + +겜로 맀개변수와 요청 볞묞을 동시에 ì„ ì–ží•  수 있습니닀. + +**FastAPI**는 겜로 맀개변수와 음치하는 핚수 맀개변수가 **겜로에서 가젞와알 한닀**는 것을 읞지하며, Pydantic 몚덞로 선얞된 ê·ž 핚수 맀개변수는 **요청 볞묞에서 가젞와알 한닀**는 것을 읞지할 것입니닀. + +=== "Python 3.10+" + + ```Python hl_lines="15-16" + {!> ../../../docs_src/body/tutorial003_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="17-18" + {!> ../../../docs_src/body/tutorial003.py!} + ``` + +## 요청 볞묞 + 겜로 + 쿌늬 맀개변수 + +**볞묞**, **겜로** 귞늬고 **쿌늬** 맀개변수 몚두 동시에 ì„ ì–ží•  수도 있습니닀. + +**FastAPI**는 각각을 읞지하고 데읎터륌 옳바륞 위치에 가젞올 것입니닀. + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial004_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial004.py!} + ``` + +핚수 맀개변수는 닀음을 따띌서 읞지하게 됩니닀: + +* 만앜 맀개변수가 **겜로**에도 선얞되얎 있닀멎, 읎는 겜로 맀개변수로 사용될 것입니닀. +* 만앜 맀개변수가 (`int`, `float`, `str`, `bool` 등곌 같은) **유음한 타입**윌로 되얎있윌멎, **쿌늬** 맀개변수로 핎석될 것입니닀. +* 만앜 맀개변수가 **Pydantic 몚덞** 타입윌로 선얞되얎 있윌멎, 요청 **볞묞**윌로 핎석될 것입니닀. + +!!! ì°žê³  + FastAPI는 `q`의 값읎 필요없음을 알게 될 것입니닀. Ʞ볞 값읎 `= None`읎Ʞ 때묞입니닀. + + `Union[str, None]`에 있는 `Union`은 FastAPI에 의핎 사용된 것읎 아니지만, 펞집Ʞ로 하여ꞈ 더 나은 지원곌 에러 탐지륌 지원할 것입니닀. + +## Pydantic없읎 + +만앜 Pydantic 몚덞을 사용하고 싶지 않닀멎, **Body** 맀개변수륌 사용할 수도 있습니닀. [Body - 닀쀑 맀개변수: 볞묞에 있는 유음한 값](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} 묞서륌 확읞하섞요. From 00395f3eeb0bc2627e9829ff0d62e70548c19a7f Mon Sep 17 00:00:00 2001 From: Kani Kim Date: Sat, 27 Jan 2024 18:12:44 +0900 Subject: [PATCH 144/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/dependencies/index.md`=20(#10?= =?UTF-8?q?989)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/dependencies/index.md | 353 ++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 docs/ko/docs/tutorial/dependencies/index.md diff --git a/docs/ko/docs/tutorial/dependencies/index.md b/docs/ko/docs/tutorial/dependencies/index.md new file mode 100644 index 000000000..d5d113860 --- /dev/null +++ b/docs/ko/docs/tutorial/dependencies/index.md @@ -0,0 +1,353 @@ +# 의졎성 + +**FastAPI**는 아죌 강력하지만 직ꎀ적읞 **의졎성 죌입** 시슀템을 가지고 있습니닀. + +읎는 사용하Ʞ 아죌 쉜게 섀계했윌며, 얎느 개발자나 닀륞 컎포넌튞와 **FastAPI**륌 쉜게 통합할 수 있도록 만듀었습니닀. + +## "의졎성 죌입"은 묎엇입니까? + +**"의졎성 죌입"**은 프로귞래밍에서 여러분의 윔드(읎 겜우, 겜로 동작 핚수)가 작동하고 사용하는 데 필요로 하는 것, 슉 "의졎성"을 ì„ ì–ží•  수 있는 방법을 의믞합니닀. + +ê·ž 후에, 시슀템(읎 겜우 FastAPI)은 여러분의 윔드가 요구하는 의졎성을 제공하Ʞ 위핎 필요한 몚든 작업을 처늬합니닀.(의졎성을 "죌입"합니닀) + +읎는 여러분읎 닀음곌 같은 사항을 필요로 할 때 맀우 유용합니닀: + +* 공용된 로직을 가졌을 겜우 (같은 윔드 로직읎 계속 반복되는 겜우). +* 데읎터베읎슀 연결을 공유하는 겜우. +* 볎안, 읞슝, 역할 요구 사항 등을 강제하는 겜우. +* 귞늬고 많은 닀륞 사항... + +읎 몚든 사항을 할 때 윔드 반복을 최소화합니닀. + +## 첫번짞 닚계 + +아죌 간닚한 예제륌 뎅시닀. 너묎 간닚할 것읎Ʞ에 지ꞈ 당장은 유용하지 않을 수 있습니닀. + +하지만 읎륌 통핎 **의졎성 죌입** 시슀템읎 얎떻게 작동하는지에 쀑점을 둘 것입니닀. + +### 의졎성 혹은 "디펜더뾔" 만듀Ʞ + +의졎성에 집쀑핎 뎅시닀. + +*겜로 작동 핚수*가 가질 수 있는 몚든 맀개변수륌 갖는 닚순한 핚수입니닀: + +=== "Python 3.10+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="8-11" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9-12" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="6-7" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="8-11" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +읎게 닀입니닀. + +**당 두 쀄입니닀**. + +귞늬고, 읎 핚수는 여러분의 몚든 *겜로 작동 핚수*가 가지고 있는 것곌 같은 형태와 구조륌 가지고 있습니닀. + +여러분은 읎륌 "데윔레읎터"가 없는 (`@app.get("/some-path")`가 없는) *겜로 작동 핚수*띌고 생각할 수 있습니닀. + +귞늬고 여러분읎 원하는 묎엇읎든 반환할 수 있습니닀. + +읎 겜우, 읎 의졎성은 닀음곌 같은 겜우륌 Ʞ대합니닀: + +* 선택적읞 쿌늬 맀개변수 `q`, `str`을 자료형윌로 가집니닀. +* 선택적읞 쿌늬 맀개변수 `skip`, `int`륌 자료형윌로 가지며 Ʞ볞 값은 `0`입니닀. +* 선택적읞 쿌늬 맀개변수 `limit`,`int`륌 자료형윌로 가지며 Ʞ볞 값은 `100`입니닀. + +ê·ž 후 위의 값을 포핚한 `dict` 자료형윌로 반환할 뿐입니닀. + +!!! 정볎 + FastAPI는 0.95.0 버전부터 `Annotated`에 대한 지원을 (귞늬고 읎륌 사용하Ʞ 권장합니닀) 추가했습니닀. + + 옛날 버전을 가지고 있는 겜우, `Annotated`륌 사용하렀 하멎 에러륌 맞읎하게 될 것입니닀. + + `Annotated`륌 사용하Ʞ 전에 최소 0.95.1로 [FastAPI 버전 업귞레읎드](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}륌 확싀하게 하섞요. + +### `Depends` 불러였Ʞ + +=== "Python 3.10+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="1" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +### "의졎자"에 의졎성 명시하Ʞ + +*겜로 작동 핚수*의 맀개변수로 `Body`, `Query` 등을 사용하는 방식곌 같읎 새로욎 맀개변수로 `Depends`륌 사용합니닀: + +=== "Python 3.10+" + + ```Python hl_lines="13 18" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="15 20" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="16 21" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="11 16" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ Annotated가 없는 겜우" + + !!! 팁 + 가능하닀멎 `Annotated`가 달늰 버전을 권장합니닀. + + ```Python hl_lines="15 20" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +비록 `Body`, `Query` 등을 사용하는 것곌 같은 방식윌로 여러분의 핚수의 맀개변수에 있는 `Depends`륌 사용하지만, `Depends`는 앜간 닀륎게 작동합니닀. + +`Depends`에 닚음 맀개변수만 전달했습니닀. + +읎 맀개변수는 핚수같은 것읎얎알 합니닀. + +여러분은 직접 **혞출하지 않았습니닀** (끝에 ꎄ혞륌 치지 않았습니닀), 닚지 `Depends()`에 맀개변수로 넘겚 쀬을 뿐입니닀. + +귞늬고 ê·ž 핚수는 *겜로 작동 핚수*가 작동하는 것곌 같은 방식윌로 맀개변수륌 받습니닀. + +!!! 팁 + 여러분은 닀음 장에서 핚수륌 제왞하고서, "닀륞 것듀"읎 얎떻게 의졎성윌로 사용되는지 알게 될 것입니닀. + +새로욎 요청읎 도착할 때마닀, **FastAPI**는 닀음을 처늬합니닀: + +* 올바륞 맀개변수륌 가진 의졎성("디펜더뾔") 핚수륌 혞출합니닀. +* 핚수에서 결곌륌 받아옵니닀. +* *겜로 작동 핚수*에 있는 맀개변수에 ê·ž 결곌륌 할당합니닀 + +```mermaid +graph TB + +common_parameters(["common_parameters"]) +read_items["/items/"] +read_users["/users/"] + +common_parameters --> read_items +common_parameters --> read_users +``` + +읎렇게 하멎 공용 윔드륌 한번만 적얎도 되며, **FastAPI**는 *겜로 작동*을 위핎 읎에 대한 혞출을 처늬합니닀. + +!!! 확읞 + 특별한 큎래슀륌 만듀지 않아도 되며, 읎러한 것 혹은 비슷한 종류륌 **FastAPI**에 "등록"하Ʞ 위핎 ì–Žë–€ 곳에 넘겚죌지 않아도 됩니닀. + + 닚순히 `Depends`에 넘겚죌Ʞ만 하멎 되며, **FastAPI**는 나뚞지륌 얎찌할지 알고 있습니닀. + +## `Annotated`읞 의졎성 공유하Ʞ + +위의 예제에서 몇몇 작은 **윔드 쀑복**읎 있닀는 것을 볎았을 겁니닀. + +`common_parameters()`의졎을 사용핎알 한닀멎, 타입 명시와 `Depends()`와 핚께 전첎 맀개변수륌 적얎알 합니닀: + +```Python +commons: Annotated[dict, Depends(common_parameters)] +``` + +하지만 `Annotated`륌 사용하고 있Ʞ에, `Annotated` 값을 변수에 저장하고 여러 장소에서 사용할 수 있습니닀: + +=== "Python 3.10+" + + ```Python hl_lines="12 16 21" + {!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="14 18 23" + {!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="15 19 24" + {!> ../../../docs_src/dependencies/tutorial001_02_an.py!} + ``` + +!!! 팁 + 읎는 ê·žì € 표쀀 파읎썬읎고 "type alias"띌고 부륎며 사싀 **FastAPI**에 국한되는 것은 아닙니닀. + + 하지만, `Annotated`륌 포핚하여, **FastAPI**가 파읎썬 표쀀을 Ʞ반윌로 하고 있Ʞ에, 읎륌 여러분의 윔드 튞늭윌로 사용할 수 있습니닀. 😎 + +읎 의졎성은 계속핎서 예상한대로 작동할 것읎며, **제음 좋은 부분**은 **타입 정볎가 볎졎된닀는 것입니닀**. 슉 여러분의 펞집Ʞ가 **자동 완성**, **읞띌읞 에러** 등을 계속핎서 제공할 수 있닀는 것입니닀. `mypy`같은 닀륞 도구도 마찬가지입니닀. + +읎는 특히 **많은 *겜로 작동***에서 **같은 의졎성**을 계속핎서 사용하는 **거대 윔드 êž°ë°˜**안에서 사용하멎 유용할 것입니닀. + +## `async`하게, 혹은 `async`하지 않게 + +의졎성읎 (*겜로 작동 핚수*에서 처럌 똑같읎) **FastAPI**에 의핎 혞출될 수 있윌며, 핚수륌 정의할 때 동음한 규칙읎 적용됩니닀. + +`async def`을 사용하거나 혹은 음반적읞 `def`륌 사용할 수 있습니닀. + +귞늬고 음반적읞 `def` *겜로 작동 핚수* 안에 `async def`로 의졎성을 ì„ ì–ží•  수 있윌며, `async def` *겜로 작동 핚수* 안에 `def`로 의졎성을 선얞하는 등의 방법읎 있습니닀. + +아묎 묞제 없습니닀. **FastAPI**는 묎엇을 할지 알고 있습니닀. + +!!! ì°žê³  + 잘 몚륎시겠닀멎, [Async: *"In a hurry?"*](../../async.md){.internal-link target=_blank} 묞서에서 `async`와 `await`에 대핮 확읞할 수 있습니닀. + +## OpenAPI와 통합 + +몚든 요청 ì„ ì–ž, 검슝곌 의졎성(및 하위 의졎성)에 대한 요구 사항은 동음한 OpenAPI 슀킀마에 통합됩니닀. + +따띌서 대화형 묞서에 읎러한 의졎성에 대한 몚든 정볎 역시 포핚하고 있습니닀: + + + +## 간닚한 사용법 + +읎륌 볎멎, *겜로 작동 핚수*는 *겜로*와 *작동*읎 맀칭되멎 얞제든지 사용되도록 정의되었윌며, **FastAPI**는 올바륞 맀개변수륌 가진 핚수륌 혞출하고 핎당 요청에서 데읎터륌 추출합니닀. + +사싀, 몚든 (혹은 대부분의) 웹 프레임워크는 읎와 같은 방식윌로 작동합니닀. + +여러분은 읎러한 핚수듀을 절대 직접 혞출하지 않습니닀. 프레임워크(읎 겜우 **FastAPI**)에 의핎 혞출됩니닀. + +의졎성 죌입 시슀템곌 핚께띌멎 **FastAPI**에게 여러분의 *겜로 작동 핚수*가 싀행되Ʞ 전에 싀행되얎알 하는 묎얞가에 여러분의 *겜로 작동 핚수* 또한 "의졎"하고 있음을 알늎 수 있윌며, **FastAPI**는 읎륌 싀행하고 결곌륌 "죌입"할 것입니닀. + +"의졎성 죌입"읎띌는 동음한 아읎디얎에 대한 닀륞 음반적읞 용얎는 닀음곌 같습니닀: + +* 늬소슀 +* 제공자 +* 서비슀 +* 읞젝터랔 +* 컎포넌튞 + +## **FastAPI** 플러귞읞 + +통합곌 "플러귞읞"은 **의졎성 죌입** 시슀템을 사용하여 구축할 수 있습니닀. 하지만 싀제로 **"플러귞읞"을 만듀 필요는 없습니닀**, 왜냐하멎 의졎성을 사용핚윌로썚 여러분의 *겜로 작동 핚수*에 통합곌 상혞 작용을 묎한대로 ì„ ì–ží•  수 있Ʞ 때묞입니닀. + +귞늬고 "말 귞대로", ê·žì € 필요로 하는 파읎썬 팚킀지륌 임포튞하고 당 몇 쀄의 윔드로 여러분의 API 핚수와 통합핚윌로썚, 의졎성을 아죌 간닚하고 직ꎀ적읞 방법윌로 만듀 수 있습니닀. + +ꎀ계형 및 NoSQL 데읎터베읎슀, 볎안 등, 읎에 대한 예시륌 닀음 장에서 볌 수 있습니닀. + +## **FastAPI** 혞환성 + +의졎성 죌입 시슀템의 닚순핚은 **FastAPI**륌 닀음곌 같은 요소듀곌 혾환할 수 있게 합니닀: + +* 몚든 ꎀ계형 데읎터베읎슀 +* NoSQL 데읎터베읎슀 +* 왞부 팚킀지 +* 왞부 API +* 읞슝 및 권한 부여 시슀템 +* API 사용 몚니터링 시슀템 +* 응답 데읎터 죌입 시슀템 +* Ʞ타 등등. + +## 간펞하고 강력하닀 + +계잵적읞 의졎성 죌입 시슀템은 정의하고 사용하Ʞ 쉜지만, 여전히 맀우 강력합니닀. + +여러분은 슀슀로륌 의졎하는 의졎성을 정의할 수 있습니닀. + +끝에는, 계잵적읞 나묎로 된 의졎성읎 만듀얎지며, 귞늬고 **의졎성 죌입** 시슀템은 (하위 의졎성도 마찬가지로) 읎러한 의졎성듀을 처늬하고 각 닚계마닀 결곌륌 제공합니닀(죌입합니닀). + +예륌 듀멎, 여러분읎 4개의 API 엔드포읞튞(*겜로 작동*)륌 가지고 있닀고 핎뎅시닀: + +* `/items/public/` +* `/items/private/` +* `/users/{user_id}/activate` +* `/items/pro/` + +ê·ž 닀음 각각에 대핮 ê·žì € 의졎성곌 하위 의졎성을 사용하여 닀륞 권한 요구 사항을 추가할 수 있을 겁니닀: + +```mermaid +graph TB + +current_user(["current_user"]) +active_user(["active_user"]) +admin_user(["admin_user"]) +paying_user(["paying_user"]) + +public["/items/public/"] +private["/items/private/"] +activate_user["/users/{user_id}/activate"] +pro_items["/items/pro/"] + +current_user --> active_user +active_user --> admin_user +active_user --> paying_user + +current_user --> public +active_user --> private +admin_user --> activate_user +paying_user --> pro_items +``` + +## **OpenAPI**와의 통합 + +읎 몚든 의졎성은 각각의 요구사항을 선얞하는 동시에, *겜로 작동*에 맀개변수, 검슝 등을 추가합니닀. + +**FastAPI**는 읎 몚든 것을 OpenAPI 슀킀마에 추가할 것읎며, 읎륌 통핎 대화형 묞서 시슀템에 나타날 것입니닀. From b110cd62a029d0672bd7bff12e81518da265d0dd Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:12:59 +0000 Subject: [PATCH 145/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a778d7fbf..60a7ae361 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -47,6 +47,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md`. PR [#11000](https://github.com/tiangolo/fastapi/pull/11000) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/schema-extra-example.md`. PR [#4065](https://github.com/tiangolo/fastapi/pull/4065) by [@luccasmmg](https://github.com/luccasmmg). * 🌐 Add Turkish translation for `docs/tr/docs/history-design-future.md`. PR [#11012](https://github.com/tiangolo/fastapi/pull/11012) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/resources/index.md`. PR [#11020](https://github.com/tiangolo/fastapi/pull/11020) by [@hasansezertasan](https://github.com/hasansezertasan). From 2ccc0ccf01d57c3ca5d6900ba0433cc089516466 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:13:27 +0000 Subject: [PATCH 146/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 60a7ae361..a87e4d044 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -47,6 +47,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/dependencies/index.md`. PR [#10989](https://github.com/tiangolo/fastapi/pull/10989) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md`. PR [#11000](https://github.com/tiangolo/fastapi/pull/11000) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/schema-extra-example.md`. PR [#4065](https://github.com/tiangolo/fastapi/pull/4065) by [@luccasmmg](https://github.com/luccasmmg). * 🌐 Add Turkish translation for `docs/tr/docs/history-design-future.md`. PR [#11012](https://github.com/tiangolo/fastapi/pull/11012) by [@hasansezertasan](https://github.com/hasansezertasan). From 4c0d12497fe75a180792f75d3a944d6d33d8836b Mon Sep 17 00:00:00 2001 From: Alper Date: Sat, 27 Jan 2024 12:14:47 +0300 Subject: [PATCH 147/222] :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md` (#10502) --- docs/tr/docs/alternatives.md | 409 +++++++++++++++++++++++++++++++++++ 1 file changed, 409 insertions(+) create mode 100644 docs/tr/docs/alternatives.md diff --git a/docs/tr/docs/alternatives.md b/docs/tr/docs/alternatives.md new file mode 100644 index 000000000..9c69503c9 --- /dev/null +++ b/docs/tr/docs/alternatives.md @@ -0,0 +1,409 @@ +# Alternatifler, İlham Kaynakları ve Karşılaştırmalar + +**FastAPI**'ya neler ilham verdi? Diğer alternatiflerle karşılaştırıldığında farkları neler? **FastAPI** diğer alternatiflerinden neler öğrendi? + +## Giriş + +Başkalarının daha önceki çalışmaları olmasaydı, **FastAPI** var olmazdı. + +Geçmişte oluşturulan pek çok araç **FastAPI**'a ilham kaynağı olmuştur. + +Yıllardır yeni bir framework oluşturmaktan kaçınıyordum. Başlangıçta **FastAPI**'ın çözdÌğÌ sorunları çözebilmek için pek çok farklı framework, eklenti ve araç kullanmayı denedim. + +Ancak bir noktada, geçmişteki diğer araçlardan en iyi fikirleri alarak bÃŒtÃŒn bu çözÃŒmleri kapsayan, ayrıca bÃŒtÃŒn bunları Python'ın daha önce mevcut olmayan özelliklerini (Python 3.6+ ile gelen tip belirteçleri) kullanarak yapan bir şey ÃŒretmekten başka seçenek kalmamıştı. + +## Daha Önce Geliştirilen Araçlar + +### Django + +Django geniş çapta gÃŒvenilen, Python ekosistemindeki en popÃŒler web framework'ÃŒdÃŒr. Instagram gibi sistemleri geliştirmede kullanılmıştır. + +MySQL ve PostgreSQL gibi ilişkisel veritabanlarıyla nispeten sıkı bir şekilde bağlantılıdır. Bu nedenle Couchbase, MongoDB ve Cassandra gibi NoSQL veritabanlarını ana veritabanı motoru olarak kullanmak pek de kolay değil. + +Modern ön uçlarda (React, Vue.js ve Angular gibi) veya diğer sistemler (örneğin nesnelerin interneti cihazları) tarafından kullanılan API'lar yerine arka uçta HTML ÃŒretmek için oluşturuldu. + +### Django REST Framework + +Django REST framework'ÃŒ, Django'nun API kabiliyetlerini arttırmak için arka planda Django kullanan esnek bir araç grubu olarak oluşturuldu. + +Üstelik Mozilla, Red Hat ve Eventbrite gibi pek çok şirket tarafından kullanılıyor. + +**Otomatik API dökÃŒmantasyonu**nun ilk örneklerinden biri olduğu için, **FastAPI** arayışına ilham veren ilk fikirlerden biri oldu. + +!!! note "Not" + Django REST Framework'ÃŒ, aynı zamanda **FastAPI**'ın dayandığı Starlette ve Uvicorn'un da yaratıcısı olan Tom Christie tarafından geliştirildi. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + Kullanıcılar için otomatik API dökÃŒmantasyonu sunan bir web arayÃŒzÃŒne sahip olmalı. + +### Flask + +Flask bir mikro framework olduğundan Django gibi framework'lerin aksine veritabanı entegrasyonu gibi Django ile gelen pek çok özelliği direkt barındırmaz. + +Sağladığı basitlik ve esneklik NoSQL veritabanlarını ana veritabanı sistemi olarak kullanmak gibi şeyler yapmaya olanak sağlar. + +Yapısı oldukça basit olduğundan öğrenmesi de nispeten basittir, tabii dökÃŒmantasyonu bazı noktalarda biraz teknik hale geliyor. + +Ayrıca Django ile birlikte gelen veritabanı, kullanıcı yönetimi ve diğer pek çok özelliğe ihtiyaç duymayan uygulamalarda da yaygın olarak kullanılıyor. Ancak bu tÃŒr özelliklerin pek çoğu eklentiler ile eklenebiliyor. + +Uygulama parçalarının böyle ayrılıyor oluşu ve istenilen özelliklerle genişletilebilecek bir mikro framework olmak tam da benim istediğim bir özellikti. + +Flask'ın basitliği göz önÃŒnde bulundurulduğu zaman, API geliştirmek için iyi bir seçim gibi görÃŒnÃŒyordu. Sıradaki şey ise Flask için bir "Django REST Framework"! + +!!! check "**FastAPI**'a nasıl ilham verdi?" + Gereken araçları ve parçaları birleştirip eşleştirmeyi kolaylaştıracak bir mikro framework olmalı. + + Basit ve kullanması kolay bir yönlendirme sistemine sahip olmalı. + +### Requests + +**FastAPI** aslında **Requests**'in bir alternatifi değil. İkisininde kapsamı oldukça farklı. + +Aslında Requests'i bir FastAPI uygulamasının *içinde* kullanmak daha olağan olurdu. + +Ama yine de, FastAPI, Requests'ten oldukça ilham aldı. + +**Requests**, API'lar ile bir istemci olarak *etkileşime geçmeyi* sağlayan bir kÃŒtÃŒphaneyken **FastAPI** bir sunucu olarak API'lar oluşturmaya yarar. + +Öyle ya da böyle zıt uçlarda olmalarına rağmen birbirlerini tamamlıyorlar. + +Requests oldukça basit ve sezgisel bir tasarıma sahip, kullanması da mantıklı varsayılan değerlerle oldukça kolay. Ama aynı zamanda çok gÌçlÃŒ ve gayet özelleştirilebilir. + +Bu yÃŒzden resmi web sitede de söylendiği gibi: + +> Requests, tÃŒm zamanların en çok indirilen Python paketlerinden biridir. + +Kullanım şekli oldukça basit. Örneğin bir `GET` isteği yapmak için aşağıdaki yeterli: + +```Python +response = requests.get("http://example.com/some/url") +``` + +Bunun FastAPI'deki API *yol işlemi* şöyle görÃŒnÃŒr: + +```Python hl_lines="1" +@app.get("/some/url") +def read_url(): + return {"message": "Hello World!"} +``` + +`requests.get(...)` ile `@app.get(...)` arasındaki benzerliklere bakın. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + * Basit ve sezgisel bir API'ya sahip olmalı. + * HTTP metot isimlerini (işlemlerini) anlaşılır olacak bir şekilde, direkt kullanmalı. + * Mantıklı varsayılan değerlere ve buna rağmen gÌçlÃŒ bir özelleştirme desteğine sahip olmalı. + +### Swagger / OpenAPI + +Benim Django REST Framework'ÃŒnden istediğim ana özellik otomatik API dökÃŒmantasyonuydu. + +Daha sonra API'ları dökÃŒmanlamak için Swagger adında JSON (veya JSON'un bir uzantısı olan YAML'ı) kullanan bir standart olduğunu buldum. + +Üstelik Swagger API'ları için zaten halihazırda oluşturulmuş bir web arayÃŒzÃŒ vardı. Yani, bir API için Swagger dökÃŒmantasyonu oluşturmak bu arayÃŒzÃŒ otomatik olarak kullanabilmek demekti. + +Swagger bir noktada Linux Foundation'a verildi ve adı OpenAPI olarak değiştirildi. + +İşte bu yÃŒzden versiyon 2.0 hakkında konuşurken "Swagger", versiyon 3 ve ÃŒzeri için ise "OpenAPI" adını kullanmak daha yaygın. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + API spesifikasyonları için özel bir şema yerine bir açık standart benimseyip kullanmalı. + + Ayrıca standarda bağlı kullanıcı arayÃŒzÃŒ araçlarını entegre etmeli: + + * Swagger UI + * ReDoc + + Yukarıdaki ikisi oldukça popÃŒler ve istikrarlı olduğu için seçildi, ancak hızlı bir araştırma yaparak **FastAPI** ile kullanabileceğiniz pek çok OpenAPI alternatifi arayÃŒz bulabilirsiniz. + +### Flask REST framework'leri + +Pek çok Flask REST framework'ÃŒ var, fakat bunları biraz araştırdıktan sonra pek çoğunun artık geliştirilmediğini ve göze batan bazı sorunlarının olduğunu gördÃŒm. + +### Marshmallow + +API sistemlerine gereken ana özelliklerden biri de koddan veriyi alıp ağ ÃŒzerinde gönderilebilecek bir şeye çevirmek, yani veri dönÌşÌmÃŒ. Bu işleme veritabanındaki veriyi içeren bir objeyi JSON objesine çevirmek, `datetime` objelerini metinlere çevirmek gibi örnekler verilebilir. + +API'lara gereken bir diğer bÃŒyÃŒk özellik ise veri doğrulamadır, yani verinin çeşitli parametrelere bağlı olarak doğru ve tutarlı olduğundan emin olmaktır. Örneğin bir alanın `int` olmasına karar verdiniz, daha sonra rastgele bir metin değeri almasını istemezsiniz. Bu özellikle sisteme dışarıdan gelen veri için kullanışlı bir özellik oluyor. + +Bir veri doğrulama sistemi olmazsa bÃŒtÃŒn bu kontrolleri koda dökerek kendiniz yapmak zorunda kalırdınız. + +Marshmallow bu özellikleri sağlamak için geliştirilmişti. Benim de geçmişte oldukça sık kullandığım harika bir kÃŒtÃŒphanedir. + +Ama... Python'un tip belirteçleri gelmeden önce oluşturulmuştu. Yani her şemayı tanımlamak için Marshmallow'un sunduğu spesifik araçları ve sınıfları kullanmanız gerekiyordu. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + Kod kullanarak otomatik olarak veri tipini ve veri doğrulamayı belirten "şemalar" tanımlamalı. + +### Webargs + +API'ların ihtiyacı olan bir diğer önemli özellik ise gelen isteklerdeki verileri Python objelerine ayrıştırabilmektir. + +Webargs, Flask gibi bir kaç framework'ÃŒn ÃŒzerinde bunu sağlamak için geliştirilen bir araçtır. + +Veri doğrulama için arka planda Marshmallow kullanıyor, hatta aynı geliştiriciler tarafından oluşturuldu. + +Webargs da harika bir araç ve onu da geçmişte henÃŒz **FastAPI** yokken çok kullandım. + +!!! info "Bilgi" + Webargs aynı Marshmallow geliştirileri tarafından oluşturuldu. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + Gelen istek verisi için otomatik veri doğrulamaya sahip olmalı. + +### APISpec + +Marshmallow ve Webargs eklentiler olarak; veri doğrulama, ayrıştırma ve dönÌştÃŒrmeyi sağlıyor. + +Ancak dökÃŒmantasyondan hala ses seda yok. Daha sonrasında ise APISpec geldi. + +APISpec pek çok framework için bir eklenti olarak kullanılıyor (Starlette için de bir eklentisi var). + +Şemanın tanımını yol'a istek geldiğinde çalışan her bir fonksiyonun dökÃŒman dizesinin içine YAML formatında olacak şekilde yazıyorsunuz o da OpenAPI şemaları ÃŒretiyor. + +Flask, Starlette, Responder ve benzerlerinde bu şekilde çalışıyor. + +Fakat sonrasında yine mikro sözdizimi problemiyle karşılaşıyoruz. Python metinlerinin içinde koskoca bir YAML oluyor. + +Editör bu konuda pek yardımcı olamaz. Üstelik eğer parametreleri ya da Marshmallow şemalarını değiştirip YAML kodunu gÃŒncellemeyi unutursak artık dökÃŒman geçerliliğini yitiriyor. + +!!! info "Bilgi" + APISpec de aynı Marshmallow geliştiricileri tarafından oluşturuldu. + +!!! check "**FastAPI**'a nasıl ilham verdi?" + API'lar için açık standart desteği olmalı (OpenAPI gibi). + +### Flask-apispec + +Flask-apispec ise Webargs, Marshmallow ve APISpec'i birbirine bağlayan bir Flask eklentisi. + +Webargs ve Marshmallow'daki bilgiyi APISpec ile otomatik OpenAPI şemaları ÃŒretmek için kullanıyor. + +Hak ettiği değeri görmeyen, harika bir araç. Piyasadaki çoğu Flask eklentisinden çok daha popÃŒler olmalı. Hak ettiği değeri görmÃŒyor oluşunun sebebi ise dökÃŒmantasyonun çok kısa ve soyut olması olabilir. + +Böylece Flask-apispec, Python dökÃŒman dizilerine YAML gibi farklı bir syntax yazma sorununu çözmÌş oldu. + +**FastAPI**'ı geliştirene dek benim favori arka uç kombinasyonum Flask'in yanında Marshmallow ve Webargs ile birlikte Flask-apispec idi. + +Bunu kullanmak, bir kaç full-stack Flask projesi oluşturucusunun yaratılmasına yol açtı. Bunlar benim (ve bir kaç harici ekibin de) şimdiye kadar kullandığı asıl stackler: + +* https://github.com/tiangolo/full-stack +* https://github.com/tiangolo/full-stack-flask-couchbase +* https://github.com/tiangolo/full-stack-flask-couchdb + +Aynı full-stack ÃŒreticiler [**FastAPI** Proje Üreticileri](project-generation.md){.internal-link target=_blank}'nin de temelini oluşturdu. + +!!! info "Bilgi" + Flask-apispec de aynı Marshmallow geliştiricileri tarafından ÃŒretildi. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Veri dönÌşÌmÃŒ ve veri doğrulamayı tanımlayan kodu kullanarak otomatik olarak OpenAPI şeması oluşturmalı. + +### NestJS (and Angular) + +Bu Python teknolojisi bile değil. NestJS, Angulardan ilham almış olan bir JavaScript (TypeScript) NodeJS framework'ÃŒ. + +Flask-apispec ile yapılabileceklere nispeten benzeyen bir şey elde ediyor. + +Angular 2'den ilham alan, içine gömÃŒlÃŒ bir bağımlılık enjeksiyonu sistemi var. Bildiğim diğer tÃŒm bağımlılık enjeksiyonu sistemlerinde olduğu gibi"bağımlılık"ları önceden kaydetmenizi gerektiriyor. Böylece projeyi daha detaylı hale getiriyor ve kod tekrarını da arttırıyor. + +Parametreler TypeScript tipleri (Python tip belirteçlerine benzer) ile açıklandığından editör desteği oldukça iyi. + +Ama TypeScript verileri kod JavaScript'e derlendikten sonra korunmadığından, bunlara dayanarak aynı anda veri doğrulaması, veri dönÌşÌmÃŒ ve dökÃŒmantasyon tanımlanamıyor. Bundan ve bazı tasarım tercihlerinden dolayı veri doğrulaması, dönÌşÌmÃŒ ve otomatik şema ÃŒretimi için pek çok yere dekorator eklemek gerekiyor. Bu da projeyi oldukça detaylandırıyor. + +İç içe geçen derin modelleri pek iyi işleyemiyor. Yani eğer istekteki JSON gövdesi derin bir JSON objesiyse dÃŒzgÃŒn bir şekilde dökÃŒmante edilip doğrulanamıyor. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + GÃŒzel bir editör desteği için Python tiplerini kullanmalı. + + GÌçlÃŒ bir bağımlılık enjeksiyon sistemine sahip olmalı. Kod tekrarını minimuma indirecek bir yol bulmalı. + +### Sanic + +Sanic, `asyncio`'ya dayanan son derece hızlı Python kÃŒtÃŒphanelerinden biriydi. Flask'a epey benzeyecek şekilde geliştirilmişti. + +!!! note "Teknik detaylar" + İçerisinde standart Python `asyncio` döngÃŒsÃŒ yerine `uvloop` kullanıldı. Hızının asıl kaynağı buydu. + + Uvicorn ve Starlette'e ilham kaynağı olduğu oldukça açık, şu anda ikisi de açık karşılaştırmalarda Sanicten daha hızlı gözÃŒkÃŒyor. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Uçuk performans sağlayacak bir yol bulmalı. + + Tam da bu yÃŒzden **FastAPI** Starlette'e dayanıyor, çÌnkÃŒ Starlette şu anda kullanılabilir en hızlı framework. (ÌçÌncÃŒ parti karşılaştırmalı testlerine göre) + +### Falcon + +Falcon ise bir diğer yÃŒksek performanslı Python framework'ÃŒ. Minimal olacak şekilde Hug gibi diğer framework'lerin temeli olabilmek için tasarlandı. + +İki parametre kabul eden fonksiyonlar şeklinde tasarlandı, biri "istek" ve diğeri ise "cevap". Sonra isteğin çeşitli kısımlarını **okuyor**, cevaba ise bir şeyler **yazıyorsunuz**. Bu tasarımdan dolayı istek parametrelerini ve gövdelerini standart Python tip belirteçlerini kullanarak fonksiyon parametreleriyle belirtmek mÃŒmkÃŒn değil. + +Yani veri doğrulama, veri dönÌştÃŒrme ve dökÃŒmantasyonun hepsi kodda yer almalı, otomatik halledemiyoruz. Ya da Falcon ÃŒzerine bir framework olarak uygulanmaları gerekiyor, aynı Hug'da olduğu gibi. Bu ayrım Falcon'un tasarımından esinlenen, istek ve cevap objelerini parametre olarak işleyen diğer kÃŒtÃŒphanelerde de yer alıyor. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Harika bir performans'a sahip olmanın yollarını bulmalı. + + Hug ile birlikte (Hug zaten Falcon'a dayandığından) **FastAPI**'ın fonksiyonlarda `cevap` parametresi belirtmesinde ilham kaynağı oldu. + + FastAPI'da opsiyonel olmasına rağmen, daha çok header'lar, çerezler ve alternatif durum kodları belirlemede kullanılıyor. + +### Molten + +**FastAPI**'ı geliştirmenin ilk aşamalarında Molten'ı keşfettim. Pek çok ortak fikrimiz vardı: + +* Python'daki tip belirteçlerini baz alıyordu. +* Bunlara bağlı olarak veri doğrulaması ve dökÃŒmantasyon sağlıyordu. +* Bir bağımlılık enjeksiyonu sistemi vardı. + +Veri doğrulama, veri dönÌştÃŒrme ve dökÃŒmantasyon için Pydantic gibi bir ÌçÌncÃŒ parti kÃŒtÃŒphane kullanmıyor, kendi içerisinde bunlara sahip. Yani bu veri tipi tanımlarını tekrar kullanmak pek de kolay değil. + +Biraz daha detaylı ayarlamalara gerek duyuyor. Ayrıca ASGI yerine WSGI'a dayanıyor. Yani Uvicorn, Starlette ve Sanic gibi araçların yÃŒksek performansından faydalanacak şekilde tasarlanmamış. + +Bağımlılık enjeksiyonu sistemi bağımlılıkların önceden kaydedilmesini ve sonrasında belirlenen veri tiplerine göre çözÃŒlmesini gerektiriyor. Yani spesifik bir tip, birden fazla bileşen ile belirlenemiyor. + +Yol'lar fonksiyonun ÃŒstÃŒnde endpoint'i işleyen dekoratörler yerine farklı yerlerde tanımlanan fonksiyonlarla belirlenir. Bu Flask (ve Starlette) yerine daha çok Django'nun yaklaşımına daha yakın bir metot. Bu, kodda nispeten birbiriyle sıkı ilişkili olan şeyleri ayırmaya sebep oluyor. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Model özelliklerinin "standart" değerlerini kullanarak veri tipleri için ekstra veri doğrulama koşulları tanımlamalı. Bu editör desteğini geliştiriyor ve daha önceden Pydantic'te yoktu. + + Bu aslında Pydantic'in de aynı doğrulama stiline geçmesinde ilham kaynağı oldu. Şu anda bÃŒtÃŒn bu özellikler Pydantic'in yapısında yer alıyor. + +### Hug + +Hug, Python tip belirteçlerini kullanarak API parametrelerinin tipini belirlemeyi uygulayan ilk framework'lerdendi. Bu, diğer araçlara da ilham kaynağı olan harika bir fikirdi. + +Tip belirlerken standart Python veri tipleri yerine kendi özel tiplerini kullandı, yine de bu ileriye dönÃŒk devasa bir adımdı. + +Hug ayrıca tÃŒm API'ı JSON ile ifade eden özel bir şema oluşturan ilk framework'lerdendir. + +OpenAPI veya JSON Şeması gibi bir standarda bağlı değildi. Yani Swagger UI gibi diğer araçlarla entegre etmek kolay olmazdı. Ama yine de, bu oldukça yenilikçi bir fikirdi. + +Ayrıca ilginç ve çok rastlanmayan bir özelliği vardı: aynı framework'ÃŒ kullanarak hem API'lar hem de CLI'lar oluşturmak mÃŒmkÃŒndÃŒ. + +Senkron çalışan Python web framework'lerinin standardına (WSGI) dayandığından dolayı Websocket'leri ve diğer şeyleri işleyemiyor, ancak yine de yÃŒksek performansa sahip. + +!!! info "Bilgi" + Hug, Python dosyalarında bulunan dahil etme satırlarını otomatik olarak sıralayan harika bir araç olan `isort`'un geliştiricisi Timothy Crosley tarafından geliştirildi. + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Hug, APIStar'ın çeşitli kısımlarında esin kaynağı oldu ve APIStar'la birlikte en umut verici bulduğum araçlardan biriydi. + + **FastAPI**, Python tip belirteçlerini kullanarak parametre belirlemede ve API'ı otomatık tanımlayan bir şema ÃŒretmede de Hug'a esinlendi. + + **FastAPI**'ın header ve çerez tanımlamak için fonksiyonlarda `response` parametresini belirtmesinde de Hug'dan ilham alındı. + +### APIStar (<= 0.5) + +**FastAPI**'ı geliştirmeye başlamadan hemen önce **APIStar** sunucusunu buldum. Benim aradığım şeylerin neredeyse hepsine sahipti ve harika bir tasarımı vardı. + +Benim şimdiye kadar gördÌğÌm Python tip belirteçlerini kullanarak parametre ve istekler belirlemeyi uygulayan ilk framework'lerdendi (Molten ve NestJS'den önce). APIStar'ı da aşağı yukarı Hug ile aynı zamanlarda buldum. Fakat APIStar OpenAPI standardını kullanıyordu. + +Farklı yerlerdeki tip belirteçlerine bağlı olarak otomatik veri doğrulama, veri dönÌştÃŒrme ve OpenAPI şeması oluşturma desteği sunuyordu. + +Gövde şema tanımları Pydantic ile aynı Python tip belirteçlerini kullanmıyordu, biraz daha Marsmallow'a benziyordu. Dolayısıyla editör desteği de o kadar iyi olmazdı ama APIStar eldeki en iyi seçenekti. + +O dönemlerde karşılaştırmalarda en iyi performansa sahipti (yalnızca Starlette'e kaybediyordu). + +Başlangıçta otomatik API dökÃŒmantasyonu sunan bir web arayÃŒzÃŒ yoktu, ama ben ona Swagger UI ekleyebileceğimi biliyordum. + +Bağımlılık enjeksiyon sistemi vardı. Yukarıda bahsettiğim diğer araçlar gibi bundaki sistem de bileşenlerin önceden kaydedilmesini gerektiriyordu. Yine de harika bir özellikti. + +GÃŒvenlik entegrasyonu olmadığından dolayı APIStar'ı hiç bir zaman tam bir projede kullanamadım. Bu yÃŒzden Flask-apispec'e bağlı full-stack proje ÃŒreticilerde sahip olduğum özellikleri tamamen değiştiremedim. Bu gÃŒvenlik entegrasyonunu ekleyen bir PR oluşturmak da projelerim arasında yer alıyordu. + +Sonrasında ise projenin odağı değişti. + +Geliştiricinin Starlette'e odaklanması gerekince proje de artık bir API web framework'ÃŒ olmayı bıraktı. + +Artık APIStar, OpenAPI özelliklerini doğrulamak için bir dizi araç sunan bir proje haline geldi. + +!!! info "Bilgi" + APIStar, aşağıdaki projeleri de ÃŒreten Tom Christie tarafından geliştirildi: + + * Django REST Framework + * **FastAPI**'ın da dayandığı Starlette + * Starlette ve **FastAPI** tarafından da kullanılan Uvicorn + +!!! check "**FastAPI**'a nasıl ilham oldu?" + Var oldu. + + Aynı Python veri tipleriyle birden fazla şeyi belirleme (veri doğrulama, veri dönÌştÃŒrme ve dökÃŒmantasyon), bir yandan da harika bir editör desteği sunma, benim muhteşem bulduğum bir fikirdi. + + Uzunca bir sÃŒre boyunca benzer bir framework arayıp pek çok farklı alternatifi denedikten sonra, APIStar en iyi seçenekti. + + Sonra APIStar bir sunucu olmayı bıraktı ve Starlette oluşturuldu. Starlette, böyle bir sunucu sistemi için daha iyi bir temel sunuyordu. Bu da **FastAPI**'ın son esin kaynağıydı. + + Ben bu önceki araçlardan öğrendiklerime dayanarak **FastAPI**'ın özelliklerini arttırıp geliştiriyor, tip desteği sistemi ve diğer kısımları iyileştiriyorum ancak yine de **FastAPI**'ı APIStar'ın "ruhani varisi" olarak görÃŒyorum. + +## **FastAPI** Tarafından Kullanılanlar + +### Pydantic + +Pydantic Python tip belirteçlerine dayanan; veri doğrulama, veri dönÌştÃŒrme ve dökÃŒmantasyon tanımlamak (JSON Şema kullanarak) için bir kÃŒtÃŒphanedir. + +Tip belirteçleri kullanıyor olması onu aşırı sezgisel yapıyor. + +Marshmallow ile karşılaştırılabilir. Ancak karşılaştırmalarda Marshmallowdan daha hızlı görÃŒnÃŒyor. Aynı Python tip belirteçlerine dayanıyor ve editör desteği de harika. + +!!! check "**FastAPI** nerede kullanıyor?" + BÃŒtÃŒn veri doğrulama, veri dönÌştÃŒrme ve JSON Şemasına bağlı otomatik model dökÃŒmantasyonunu halletmek için! + + **FastAPI** yaptığı her şeyin yanı sıra bu JSON Şema verisini alıp daha sonra OpenAPI'ya yerleştiriyor. + +### Starlette + +Starlette hafif bir ASGI framework'ÃŒ ve yÃŒksek performanslı asyncio servisleri oluşturmak için ideal. + +Kullanımı çok kolay ve sezgisel, kolaylıkla genişletilebilecek ve modÃŒler bileşenlere sahip olacak şekilde tasarlandı. + +Sahip olduğu bir kaç özellik: + +* Cidden etkileyici bir performans. +* WebSocket desteği. +* İşlem-içi arka plan görevleri. +* Başlatma ve kapatma olayları. +* HTTPX ile geliştirilmiş bir test istemcisi. +* CORS, GZip, Static Files ve Streaming cevapları desteği. +* Session ve çerez desteği. +* Kodun %100'ÃŒ test kapsamında. +* Kodun %100'ÃŒ tip belirteçleriyle desteklenmiştir. +* Yalnızca bir kaç zorunlu bağımlılığa sahip. + +Starlette şu anda test edilen en hızlı Python framework'ÃŒ. Yalnızca bir sunucu olan Uvicorn'a yeniliyor, o da zaten bir framework değil. + +Starlette bÃŒtÃŒn temel web mikro framework işlevselliğini sağlıyor. + +Ancak otomatik veri doğrulama, veri dönÌştÃŒrme ve dökÃŒmantasyon sağlamyor. + +Bu, **FastAPI**'ın onun ÃŒzerine tamamen Python tip belirteçlerine bağlı olarak eklediği (Pydantic ile) ana şeylerden biri. **FastAPI** bunun yanında artı olarak bağımlılık enjeksiyonu sistemi, gÃŒvenlik araçları, OpenAPI şema ÃŒretimi ve benzeri özellikler de ekliyor. + +!!! note "Teknik Detaylar" + ASGI, Django'nun ana ekibi tarafından geliştirilen yeni bir "standart". Bir "Python standardı" (PEP) olma sÃŒrecinde fakat henÃŒz bir standart değil. + + Bununla birlikte, halihazırda birçok araç tarafından bir "standart" olarak kullanılmakta. Bu, Uvicorn'u farklı ASGI sunucularıyla (Daphne veya Hypercorn gibi) değiştirebileceğiniz veya `python-socketio` gibi ASGI ile uyumlu araçları ekleyebileciğiniz için birlikte çalışılabilirliği bÃŒyÃŒk ölçÌde arttırıyor. + +!!! check "**FastAPI** nerede kullanıyor?" + + TÃŒm temel web kısımlarında ÃŒzerine özellikler eklenerek kullanılmakta. + + `FastAPI` sınıfının kendisi direkt olarak `Starlette` sınıfını miras alıyor! + + Yani, Starlette ile yapabileceğiniz her şeyi, Starlette'in bir nevi gÌçlendirilmiş hali olan **FastAPI** ile doğrudan yapabilirsiniz. + +### Uvicorn + +Uvicorn, uvlook ile httptools ÃŒzerine kurulu ışık hzında bir ASGI sunucusudur. + +Bir web framework'ÃŒnden ziyade bir sunucudur, yani yollara bağlı yönlendirme yapmanızı sağlayan araçları yoktur. Bu daha çok Starlette (ya da **FastAPI**) gibi bir framework'ÃŒn sunucuya ek olarak sağladığı bir şeydir. + +Starlette ve **FastAPI** için tavsiye edilen sunucu Uvicorndur. + +!!! check "**FastAPI** neden tavsiye ediyor?" + **FastAPI** uygulamalarını çalıştırmak için ana web sunucusu Uvicorn! + + Gunicorn ile birleştirdiğinizde asenkron ve çoklu işlem destekleyen bir sunucu elde ediyorsunuz! + + Daha fazla detay için [Deployment](deployment/index.md){.internal-link target=_blank} bölÃŒmÃŒnÃŒ inceleyebilirsiniz. + +## Karşılaştırma ve Hız + +Uvicorn, Starlette ve FastAPI arasındakı farkı daha iyi anlamak ve karşılaştırma yapmak için [Kıyaslamalar](benchmarks.md){.internal-link target=_blank} bölÃŒmÃŒne bakın! From 2f2a7ad361d2819671c1471fa15a9e5333651872 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:17:26 +0000 Subject: [PATCH 148/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a87e4d044..6f44d597c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -47,6 +47,7 @@ hide: ### Translations +* :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md`. PR [#10502](https://github.com/tiangolo/fastapi/pull/10502) by [@alperiox](https://github.com/alperiox). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/dependencies/index.md`. PR [#10989](https://github.com/tiangolo/fastapi/pull/10989) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md`. PR [#11000](https://github.com/tiangolo/fastapi/pull/11000) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/schema-extra-example.md`. PR [#4065](https://github.com/tiangolo/fastapi/pull/4065) by [@luccasmmg](https://github.com/luccasmmg). From 381751499254f5060a69012cb4b4d0e2bb939004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jun-Ah=20=EC=A4=80=EC=95=84?= Date: Sat, 27 Jan 2024 18:28:49 +0900 Subject: [PATCH 149/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/background-tasks.md`=20(#5910?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/background-tasks.md | 102 ++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 docs/ko/docs/tutorial/background-tasks.md diff --git a/docs/ko/docs/tutorial/background-tasks.md b/docs/ko/docs/tutorial/background-tasks.md new file mode 100644 index 000000000..a951ead16 --- /dev/null +++ b/docs/ko/docs/tutorial/background-tasks.md @@ -0,0 +1,102 @@ +# 백귞띌욎드 작업 + +FastAPI에서는 응답을 반환한 후에 싀행할 백귞띌욎드 작업을 정의할 수 있습니닀. + +백귞띌욎드 작업은 큎띌읎얞튞가 응답을 받Ʞ 위핎 작업읎 완료될 때까지 Ʞ닀늎 필요가 없Ʞ 때묞에 요청 후에 발생핎알하는 작업에 맀우 유용합니닀. + +읎러한 작업에는 닀음읎 포핚됩니닀. + +* 작업을 수행한 후 전송되는 읎메음 알늌 + * 읎메음 서버에 연결하고 읎메음을 전송하는 것은 (몇 쎈 정도) "느며" 겜향읎 있윌므로, 응답은 슉시 반환하고 읎메음 알늌은 백귞띌욎드에서 전송하는 게 가능합니닀. +* 데읎터 처늬: + * 예륌 듀얎 처늬에 였랜 시간읎 걞늬는 데읎터륌 받았을 때 "Accepted" (HTTP 202)을 반환하고, 백귞띌욎드에서 데읎터륌 처늬할 수 있습니닀. + +## `백귞띌욎드 작업` 사용 + +뚌저 아래와 같읎 `BackgroundTasks`륌 임포튞하고, `BackgroundTasks`륌 _겜로 동작 핚수_ 에서 맀개변수로 가젞였고 정의합니닀. + +```Python hl_lines="1 13" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +**FastAPI** 는 `BackgroundTasks` 개첎륌 생성하고, 맀개 변수로 전달합니닀. + +## 작업 핚수 생성 + +백귞띌욎드 작업윌로 싀행할 핚수륌 정의합니닀. + +읎것은 닚순히 맀개변수륌 받을 수 있는 표쀀 핚수음 뿐입니닀. + +**FastAPI**는 읎것읎 `async def` 핚수읎든, 음반 `def` 핚수읎든 낎부적윌로 읎륌 올바륎게 처늬합니닀. + +읎 겜우, 아래 작업은 파음에 쓰는 핚수입니닀. (읎메음 볎낎Ʞ 시묌레읎션) + +귞늬고 읎 작업은 `async`와 `await`륌 사용하지 않윌므로 음반 `def` 핚수로 선얞합니닀. + +```Python hl_lines="6-9" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +## 백귞띌욎드 작업 추가 + +_겜로 동작 핚수_ 낎에서 작업 핚수륌 `.add_task()` 핚수 통핎 _백귞띌욎드 작업_ 개첎에 전달합니닀. + +```Python hl_lines="14" +{!../../../docs_src/background_tasks/tutorial001.py!} +``` + +`.add_task()` 핚수는 닀음곌 같은 읞자륌 받습니닀 : + +- 백귞띌욎드에서 싀행되는 작업 핚수 (`write_notification`). +- 작업 핚수에 순서대로 전달되얎알 하는 음렚의 읞자 (`email`). +- 작업 핚수에 전달되얎알하는 몚든 킀워드 읞자 (`message="some notification"`). + +## 의졎성 죌입 + +`BackgroundTasks`륌 의졎성 죌입 시슀템곌 핚께 사용하멎 _겜로 동작 핚수_, 종속성, 하위 종속성 등 여러 수쀀에서 BackgroundTasks 유형의 맀개변수륌 ì„ ì–ží•  수 있습니닀. + +**FastAPI**는 각 겜우에 수행할 작업곌 동음한 개첎륌 낎부적윌로 재사용하Ʞ에, 몚든 백귞띌욎드 작업읎 핚께 병합되고 나쀑에 백귞띌욎드에서 싀행됩니닀. + +=== "Python 3.6 and above" + + ```Python hl_lines="13 15 22 25" + {!> ../../../docs_src/background_tasks/tutorial002.py!} + ``` + +=== "Python 3.10 and above" + + ```Python hl_lines="11 13 20 23" + {!> ../../../docs_src/background_tasks/tutorial002_py310.py!} + ``` + +읎 예제에서는 응답읎 반환된 후에 `log.txt` 파음에 메시지가 Ʞ록됩니닀. + +요청에 쿌늬가 있는 겜우 백귞띌욎드 작업의 로귞에 Ʞ록됩니닀. + +귞늬고 _겜로 동작 핚수_ 에서 생성된 또 닀륞 백귞띌욎드 작업은 겜로 맀개 변수륌 활용하여 사용하여 메시지륌 작성합니닀. + +## Ʞ술적 섞부사항 + +`BackgroundTasks` 큎래슀는 `starlette.background`에서 직접 가젞옵니닀. + +`BackgroundTasks` 큎래슀는 FastAPI에서 직접 임포튞하거나 포핚하Ʞ 때묞에 싀수로 `BackgroundTask` (끝에 `s`가 없음)을 임포튞하더띌도 starlette.background에서 `BackgroundTask`륌 가젞였는 것을 방지할 수 있습니닀. + +(`BackgroundTask`가 아닌) `BackgroundTasks`륌 사용하멎, _겜로 동작 핚수_ 맀개변수로 사용할 수 있게 되고 나뚞지는 **FastAPI**가 대신 처늬하도록 할 수 있습니닀. 읎것은 `Request` 객첎륌 직접 사용하는 것곌 같은 방식입니닀. + +FastAPI에서 `BackgroundTask`륌 닚독윌로 사용하는 것은 여전히 가능합니닀. 하지만 객첎륌 윔드에서 생성하고, 읎 객첎륌 포핚하는 Starlette `Response`륌 반환핎알 합니닀. + +`Starlette의 공식 묞서`에서 백귞띌욎드 작업에 대한 자섞한 낎용을 확읞할 수 있습니닀. + +## 겜고 + +만앜 묎거욎 백귞띌욎드 작업을 수행핎알하고 동음한 프로섞슀에서 싀행할 필요가 없는 겜우 (예: 메몚늬, 변수 등을 공유할 필요가 없음) `Celery`와 같은 큰 도구륌 사용하멎 도움읎 될 수 있습니닀. + +RabbitMQ 또는 Redis와 같은 메시지/작업 큐 시슀템 볎닀 복잡한 구성읎 필요한 겜향읎 있지만, 여러 작업 프로섞슀륌 특히 여러 서버의 백귞띌욎드에서 싀행할 수 있습니닀. + +예제륌 볎시렀멎 [프로젝튞 생성Ʞ](../project-generation.md){.internal-link target=\_blank} 륌 찞고하섞요. 핎당 예제에는 읎믞 구성된 `Celery`가 포핚되얎 있습니닀. + +귞러나 동음한 FastAPI 앱에서 변수 및 개첎에 접귌핎알햐는 작은 백귞띌욎드 수행읎 필요한 겜우 (예 : 알늌 읎메음 볎낎Ʞ) 간닚하게 `BackgroundTasks`륌 사용핎볎섞요. + +## 요앜 + +백귞띌욎드 작업을 추가하Ʞ 위핎 _겜로 동작 핚수_ 에 맀개변수로 `BackgroundTasks`륌 가젞였고 사용합니닀. From a67f9767a0d651bc296cda221c4c6685cbdeca6d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:30:03 +0000 Subject: [PATCH 150/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6f44d597c..88db92d51 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -47,6 +47,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/background-tasks.md`. PR [#5910](https://github.com/tiangolo/fastapi/pull/5910) by [@junah201](https://github.com/junah201). * :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md`. PR [#10502](https://github.com/tiangolo/fastapi/pull/10502) by [@alperiox](https://github.com/alperiox). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/dependencies/index.md`. PR [#10989](https://github.com/tiangolo/fastapi/pull/10989) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md`. PR [#11000](https://github.com/tiangolo/fastapi/pull/11000) by [@KaniKim](https://github.com/KaniKim). From d522cdcb7a9762acaf03b25dc1fa2e500751c228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 27 Jan 2024 10:39:50 +0100 Subject: [PATCH 151/222] =?UTF-8?q?=F0=9F=93=9D=20Tweak=20docs=20for=20Beh?= =?UTF-8?q?ind=20a=20Proxy=20(#11038)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/advanced/behind-a-proxy.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/advanced/behind-a-proxy.md b/docs/en/docs/advanced/behind-a-proxy.md index 01998cc91..4da2ddefc 100644 --- a/docs/en/docs/advanced/behind-a-proxy.md +++ b/docs/en/docs/advanced/behind-a-proxy.md @@ -18,7 +18,11 @@ In this case, the original path `/app` would actually be served at `/api/v1/app` Even though all your code is written assuming there's just `/app`. -And the proxy would be **"stripping"** the **path prefix** on the fly before transmitting the request to Uvicorn, keep your application convinced that it is serving at `/app`, so that you don't have to update all your code to include the prefix `/api/v1`. +```Python hl_lines="6" +{!../../../docs_src/behind_a_proxy/tutorial001.py!} +``` + +And the proxy would be **"stripping"** the **path prefix** on the fly before transmitting the request to Uvicorn, keeping your application convinced that it is being served at `/app`, so that you don't have to update all your code to include the prefix `/api/v1`. Up to here, everything would work as normally. From 44645f882f02e98c6cb4e6d88ba035ab2966125a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 09:40:14 +0000 Subject: [PATCH 152/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 88db92d51..ab5e6a425 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Tweak docs for Behind a Proxy. PR [#11038](https://github.com/tiangolo/fastapi/pull/11038) by [@tiangolo](https://github.com/tiangolo). * 📝 Add External Link: 10 Tips for adding SQLAlchemy to FastAPI. PR [#11036](https://github.com/tiangolo/fastapi/pull/11036) by [@Donnype](https://github.com/Donnype). * 📝 Add External Link: Tips on migrating from Flask to FastAPI and vice-versa. PR [#11029](https://github.com/tiangolo/fastapi/pull/11029) by [@jtemporal](https://github.com/jtemporal). * 📝 Deprecate old tutorials: Peewee, Couchbase, encode/databases. PR [#10979](https://github.com/tiangolo/fastapi/pull/10979) by [@tiangolo](https://github.com/tiangolo). From 23fc06dab919c9067f0f1970f18fb25345030801 Mon Sep 17 00:00:00 2001 From: pablocm83 Date: Sat, 27 Jan 2024 05:43:44 -0500 Subject: [PATCH 153/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Spanish=20translat?= =?UTF-8?q?ion=20for=20`docs/es/docs/newsletter.md`=20(#10922)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/es/docs/newsletter.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/es/docs/newsletter.md diff --git a/docs/es/docs/newsletter.md b/docs/es/docs/newsletter.md new file mode 100644 index 000000000..f4dcfe155 --- /dev/null +++ b/docs/es/docs/newsletter.md @@ -0,0 +1,5 @@ +# Boletín de Noticias de FastAPI y amigos + + + + From f4e2b6f451a0e7be73aa35bc95a0fae91041532e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 10:44:06 +0000 Subject: [PATCH 154/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ab5e6a425..0759535bc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -48,6 +48,7 @@ hide: ### Translations +* 🌐 Add Spanish translation for `docs/es/docs/newsletter.md`. PR [#10922](https://github.com/tiangolo/fastapi/pull/10922) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/background-tasks.md`. PR [#5910](https://github.com/tiangolo/fastapi/pull/5910) by [@junah201](https://github.com/junah201). * :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md`. PR [#10502](https://github.com/tiangolo/fastapi/pull/10502) by [@alperiox](https://github.com/alperiox). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/dependencies/index.md`. PR [#10989](https://github.com/tiangolo/fastapi/pull/10989) by [@KaniKim](https://github.com/KaniKim). From 4b8c822c922d9d353238b5210b25bebb1e9e9252 Mon Sep 17 00:00:00 2001 From: pablocm83 Date: Sat, 27 Jan 2024 05:51:32 -0500 Subject: [PATCH 155/222] =?UTF-8?q?=F0=9F=8C=90=20Update=20Spanish=20trans?= =?UTF-8?q?lation=20for=20`docs/es/docs/features.md`=20(#10884)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/es/docs/features.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/es/docs/features.md b/docs/es/docs/features.md index d68791d63..1496628d1 100644 --- a/docs/es/docs/features.md +++ b/docs/es/docs/features.md @@ -1,3 +1,8 @@ +--- +hide: + - navigation +--- + # Características ## Características de FastAPI @@ -164,7 +169,6 @@ Con **FastAPI** obtienes todas las características de **Starlette** (porque Fas * Desempeño realmente impresionante. Es uno de los frameworks de Python más rápidos, a la par con **NodeJS** y **Go**. * Soporte para **WebSocket**. -* Soporte para **GraphQL**. * Tareas en background. * Eventos de startup y shutdown. * Cliente de pruebas construido con HTTPX. @@ -190,8 +194,6 @@ Con **FastAPI** obtienes todas las características de **Pydantic** (dado que Fa * Si sabes tipos de Python, sabes cómo usar Pydantic. * Interactúa bien con tu **IDE/linter/cerebro**: * Porque las estructuras de datos de Pydantic son solo instances de clases que tu defines, el auto-completado, el linting, mypy y tu intuición deberían funcionar bien con tus datos validados. -* **Rápido**: - * En benchmarks Pydantic es más rápido que todas las otras libraries probadas. * Valida **estructuras complejas**: * Usa modelos jerárquicos de modelos de Pydantic, `typing` de Python, `List` y `Dict`, etc. * Los validadores también permiten que se definan fácil y claramente schemas complejos de datos. Estos son chequeados y documentados como JSON Schema. From 8602873d1aefafc66ff69fb6df08d13549b7ce7f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jan 2024 10:51:51 +0000 Subject: [PATCH 156/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0759535bc..2277843e0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -48,6 +48,7 @@ hide: ### Translations +* 🌐 Update Spanish translation for `docs/es/docs/features.md`. PR [#10884](https://github.com/tiangolo/fastapi/pull/10884) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/newsletter.md`. PR [#10922](https://github.com/tiangolo/fastapi/pull/10922) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/background-tasks.md`. PR [#5910](https://github.com/tiangolo/fastapi/pull/5910) by [@junah201](https://github.com/junah201). * :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md`. PR [#10502](https://github.com/tiangolo/fastapi/pull/10502) by [@alperiox](https://github.com/alperiox). From 3b18f1bfc1069e5353c5dcbd6ba9c22063711fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 28 Jan 2024 10:53:45 +0100 Subject: [PATCH 157/222] =?UTF-8?q?=F0=9F=92=84=20Fix=20CSS=20breaking=20R?= =?UTF-8?q?TL=20languages=20(erroneously=20introduced=20by=20a=20previous?= =?UTF-8?q?=20RTL=20PR)=20(#11039)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/css/custom.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/en/docs/css/custom.css b/docs/en/docs/css/custom.css index 187040792..386aa9d7e 100644 --- a/docs/en/docs/css/custom.css +++ b/docs/en/docs/css/custom.css @@ -136,10 +136,6 @@ code { display: inline-block; } -.md-content__inner h1 { - direction: ltr !important; -} - .illustration { margin-top: 2em; margin-bottom: 2em; From 04de371a3acf82a2434209c32225332bfca82978 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 09:54:03 +0000 Subject: [PATCH 158/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2277843e0..2b443bb79 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -123,6 +123,7 @@ hide: ### Internal +* 💄 Fix CSS breaking RTL languages (erroneously introduced by a previous RTL PR). PR [#11039](https://github.com/tiangolo/fastapi/pull/11039) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Italian to `mkdocs.yml`. PR [#11016](https://github.com/tiangolo/fastapi/pull/11016) by [@alejsdev](https://github.com/alejsdev). * 🔚 Verify `mkdocs.yml` languages in CI, update `docs.py`. PR [#11009](https://github.com/tiangolo/fastapi/pull/11009) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update config in `label-approved.yml` to accept translations with 1 reviewer. PR [#11007](https://github.com/tiangolo/fastapi/pull/11007) by [@alejsdev](https://github.com/alejsdev). From c7111f67ec75fc9e1b8f5bddbbb97191404a26c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 28 Jan 2024 11:33:07 +0100 Subject: [PATCH 159/222] =?UTF-8?q?=F0=9F=93=9D=20Tweak=20wording=20in=20`?= =?UTF-8?q?help-fastapi.md`=20(#11040)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/help-fastapi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/help-fastapi.md b/docs/en/docs/help-fastapi.md index 71c580409..095fc8c58 100644 --- a/docs/en/docs/help-fastapi.md +++ b/docs/en/docs/help-fastapi.md @@ -51,7 +51,7 @@ You can: * Tell me how you use FastAPI (I love to hear that). * Hear when I make announcements or release new tools. * You can also follow @fastapi on Twitter (a separate account). -* Connect with me on **Linkedin**. +* Follow me on **Linkedin**. * Hear when I make announcements or release new tools (although I use Twitter more often 🀷‍♂). * Read what I write (or follow me) on **Dev.to** or **Medium**. * Read other ideas, articles, and read about tools I have created. From 9fd7aa8abe9d8b0deb25f4014a19e547711d4bb6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 10:33:29 +0000 Subject: [PATCH 160/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2b443bb79..251e16e4c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Docs +* 📝 Tweak wording in `help-fastapi.md`. PR [#11040](https://github.com/tiangolo/fastapi/pull/11040) by [@tiangolo](https://github.com/tiangolo). * 📝 Tweak docs for Behind a Proxy. PR [#11038](https://github.com/tiangolo/fastapi/pull/11038) by [@tiangolo](https://github.com/tiangolo). * 📝 Add External Link: 10 Tips for adding SQLAlchemy to FastAPI. PR [#11036](https://github.com/tiangolo/fastapi/pull/11036) by [@Donnype](https://github.com/Donnype). * 📝 Add External Link: Tips on migrating from Flask to FastAPI and vice-versa. PR [#11029](https://github.com/tiangolo/fastapi/pull/11029) by [@jtemporal](https://github.com/jtemporal). From 4d93299a57f3552b6c338169f3869212ed89bc9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 28 Jan 2024 11:38:34 +0100 Subject: [PATCH 161/222] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20rem?= =?UTF-8?q?ove=20Deta=20(#11041)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- docs/en/docs/deployment/cloud.md | 1 - docs/ko/docs/deployment/cloud.md | 1 - docs/zh/docs/deployment/cloud.md | 1 - 5 files changed, 7 deletions(-) diff --git a/README.md b/README.md index 2df5cba0b..764cd5a36 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 121a3b761..bd5b86e44 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -21,9 +21,6 @@ gold: title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png silver: - - url: https://www.deta.sh/?ref=fastapi - title: The launchpad for all your (team's) ideas - img: https://fastapi.tiangolo.com/img/sponsors/deta.svg - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust img: https://fastapi.tiangolo.com/img/sponsors/talkpython.png diff --git a/docs/en/docs/deployment/cloud.md b/docs/en/docs/deployment/cloud.md index b2836aeb4..29f0ad1f6 100644 --- a/docs/en/docs/deployment/cloud.md +++ b/docs/en/docs/deployment/cloud.md @@ -14,4 +14,3 @@ You might want to try their services and follow their guides: * Platform.sh * Porter -* Deta diff --git a/docs/ko/docs/deployment/cloud.md b/docs/ko/docs/deployment/cloud.md index f2b965a91..2d6938e20 100644 --- a/docs/ko/docs/deployment/cloud.md +++ b/docs/ko/docs/deployment/cloud.md @@ -14,4 +14,3 @@ * Platform.sh * Porter -* Deta diff --git a/docs/zh/docs/deployment/cloud.md b/docs/zh/docs/deployment/cloud.md index 398f61372..b086b7b6b 100644 --- a/docs/zh/docs/deployment/cloud.md +++ b/docs/zh/docs/deployment/cloud.md @@ -14,4 +14,3 @@ * Platform.sh * Porter -* Deta From 52df4d0378859404eca24910a59b088f1a7af6ea Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 10:38:55 +0000 Subject: [PATCH 162/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 251e16e4c..43c7ec244 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -124,6 +124,7 @@ hide: ### Internal +* 🔧 Update sponsors, remove Deta. PR [#11041](https://github.com/tiangolo/fastapi/pull/11041) by [@tiangolo](https://github.com/tiangolo). * 💄 Fix CSS breaking RTL languages (erroneously introduced by a previous RTL PR). PR [#11039](https://github.com/tiangolo/fastapi/pull/11039) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Italian to `mkdocs.yml`. PR [#11016](https://github.com/tiangolo/fastapi/pull/11016) by [@alejsdev](https://github.com/alejsdev). * 🔚 Verify `mkdocs.yml` languages in CI, update `docs.py`. PR [#11009](https://github.com/tiangolo/fastapi/pull/11009) by [@tiangolo](https://github.com/tiangolo). From 38f8181fdc2796c7499f77da11ebf3849c1fe9d9 Mon Sep 17 00:00:00 2001 From: xzmeng Date: Mon, 29 Jan 2024 02:00:42 +0800 Subject: [PATCH 163/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/deployment/docker.md`=20(#10296)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/deployment/docker.md | 728 ++++++++++++++++++++++++++++++ 1 file changed, 728 insertions(+) create mode 100644 docs/zh/docs/deployment/docker.md diff --git a/docs/zh/docs/deployment/docker.md b/docs/zh/docs/deployment/docker.md new file mode 100644 index 000000000..0f8906704 --- /dev/null +++ b/docs/zh/docs/deployment/docker.md @@ -0,0 +1,728 @@ +# 容噚䞭的 FastAPI - Docker + +郚眲 FastAPI 应甚皋序时垞见的方法是构建 **Linux 容噚镜像**。 通垞䜿甚 **Docker** 完成。 然后䜠可以通过几种可胜的方匏之䞀郚眲该容噚镜像。 + +䜿甚 Linux 容噚有几䞪䌘点包括**安党性**、**可倍制性**、**简单性**等。 + +!!! tip + 赶时闎并䞔已经知道这些䞜西了 跳蜬到䞋面的 [`Dockerfile` 👇](#䞺-fastapi-构建-docker-镜像)。 + + +
+Dockerfile Preview 👀 + +```Dockerfile +FROM python:3.9 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY ./app /code/app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] + +# If running behind a proxy like Nginx or Traefik add --proxy-headers +# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"] +``` + +
+ +## 什么是容噚 + +容噚䞻芁是 Linux 容噚是䞀种非垞**蜻量级**的打包应甚皋序的方匏其包括所有䟝赖项和必芁的文件同时它们可以和同䞀系统䞭的其他容噚或者其他应甚皋序/组件盞互隔犻。 + +Linux 容噚䜿甚宿䞻机劂物理服务噚、虚拟机、云服务噚等的Linux 内栞运行。 这意味着它们非垞蜻量䞎暡拟敎䞪操䜜系统的完敎虚拟机盞比。 + +通过这样的方匏容噚消耗**埈少的资源**䞎盎接运行进皋盞圓虚拟机䌚消耗曎倚。 + +容噚的进皋通垞只有䞀䞪、文件系统和眑络郜运行圚隔犻的环境这简化了郚眲、安党、匀发等。 + +## 什么是容噚镜像 + +**容噚**是从**容噚镜像**运行的。 + +容噚镜像是容噚䞭文件、环境变量和默讀呜什/皋序的**静态**版本。 **静态**这里的意思是容噚**镜像**还没有运行只是打包的文件和元数据。 + +䞎存傚静态内容的“**容噚镜像**”盞反“**容噚**”通垞指正圚运行的实䟋即正圚**执行的**。 + +圓**容噚**启劚并运行时从**容噚镜像**启劚它可以创建或曎改文件、环境变量等。这些曎改将仅存圚于该容噚䞭而䞍䌚持久化到底层的容噚镜像䞭䞍䌚保存到磁盘。 + +容噚镜像盞圓于**皋序**和文件䟋劂 `python`呜什 和某些文件 劂`main.py`。 + +而**容噚**本身䞎**容噚镜像**盞反是镜像的实际运行实䟋盞圓于**进皋**。 事实䞊容噚仅圚有**进皋运行**时才运行通垞它只是䞀䞪单独的进皋。 圓容噚䞭没有进皋运行时容噚就䌚停止。 + + + +## 容噚镜像 + +Docker 䞀盎是创建和管理**容噚镜像**和**容噚**的䞻芁工具之䞀。 + +还有䞀䞪公共 Docker Hub 其䞭包含预制的 **官方容噚镜像**, 适甚于讞倚工具、环境、数据库和应甚皋序。 + +䟋劂有䞀䞪官方的 Python 镜像。 + +还有讞倚其他镜像甚于䞍同的需芁䟋劂数据库䟋劂 + + +* PostgreSQL +* MySQL +* MongoDB +* Redis, etc. + + +通过䜿甚预制的容噚镜像可以非垞蜻束地**组合**并䜿甚䞍同的工具。 䟋劂尝试䞀䞪新的数据库。 圚倧倚数情况䞋䜠可以䜿甚**官方镜像**只需䞺其配眮环境变量即可。 + +这样圚讞倚情况䞋䜠可以了解容噚和 Docker并通过讞倚䞍同的工具和组件重倍䜿甚这些知识。 + +因歀䜠可以运行垊有䞍同内容的**倚䞪容噚**䟋劂数据库、Python 应甚皋序、垊有 React 前端应甚皋序的 Web 服务噚并通过内郚眑络将它们连接圚䞀起。 + +所有容噚管理系统劂 Docker 或 Kubernetes郜集成了这些眑络功胜。 + +## 容噚和进皋 + +**容噚镜像**通垞圚其元数据䞭包含启劚**容噚**时应运行的默讀皋序或呜什以及芁䌠递给该皋序的参数。 䞎圚呜什行䞭的情况非垞盞䌌。 + +圓 **容噚** 启劚时它将运行该呜什/皋序尜管䜠可以芆盖它并䜿其运行䞍同的呜什/皋序。 + +只芁**䞻进皋**呜什或皋序圚运行容噚就圚运行。 + +容噚通垞有䞀䞪**单䞪进皋**䜆也可以从䞻进皋启劚子进皋这样䜠就可以圚同䞀䞪容噚䞭拥有**倚䞪进皋**。 + +䜆是劂果没有**至少䞀䞪正圚运行的进皋**就䞍可胜有䞀䞪正圚运行的容噚。 劂果䞻进皋停止容噚也䌚停止。 + + +## 䞺 FastAPI 构建 Docker 镜像 + +奜吧让我们现圚构建䞀些䞜西 🚀 + +我将向䜠展瀺劂䜕基于 **官方 Python** 镜像 **从倎匀始** 䞺 FastAPI 构建 **Docker 镜像**。 + +这是䜠圚**倧倚数情况**䞋想芁做的䟋劂 + +* 䜿甚 **Kubernetes** 或类䌌工具 +* 圚 **Raspberry Pi** 䞊运行时 +* 䜿甚可䞺䜠运行容噚镜像的云服务等。 + +### 䟝赖项 + +䜠通垞䌚圚某䞪文件䞭包含应甚皋序的**䟝赖项**。 + +具䜓做法取决于䜠**安装**这些䟝赖时所䜿甚的工具。 + +最垞见的方法是创建䞀䞪`requirements.txt`文件其䞭每行包含䞀䞪包名称和它的版本。 + +䜠圓然也可以䜿甚圚[关于 FastAPI 版本](./versions.md){.internal-link target=_blank} 䞭讲到的方法来讟眮版本范囎。 + +䟋劂䜠的`requirements.txt`可胜劂䞋所瀺 + + +``` +fastapi>=0.68.0,<0.69.0 +pydantic>=1.8.0,<2.0.0 +uvicorn>=0.15.0,<0.16.0 +``` + +䜠通垞䌚䜿甚`pip`安装这些䟝赖项 + +
+ +```console +$ pip install -r requirements.txt +---> 100% +Successfully installed fastapi pydantic uvicorn +``` + +
+ +!!! info + 还有其他文件栌匏和工具来定义和安装䟝赖项。 + + 我将圚䞋面的郚分䞭向䜠展瀺䞀䞪䜿甚 Poetry 的瀺䟋。 👇 + +### 创建 **FastAPI** 代码 + +* 创建`app`目圕并进入。 +* 创建䞀䞪空文件`__init__.py`。 +* 创建䞀䞪 `main.py` 文件 + + + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +### Dockerfile + +现圚圚盞同的project目圕创建䞀䞪名䞺`Dockerfile`的文件: + +```{ .dockerfile .annotate } +# (1) +FROM python:3.9 + +# (2) +WORKDIR /code + +# (3) +COPY ./requirements.txt /code/requirements.txt + +# (4) +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (5) +COPY ./app /code/app + +# (6) +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. 从官方Python基础镜像匀始。 + +2. 将圓前工䜜目圕讟眮䞺`/code`。 + + 这是我们攟眮`requirements.txt`文件和`app`目圕的䜍眮。 + +3. 将笊合芁求的文件倍制到`/code`目圕䞭。 + + 銖先仅倍制requirements.txt文件而䞍倍制其䜙代码。 + + 由于歀文件**䞍经垞曎改**Docker 将检测到它并圚这䞀步䞭䜿甚**猓存**从而䞺䞋䞀步启甚猓存。 + +4. 安装需求文件䞭的包䟝赖项。 + + `--no-cache-dir` 选项告诉 `pip` 䞍芁圚本地保存䞋蜜的包因䞺只有圓 `pip` 再次运行以安装盞同的包时才䌚这样䜆圚䞎容噚䞀起工䜜时情况并非劂歀。 + + !!! 笔记 + `--no-cache-dir` 仅䞎 `pip` 盞关䞎 Docker 或容噚无关。 + + `--upgrade` 选项告诉 `pip` 升级蜯件包劂果已经安装。 + + 因䞺䞊䞀步倍制文件可以被 **Docker 猓存** 检测到所以歀步骀也将 **䜿甚 Docker 猓存**劂果可甚。 + + 圚匀发过皋䞭䞀次又䞀次构建镜像时圚歀步骀䞭䜿甚猓存将䞺䜠节省倧量**æ—¶é—Ž**而䞍是**每次**郜**䞋蜜和安装**所有䟝赖项。 + + +5. 将“./app”目圕倍制到“/code”目圕䞭。 + + 由于其䞭包含**曎改最频繁**的所有代码因歀 Docker **猓存**䞍䌚蜻易甚于歀操䜜或任䜕**后续步骀**。 + + 因歀将其攟圚`Dockerfile`**接近最后**的䜍眮非垞重芁以䌘化容噚镜像的构建时闎。 + +6. 讟眮**呜什**来运行 `uvicorn` 服务噚。 + + `CMD` 接受䞀䞪字笊䞲列衚每䞪字笊䞲郜是䜠圚呜什行䞭蟓入的内容并甚空栌分隔。 + + 该呜什将从 **圓前工䜜目圕** 运行即䜠䞊面䜿甚`WORKDIR /code`讟眮的同䞀`/code`目圕。 + + 因䞺皋序将从`/code`启劚并䞔其䞭包含䜠的代码的目圕`./app`所以**Uvicorn**将胜借从`app.main`䞭查看并**import**`app`。 + +!!! tip + 通过单击代码䞭的每䞪数字气泡来查看每行的䜜甚。 👆 + +䜠现圚应该具有劂䞋目圕结构 +``` +. +├── app +│   ├── __init__.py +│ └── main.py +├── Dockerfile +└── requirements.txt +``` + + +#### 圚 TLS 终止代理后面 + +劂果䜠圚 Nginx 或 Traefik 等 TLS 终止代理莟蜜均衡噚后面运行容噚请添加选项 `--proxy-headers`这将告诉 Uvicorn 信任该代理发送的标倎告诉它应甚皋序正圚 HTTPS 后面运行等信息 + +```Dockerfile +CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] +``` + +#### Docker 猓存 + +这䞪`Dockerfile`䞭有䞀䞪重芁的技巧我们銖先只单独倍制**包含䟝赖项的文件**而䞍是其䜙代码。 让我来告诉䜠这是䞺什么。 + +```Dockerfile +COPY ./requirements.txt /code/requirements.txt +``` + +Docker之类的构建工具是通过**增量**的方匏来构建这些容噚镜像的。具䜓做法是从`Dockerfile`顶郚匀始每䞀条指什生成的文件郜是镜像的“䞀层”同过把这些“层”䞀层䞀层地叠加到基础镜像䞊最后我们就埗到了最终的镜像。 + +Docker 和类䌌工具圚构建镜像时也䌚䜿甚**内郚猓存**劂果自䞊次构建容噚镜像以来文件没有曎改那么它将**重新䜿甚䞊次创建的同䞀层**而䞍是再次倍制文件并从倎匀始创建新层。 + +仅仅避免文件的倍制䞍䞀定䌚有倪倚速床提升䜆是劂果圚这䞀步䜿甚了猓存那么才可以**圚䞋䞀步䞭䜿甚猓存**。 䟋劂可以䜿甚安装䟝赖项那条指什的猓存 + +```Dockerfile +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt +``` + + +包含包䟝赖项的文件**䞍䌚频繁曎改**。 只倍制该文件䞍倍制其他的应甚代码Docker 才胜圚这䞀步**䜿甚猓存**。 + +Docker 进而胜**䜿甚猓存进行䞋䞀步**即䞋蜜并安装这些䟝赖项。 这才是我们**节省倧量时闎**的地方。 ✹ ...可以避免无聊的等埅。 😪😆 + +䞋蜜和安装䟝赖项**可胜需芁几分钟**䜆䜿甚**猓存**最倚**只需芁几秒钟**。 + +由于䜠圚匀发过皋䞭䌚䞀次又䞀次地构建容噚镜像以检查代码曎改是吊有效因歀可以环计节省倧量时闎。 + +圚`Dockerfile`末尟附近我们再添加倍制代码的指什。 由于代码是**曎改最频繁的**所以将其攟圚最后因䞺这䞀步之后的内容基本䞊郜是无法䜿甚猓存的。 + +```Dockerfile +COPY ./app /code/app +``` + +### 构建 Docker 镜像 + +现圚所有文件郜已就䜍让我们构建容噚镜像。 + +* 蜬到项目目圕圚`Dockerfile`所圚的䜍眮包含`app`目圕。 +* 构建䜠的 FastAPI 镜像 + + +
+ +```console +$ docker build -t myimage . + +---> 100% +``` + +
+ + +!!! tip + 泚意最后的 `.`它盞圓于`./`它告诉 Docker 甚于构建容噚镜像的目圕。 + + 圚本䟋䞭它是盞同的圓前目圕`.`。 + +### 启劚 Docker 容噚 + +* 根据䜠的镜像运行容噚 + +
+ +```console +$ docker run -d --name mycontainer -p 80:80 myimage +``` + +
+ +## 检查䞀䞋 + + +䜠应该胜圚Docker容噚的URL䞭检查它䟋劂: http://192.168.99.100/items/5?q=somequery 或 http://127.0.0.1/items/5?q=somequery (或其他等价的䜿甚 Docker 䞻机). + +䜠䌚看到类䌌内容 + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +## 亀互匏 API 文档 + +现圚䜠可以蜬到 http://192.168.99.100/docs 或 http://127.0.0.1/docs 或其他等价的䜿甚 Docker 䞻机。 + +䜠将看到自劚亀互匏 API 文档由 Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +## 倇选的 API 文档 + +䜠还可以访问 http://192.168.99.100/redoc 或 http://127.0.0.1/redoc 或其他等价的䜿甚 Docker 䞻机。 + +䜠将看到倇选的自劚文档由 ReDoc 提䟛 + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## 䜿甚单文件 FastAPI 构建 Docker 镜像 + +劂果䜠的 FastAPI 是单䞪文件䟋劂没有`./app`目圕的`main.py`则䜠的文件结构可胜劂䞋所瀺 + +``` +. +├── Dockerfile +├── main.py +└── requirements.txt +``` + +然后䜠只需曎改盞应的路埄即可将文件倍制到`Dockerfile`䞭 + +```{ .dockerfile .annotate hl_lines="10 13" } +FROM python:3.9 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (1) +COPY ./main.py /code/ + +# (2) +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. 盎接将`main.py`文件倍制到`/code`目圕䞭䞍包含任䜕`./app`目圕。 + +2. 运行 Uvicorn 并告诉它从 `main` 富入 `app` 对象而䞍是从 `app.main` 富入。 + +然后调敎Uvicorn呜什䜿甚新暡块`main`而䞍是`app.main`来富入FastAPI 实䟋`app`。 + +## 郚眲抂念 + +我们再谈谈容噚方面的䞀些盞同的[郚眲抂念](./concepts.md){.internal-link target=_blank}。 + +容噚䞻芁是䞀种简化**构建和郚眲**应甚皋序的过皋的工具䜆它们并䞍区制执行特定的方法来倄理这些**郚眲抂念**并䞔有几种可胜的策略。 + +**奜消息**是对于每种䞍同的策略郜有䞀种方法可以涵盖所有郚眲抂念。 🎉 + +让我们从容噚的角床回顟䞀䞋这些**郚眲抂念** + +* HTTPS +* 启劚时运行 +* 重新启劚 +* 倍制运行的进皋数 +* 内存 +* 匀始前的先前步骀 + + +## HTTPS + +劂果我们只关泚 FastAPI 应甚皋序的 **容噚镜像**以及皍后运行的 **容噚**HTTPS 通垞䌚由及䞀䞪工具圚 **倖郚** 倄理。 + +它可以是及䞀䞪容噚䟋劂䜿甚 Traefik倄理 **HTTPS** 和 **自劚**获取**证乊**。 + +!!! tip + Traefik可以䞎 Docker、Kubernetes 等集成因歀䜿甚它䞺容噚讟眮和配眮 HTTPS 非垞容易。 + +或者HTTPS 可以由云服务商䜜䞺其服务之䞀进行倄理同时仍圚容噚䞭运行应甚皋序。 + +## 圚启劚和重新启劚时运行 + +通垞还有及䞀䞪工具莟莣**启劚和运行**䜠的容噚。 + +它可以盎接是**Docker**, 或者**Docker Compose**、**Kubernetes**、**云服务**等。 + +圚倧倚数或所有情况䞋有䞀䞪简单的选项可以圚启劚时运行容噚并圚倱莥时重新启劚。 䟋劂圚 Docker 䞭它是呜什行选项 `--restart`。 + +劂果䞍䜿甚容噚让应甚皋序圚启劚时运行并重新启劚可胜䌚埈麻烊䞔困隟。 䜆圚倧倚数情况䞋圓**䜿甚容噚**时默讀情况䞋䌚包含该功胜。 ✹ + +## 倍制 - 进皋数 + +劂果䜠有䞀䞪 集矀, 比劂 **Kubernetes**、Docker Swarm、Nomad 或其他类䌌的倍杂系统来管理倚台机噚䞊的分垃匏容噚那么䜠可胜垌望圚**集矀级别**倄理倍制**而䞍是圚每䞪容噚䞭䜿甚**进皋管理噚**劂垊有Worker的 Gunicorn 。 + +像 Kubernetes 这样的分垃匏容噚管理系统通垞有䞀些集成的方法来倄理**容噚的倍制**同时仍然支持䌠入请求的**莟蜜均衡**。 党郚郜圚**集矀级别**。 + +圚这些情况䞋䜠可胜垌望从倎匀始构建䞀䞪 **Docker 镜像**劂[䞊面所解释](#dockerfile)的那样安装䟝赖项并运行 **单䞪 Uvicorn 进皋**而䞍是运行 Gunicorn 和 Uvicorn workers这种。 + + +### 莟蜜均衡噚 + +䜿甚容噚时通垞䌚有䞀些组件**监听䞻端口**。 它可胜是倄理 **HTTPS** 的 **TLS 终止代理** 或䞀些类䌌的工具的及䞀䞪容噚。 + +由于该组件将接受请求的**莟蜜**并垌望以**平衡**的方匏圚worker之闎分配该请求因歀它通垞也称䞺**莟蜜均衡噚**。 + +!!! tip + 甚于 HTTPS **TLS 终止代理** 的盞同组件也可胜是 **莟蜜均衡噚**。 + +圓䜿甚容噚时䜠甚来启劚和管理容噚的同䞀系统已经具有内郚工具来䌠蟓来自该**莟蜜均衡噚**也可以是**TLS 终止代理**) 的**眑络通信**䟋劂HTTP请求到䜠的应甚皋序容噚。 + +### 䞀䞪莟蜜均衡噚 - 倚䞪worker容噚 + +圓䜿甚 **Kubernetes** 或类䌌的分垃匏容噚管理系统时䜿甚其内郚眑络机制将允讞单䞪圚䞻 **端口** 䞊䟊听的 **莟蜜均衡噚** 将通信请求䌠蟓到可胜的 **倚䞪** 运行䜠应甚皋序的容噚。 + +运行䜠的应甚皋序的每䞪容噚通垞**只有䞀䞪进皋**䟋劂运行 FastAPI 应甚皋序的 Uvicorn 进皋。 它们郜是**盞同的容噚**运行盞同的䞜西䜆每䞪容噚郜有自己的进皋、内存等。这样䜠就可以圚 CPU 的**䞍同栞心** 甚至圚**䞍同的机噚**充分利甚**并行化(parallelization)**。 + +具有**莟蜜均衡噚**的分垃匏容噚系统将**将请求蜮流分配**给䜠的应甚皋序的每䞪容噚。 因歀每䞪请求郜可以由运行䜠的应甚皋序的倚䞪**倍制容噚**之䞀来倄理。 + +通垞这䞪**莟蜜均衡噚**胜借倄理发送到集矀䞭的*其他*应甚皋序的请求䟋劂发送到䞍同的域或圚䞍同的 URL 路埄前猀䞋并正确地将该通信䌠蟓到圚集矀䞭运行的*其他*应甚皋序的对应容噚。 + + + + + + +### 每䞪容噚䞀䞪进皋 + +圚这种类型的场景䞭䜠可胜垌望**每䞪容噚有䞀䞪Uvicorn进皋**因䞺䜠已经圚集矀级别倄理倍制。 + +因歀圚这种情况䞋䜠**䞍䌚**垌望拥有像 Gunicorn 和 Uvicorn worker䞀样的进皋管理噚或者 Uvicorn 䜿甚自己的 Uvicorn worker。 䜠可胜垌望每䞪容噚䜆可胜有倚䞪容噚只有䞀䞪**单独的 Uvicorn 进皋**。 + +圚容噚内拥有及䞀䞪进皋管理噚就像䜿甚 Gunicorn 或 Uvicorn 管理 Uvicorn 工䜜线皋䞀样只䌚增加**䞍必芁的倍杂性**而䜠埈可胜已经圚集矀系统䞭倄理这些倍杂性了。 + +### 具有倚䞪进皋的容噚 + +圓然圚某些**特殊情况**䜠可胜垌望拥有 **䞀䞪容噚**其䞭包含 **Gunicorn 进皋管理噚**并圚其䞭启劚倚䞪 **Uvicorn worker进皋**。 + +圚这些情况䞋䜠可以䜿甚 **官方 Docker 镜像**其䞭包含 **Gunicorn** 䜜䞺运行倚䞪 **Uvicorn 工䜜进皋** 的进皋管理噚以及䞀些默讀讟眮来根据圓前情况调敎工䜜进皋数量 自劚CPU栞心。 我将圚䞋面的 [Gunicorn - Uvicorn 官方 Docker 镜像](#official-docker-image-with-gunicorn-uvicorn) 䞭告诉䜠曎倚盞关信息。 + +䞋面䞀些什么时候这种做法有意义的瀺䟋 + + +#### 䞀䞪简单的应甚皋序 + +劂果䜠的应甚皋序**足借简单**䜠䞍需芁至少现圚䞍需芁过倚地埮调进皋数量并䞔䜠可以䜿甚自劚默讀倌那么䜠可胜需芁容噚䞭的进皋管理噚 䜿甚官方 Docker 镜像并䞔䜠圚**单䞪服务噚**而䞍是集矀䞊运行它。 + +#### Docker Compose + +䜠可以䜿甚 **Docker Compose** 郚眲到**单䞪服务噚**而䞍是集矀因歀䜠没有䞀种简单的方法来管理容噚的倍制䜿甚 Docker Compose同时保留共享眑络和 **莟蜜均衡**。 + +然后䜠可胜垌望拥有䞀䞪**单䞪容噚**其䞭有䞀䞪**进皋管理噚**圚其䞭启劚**倚䞪worker进皋**。 + +#### Prometheus和其他原因 + +䜠还可胜有**其他原因**这将䜿䜠曎容易拥有䞀䞪垊有**倚䞪进皋**的**单䞪容噚**而䞍是拥有每䞪容噚䞭郜有**单䞪进皋**的**倚䞪容噚**。 + +䟋劂取决于䜠的讟眮䜠可以圚同䞀䞪容噚䞭拥有䞀些工具䟋劂 Prometheus exporter该工具应该有权访问**每䞪请求**。 + +圚这种情况䞋劂果䜠有**倚䞪容噚**默讀情况䞋圓 Prometheus 来**读取metrics**时它每次郜䌚获取**单䞪容噚**的metrics对于倄理该特定请求的容噚而䞍是获取所有倍制容噚的**环积metrics**。 + +圚这种情况 这种做法䌚曎加简单让**䞀䞪容噚**具有**倚䞪进皋**并圚同䞀䞪容噚䞊䜿甚本地工具䟋劂 Prometheus exporter收集所有内郚进皋的 Prometheus 指标并公匀单䞪容噚䞊的这些指标。 + +--- + +芁点是这些郜**䞍是**䜠必须盲目遵埪的**䞀成䞍变的规则**。 䜠可以根据这些思路**评䌰䜠自己的场景**并决定什么方法是最适合䜠的的系统考虑劂䜕管理以䞋抂念 + +* 安党性 - HTTPS +* 启劚时运行 +* 重新启劚 +* 倍制运行的进皋数 +* 内存 +* 匀始前的先前步骀 + +## 内存 + +劂果䜠**每䞪容噚运行䞀䞪进皋**那么每䞪容噚所消耗的内存或倚或少是定义明确的、皳定的䞔有限的劂果它们是倍制的则䞍止䞀䞪。 + +然后䜠可以圚容噚管理系统的配眮䞭讟眮盞同的内存限制和芁求䟋劂圚 **Kubernetes** 䞭。 这样它将胜借圚**可甚机噚**äž­**倍制容噚**同时考虑容噚所需的内存量以及集矀䞭机噚䞭的可甚内存量。 + +劂果䜠的应甚皋序埈**简单**这可胜**䞍是问题**并䞔䜠可胜䞍需芁指定内存限制。 䜆是劂果䜠**䜿甚倧量内存**䟋劂䜿甚**机噚孊习**暡型则应该检查䜠消耗了倚少内存并调敎**每台机噚**䞭运行的**容噚数量**也讞可以向集矀添加曎倚机噚。 + +劂果䜠**每䞪容噚运行倚䞪进皋**䟋劂䜿甚官方 Docker 镜像䜠必须确保启劚的进皋数量䞍䌚消耗比可甚内存**曎倚的内存**。 + +## 启劚之前的步骀和容噚 + +劂果䜠䜿甚容噚䟋劂 Docker、Kubernetes那么䜠可以䜿甚䞀种䞻芁方法。 + + +### 倚䞪容噚 + +劂果䜠有 **倚䞪容噚**可胜每䞪容噚郜运行䞀䞪 **单䞪进皋**䟋劂圚 **Kubernetes** 集矀䞭那么䜠可胜垌望有䞀䞪 **单独的容噚** 执行以䞋操䜜 圚单䞪容噚䞭运行单䞪进皋执行**先前步骀**即运行倍制的worker容噚之前。 + +!!! info + 劂果䜠䜿甚 Kubernetes这可胜是 Init Container。 + +劂果圚䜠的甚䟋䞭运行前面的步骀**并行倚次**没有问题䟋劂劂果䜠没有运行数据库迁移而只是检查数据库是吊已准倇奜那么䜠也可以将它们攟圚匀始䞻进皋之前圚每䞪容噚䞭。 + +### 单容噚 + +劂果䜠有䞀䞪简单的讟眮䜿甚䞀䞪**单䞪容噚**然后启劚倚䞪**工䜜进皋**或者也只是䞀䞪进皋那么䜠可以圚启劚进皋之前圚应甚皋序同䞀䞪容噚䞭运行先前的步骀。 官方 Docker 镜像内郚支持这䞀点。 + +## 垊有 Gunicorn 的官方 Docker 镜像 - Uvicorn + +有䞀䞪官方 Docker 镜像其䞭包含䞎 Uvicorn worker䞀起运行的 Gunicorn劂䞊䞀章所述[服务噚工䜜线皋 - Gunicorn 侎 Uvicorn](./server-workers.md){.internal-link target=_blank}。 + +该镜像䞻芁圚䞊述情况䞋有甚[具有倚䞪进皋和特殊情况的容噚](#containers-with-multiple-processes-and-special-cases)。 + + + +* tiangolo/uvicorn-gunicorn-fastapi. + + +!!! warning + 䜠埈有可胜䞍需芁歀基础镜像或任䜕其他类䌌的镜像最奜从倎匀始构建镜像劂[䞊面所述䞺 FastAPI 构建 Docker 镜像](#build-a-docker-image-for-fastapi)。 + +该镜像包含䞀䞪**自劚调敎**机制甚于根据可甚的 CPU 栞心讟眮**worker进皋数**。 + +它具有**合理的默讀倌**䜆䜠仍然可以䜿甚**环境变量**或配眮文件曎改和曎新所有配眮。 + +它还支持通过䞀䞪脚本运行**匀始前的先前步骀** 。 + +!!! tip + 芁查看所有配眮和选项请蜬到 Docker 镜像页面 tiangolo/uvicorn-gunicorn-fastapi。 + +### 官方 Docker 镜像䞊的进皋数 + +歀镜像䞊的**进皋数**是根据可甚的 CPU **栞心**自劚计算的。 + +这意味着它将尝试尜可胜倚地**抚取**CPU 的**性胜**。 + +䜠还可以䜿甚 **环境变量** 等配眮来调敎它。 + +䜆这也意味着由于进皋数量取决于容噚运行的 CPU因歀**消耗的内存量**也将取决于该数量。 + +因歀劂果䜠的应甚皋序消耗倧量内存䟋劂机噚孊习暡型并䞔䜠的服务噚有埈倚 CPU 栞心**䜆内存埈少**那么䜠的容噚最终可胜䌚尝试䜿甚比实际情况曎倚的内存 可甚并䞔性胜䌚䞋降埈倚甚至厩溃。 🚚 + +### 创建䞀䞪`Dockerfile` + +以䞋是劂䜕根据歀镜像创建`Dockerfile` + + +```Dockerfile +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./app /app +``` + +### 曎倧的应甚皋序 + +劂果䜠按照有关创建[具有倚䞪文件的曎倧应甚皋序](../tutorial/bigger-applications.md){.internal-link target=_blank}的郚分进行操䜜䜠的`Dockerfile`可胜看起来这样 + +```Dockerfile hl_lines="7" +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./app /app/app +``` + +### 䜕时䜿甚 + +劂果䜠䜿甚 **Kubernetes** 或其他并䞔䜠已经圚集矀级别讟眮 **倍制**并䞔具有倚䞪 **容噚**。 圚这些情况䞋䜠最奜按照䞊面的描述 **从倎匀始构建镜像**[䞺 FastAPI 构建 Docker 镜像](#build-a-docker-image-for-fastapi)。 + +该镜像䞻芁圚[具有倚䞪进皋的容噚和特殊情况](#containers-with-multiple-processes-and-special-cases)䞭描述的特殊情况䞋有甚。 䟋劂劂果䜠的应甚皋序**足借简单**基于 CPU 讟眮默讀进皋数效果埈奜䜠䞍想圚集矀级别手劚配眮倍制并䞔䞍䌚运行曎倚进皋, 或者䜠䜿甚 **Docker Compose** 进行郚眲圚单䞪服务噚䞊运行等。 + +## 郚眲容噚镜像 + +拥有容噚Docker镜像后有倚种方法可以郚眲它。 + +䟋劂 + +* 圚单䞪服务噚䞭䜿甚 **Docker Compose** +* 䜿甚 **Kubernetes** 集矀 +* 䜿甚 Docker Swarm 暡匏集矀 +* 䜿甚Nomad等其他工具 +* 䜿甚云服务获取容噚镜像并郚眲它 + +## Docker 镜像䞎Poetry + +劂果䜠䜿甚 Poetry 来管理项目的䟝赖项䜠可以䜿甚 Docker 倚阶段构建 + + + +```{ .dockerfile .annotate } +# (1) +FROM python:3.9 as requirements-stage + +# (2) +WORKDIR /tmp + +# (3) +RUN pip install poetry + +# (4) +COPY ./pyproject.toml ./poetry.lock* /tmp/ + +# (5) +RUN poetry export -f requirements.txt --output requirements.txt --without-hashes + +# (6) +FROM python:3.9 + +# (7) +WORKDIR /code + +# (8) +COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt + +# (9) +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (10) +COPY ./app /code/app + +# (11) +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] +``` + +1. 这是第䞀阶段称䞺`requirements-stage`。 + +2. 将 `/tmp` 讟眮䞺圓前工䜜目圕。 + + 这是我们生成文件`requirements.txt`的地方 + +3. 圚歀阶段安装Poetry。 + +4. 将`pyproject.toml`和`poetry.lock`文件倍制到`/tmp`目圕。 + + 因䞺它䜿甚 `./poetry.lock*` 以 `*` 结尟所以劂果该文件尚䞍可甚它䞍䌚厩溃。 + +5. 生成`requirements.txt`文件。 + +6. 这是最后阶段这里的任䜕内容郜将保留圚最终的容噚镜像䞭。 + +7. 将圓前工䜜目圕讟眮䞺`/code`。 + +8. 将 `requirements.txt` 文件倍制到 `/code` 目圕。 + + 该文件仅存圚于前䞀䞪阶段这就是䞺什么我们䜿甚 `--from-requirements-stage` 来倍制它。 + +9. 安装生成的`requirements.txt`文件䞭的䟝赖项。 + +10. 将`app`目圕倍制到`/code`目圕。 + +11. 运行`uvicorn`呜什告诉它䜿甚从`app.main`富入的`app`对象。 + +!!! tip + 单击气泡数字可查看每行的䜜甚。 + +**Docker stage** 是 `Dockerfile` 的䞀郚分甚䜜 **䞎时容噚镜像**仅甚于生成䞀些皍后䜿甚的文件。 + +第䞀阶段仅甚于 **安装 Poetry** 并䜿甚 Poetry 的 `pyproject.toml` 文件䞭的项目䟝赖项 **生成 `requirements.txt`**。 + +æ­€`requirements.txt`文件将圚**䞋䞀阶段**侎`pip`䞀起䜿甚。 + +圚最终的容噚镜像䞭**仅保留最后阶段**。 之前的阶段将被䞢匃。 + +䜿甚 Poetry 时䜿甚 **Docker 倚阶段构建** 是有意义的因䞺䜠实际䞊并䞍需芁圚最终的容噚镜像䞭安装 Poetry 及其䟝赖项䜠 **只需芁** 生成甚于安装项目䟝赖项的`requirements.txt`文件。 + +然后圚䞋䞀䞪也是最后䞀䞪阶段䜠将或倚或少地以䞎前面描述的盞同的方匏构建镜像。 + +### 圚TLS 终止代理后面 - Poetry + +同样劂果䜠圚 Nginx 或 Traefik 等 TLS 终止代理莟蜜均衡噚后面运行容噚请将选项`--proxy-headers`添加到呜什䞭 + + +```Dockerfile +CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] +``` + +## 回顟 + +䜿甚容噚系统䟋劂䜿甚**Docker**和**Kubernetes**倄理所有**郚眲抂念**变埗盞圓简单 + +* HTTPS +* 启劚时运行 +* 重新启劚 +* 倍制运行的进皋数 +* 内存 +* 匀始前的先前步骀 + +圚倧倚数情况䞋䜠可胜䞍想䜿甚任䜕基础镜像而是基于官方 Python Docker 镜像 **从倎匀始构建容噚镜像** 。 + +倄理奜`Dockerfile`和 **Docker 猓存**䞭指什的**顺序**䜠可以**最小化构建时闎**从而最倧限床地提高生产力并避免无聊。 😎 + +圚某些特殊情况䞋䜠可胜需芁䜿甚 FastAPI 的官方 Docker 镜像。 🀓 From 008be03f31d16699c7319313df998365243b3dcd Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:01:03 +0000 Subject: [PATCH 164/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 43c7ec244..b07c911d3 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/deployment/docker.md`. PR [#10296](https://github.com/tiangolo/fastapi/pull/10296) by [@xzmeng](https://github.com/xzmeng). * 🌐 Update Spanish translation for `docs/es/docs/features.md`. PR [#10884](https://github.com/tiangolo/fastapi/pull/10884) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/newsletter.md`. PR [#10922](https://github.com/tiangolo/fastapi/pull/10922) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/background-tasks.md`. PR [#5910](https://github.com/tiangolo/fastapi/pull/5910) by [@junah201](https://github.com/junah201). From 49113c35be8c51624da0f74260bd96cb5ff29bc5 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:03:58 +0800 Subject: [PATCH 165/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/project-generation.md`=20(#3831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/project-generation.md | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/zh/docs/project-generation.md diff --git a/docs/zh/docs/project-generation.md b/docs/zh/docs/project-generation.md new file mode 100644 index 000000000..feafa5333 --- /dev/null +++ b/docs/zh/docs/project-generation.md @@ -0,0 +1,84 @@ +# 项目生成 - 暡板 + +项目生成噚䞀般郜䌚提䟛埈倚初始讟眮、安党措斜、数据库甚至还准倇奜了第䞀䞪 API 端点胜垮助悚快速䞊手。 + +项目生成噚的讟眮通垞郜埈䞻观悚可以按需曎新或修改䜆对于悚的项目来诎它是非垞奜的起点。 + +## å…šæ ˆ FastAPI + PostgreSQL + +GitHubhttps://github.com/tiangolo/full-stack-fastapi-postgresql + +### å…šæ ˆ FastAPI + PostgreSQL - 功胜 + +* 完敎的 **Docker** 集成基于 Docker +* Docker Swarm 匀发暡匏 +* **Docker Compose** 本地匀发集成䞎䌘化 +* **生产可甚**的 Python 眑络服务噚䜿甚 Uvicorn 或 Gunicorn +* Python **FastAPI** 后端 +* * **速床快**可䞎 **NodeJS** 和 **Go** 比肩的极高性胜園功于 Starlette 和 Pydantic + * **盎观**区倧的猖蟑噚支持倄倄皆可自劚补党减少调试时闎 + * **简单**易孊、易甚阅读文档所需时闎曎短 + * **简短**代码重倍最小化每次参数声明郜可以实现倚䞪功胜 + * **健壮** 生产级别的代码还有自劚亀互文档 + * **基于标准**完党兌容并基于 API 匀攟标准OpenAPI 和 JSON Schema + * **曎倚功胜**包括自劚验证、序列化、亀互文档、OAuth2 JWT 什牌身仜验证等 +* **安党密码**默讀䜿甚密码哈垌 +* **JWT 什牌**身仜验证 +* **SQLAlchemy** 暡型独立于 Flask 扩展可盎接甚于 Celery Worker +* 基础的甚户暡型可按需修改或删陀 +* **Alembic** 迁移 +* **CORS**跚域资源共享 +* **Celery** Worker 可从后端其它郚分有选择地富入并䜿甚暡型和代码 +* REST 后端测试基于 Pytest并䞎 Docker 集成可独立于数据库实现完敎的 API 亀互测试。因䞺是圚 Docker 䞭运行每次郜可从倎构建新的数据存傚䜿甚 ElasticSearch、MongoDB、CouchDB 等数据库仅测试 API 运行 +* Python 侎 **Jupyter Kernels** 集成甚于远皋或 Docker 容噚内郚匀发䜿甚 Atom Hydrogen 或 Visual Studio Code 的 Jupyter 插件 +* **Vue** 前端 + * 由 Vue CLI 生成 + * **JWT 身仜验证**倄理 + * 登圕视囟 + * 登圕后星瀺䞻仪衚盘视囟 + * 䞻仪衚盘支持甚户创建䞎猖蟑 + * 甚户信息猖蟑 + * **Vuex** + * **Vue-router** + * **Vuetify** 矎化组件 + * **TypeScript** + * 基于 **Nginx** 的 Docker 服务噚䌘化了 Vue-router 配眮 + * Docker 倚阶段构建无需保存或提亀猖译的代码 + * 圚构建时运行前端测试可犁甚 + * 尜量暡块化匀箱即甚䜆仍可䜿甚 Vue CLI 重新生成或创建所需项目或倍甚所需内容 +* 䜿甚 **PGAdmin** 管理 PostgreSQL 数据库可蜻束替换䞺 PHPMyAdmin 或 MySQL +* 䜿甚 **Flower** 监控 Celery 任务 +* 䜿甚 **Traefik** 倄理前后端莟蜜平衡可把前后端攟圚同䞀䞪域䞋按路埄分隔䜆圚䞍同容噚䞭提䟛服务 +* Traefik 集成包括自劚生成 Let's Encrypt **HTTPS** 凭证 +* GitLab **CI**持续集成包括前后端测试 + +## å…šæ ˆ FastAPI + Couchbase + +GitHubhttps://github.com/tiangolo/full-stack-fastapi-couchbase + +⚠ **譊告** ⚠ + +劂果悚想从倎匀始创建新项目建议䜿甚以䞋倇选方案。 + +䟋劂项目生成噚党栈 FastAPI + PostgreSQL 䌚曎适甚这䞪项目的绎技积极甚的人也倚还包括了所有新功胜和改进内容。 + +圓然悚也可以攟心䜿甚这䞪基于 Couchbase 的生成噚它也胜正垞䜿甚。就算甚它生成项目也没有任䜕问题䞺了曎奜地满足需求悚可以自行曎新这䞪项目。 + +诊见资源仓库䞭的文档。 + +## å…šæ ˆ FastAPI + MongoDB + +  敬请期埅埗看我有没有时闎做这䞪项目。😅 🎉 + +## FastAPI + spaCy 机噚孊习暡型 + +GitHubhttps://github.com/microsoft/cookiecutter-spacy-fastapi + +### FastAPI + spaCy 机噚孊习暡型 - 功胜 + +* 集成 **spaCy** NER 暡型 +* 内眮 **Azure 讀知搜玢**请求栌匏 +* **生产可甚**的 Python 眑络服务噚䜿甚 Uvicorn 侎 Gunicorn +* 内眮 **Azure DevOps** Kubernetes (AKS) CI/CD 匀发 +* **倚语**支持可圚项目讟眮时选择 spaCy 内眮的语蚀 +* 䞍仅局限于 spaCy可**蜻束扩展**至其它暡型框架Pytorch、TensorFlow From e1119a16cb2e8ac12895945b9f1d20e8f78d3ca6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:05:04 +0000 Subject: [PATCH 166/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b07c911d3..2bf05c1ab 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/project-generation.md`. PR [#3831](https://github.com/tiangolo/fastapi/pull/3831) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/docker.md`. PR [#10296](https://github.com/tiangolo/fastapi/pull/10296) by [@xzmeng](https://github.com/xzmeng). * 🌐 Update Spanish translation for `docs/es/docs/features.md`. PR [#10884](https://github.com/tiangolo/fastapi/pull/10884) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/newsletter.md`. PR [#10922](https://github.com/tiangolo/fastapi/pull/10922) by [@pablocm83](https://github.com/pablocm83). From 5b0bff3e934754dcad520fdcb3d0167ee6c6b100 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:05:57 +0800 Subject: [PATCH 167/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/history-design-future.md`=20(#3832)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/history-design-future.md | 78 +++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/zh/docs/history-design-future.md diff --git a/docs/zh/docs/history-design-future.md b/docs/zh/docs/history-design-future.md new file mode 100644 index 000000000..56a15d003 --- /dev/null +++ b/docs/zh/docs/history-design-future.md @@ -0,0 +1,78 @@ +# 历史、讟计、未来 + +䞍久前曟有 **FastAPI** 甚户问过 + +> 这䞪项目有怎样的历史奜像它只甚了几呚就从默默无闻变埗䌗所呚知   + +圚歀我们简单回顟䞀䞋 **FastAPI** 的历史。 + +## 倇选方案 + +有那么几幎我曟领富数䞪匀发团队䞺诞倚倍杂需求创建各种 API这些需求包括机噚孊习、分垃系统、匂步任务、NoSQL 数据库等领域。 + +䜜䞺工䜜的䞀郚分我需芁调研埈倚倇选方案、还芁测试并䞔䜿甚这些倇选方案。 + +**FastAPI** 其实只是延续了这些前蟈的历史。 + +正劂[倇选方案](alternatives.md){.internal-link target=_blank}䞀章所述 + +
+没有倧家之前所做的工䜜**FastAPI** 就䞍䌚存圚。 + +以前创建的这些工具䞺它的出现提䟛了灵感。 + +圚那几幎䞭我䞀盎回避创建新的框架。銖先我尝试䜿甚各种框架、插件、工具解决 **FastAPI** 现圚的功胜。 + +䜆到了䞀定皋床之后我别无选择只胜从之前的工具䞭汲取最䌘思路并以尜量奜的方匏把这些思路敎合圚䞀起䜿甚之前甚至是䞍支持的语蚀特性Python 3.6+ 的类型提瀺从而创建䞀䞪胜满足我所有需求的框架。 + +
+ +## 调研 + +通过䜿甚之前所有的倇选方案我有机䌚从它们之䞭孊到了埈倚䞜西获取了埈倚想法并以我和我的匀发团队胜想到的最奜方匏把这些思路敎合成䞀䜓。 + +䟋劂倧家郜枅楚圚理想状态䞋它应该基于标准的 Python 类型提瀺。 + +而䞔最奜的方匏是䜿甚现有的标准。 + +因歀甚至圚匀发 **FastAPI** 前我就花了几䞪月的时闎研究 OpenAPI、JSON Schema、OAuth2 等规范。深入理解它们之闎的关系、重叠及区别之倄。 + +## 讟计 + +然后我又花了䞀些时闎从甚户角床䜿甚 FastAPI 的匀发者讟计了匀发者 **API**。 + +同时我还圚最流行的 Python 代码猖蟑噚䞭测试了埈倚思路包括 PyCharm、VS Code、基于 Jedi 的猖蟑噚。 + +根据最新 Python 匀发者调研报告星瀺这几种猖蟑噚芆盖了纊 80% 的甚户。 + +也就是诎**FastAPI** 针对差䞍倚 80% 的 Python 匀发者䜿甚的猖蟑噚进行了测试而䞔其它倧倚数猖蟑噚的工䜜方匏也䞎之类䌌因歀**FastAPI** 的䌘势几乎胜圚所有猖蟑噚䞊䜓现。 + +通过这种方匏我就胜扟到尜可胜减少代码重倍的最䜳方匏进而实现倄倄郜有自劚补党、类型提瀺䞎错误检查等支持。 + +所有这些郜是䞺了给匀发者提䟛最䜳的匀发䜓验。 + +## 需求项 + +经过测试倚种倇选方案我最终决定䜿甚 **Pydantic**并充分利甚它的䌘势。 + +我甚至䞺它做了䞍少莡献让它完矎兌容了 JSON Schema支持倚种方匏定义纊束声明并基于倚䞪猖蟑噚改进了它对猖蟑噚支持类型检查、自劚补党。 + +圚匀发期闎我还䞺 **Starlette** 做了䞍少莡献这是及䞀䞪关键需求项。 + +## 匀发 + +圓我启劚 **FastAPI** 匀发的时候绝倧倚数郚件郜已经就䜍讟计已经定义需求项和工具也已经准倇就绪盞关标准䞎规范的知识傚倇也非垞枅晰而新鲜。 + +## 未来 + +至歀**FastAPI** 及其理念已经䞺埈倚人所甚。 + +对于埈倚甚䟋它比以前埈倚倇选方案郜曎适甚。 + +埈倚匀发者和匀发团队已经䟝赖 **FastAPI** 匀发他们的项目包括我和我的团队。 + +䜆**FastAPI** 仍有埈倚改进的䜙地也还需芁添加曎倚的功胜。 + +总之**FastAPI** 前景光明。 + +圚歀我们衷心感谢[悚的垮助](help-fastapi.md){.internal-link target=_blank}。 From f81bedd853b2255b0f91107180a336448c422768 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:06:55 +0800 Subject: [PATCH 168/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/deployment/deta.md`=20(#3837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/deployment/deta.md | 244 ++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 docs/zh/docs/deployment/deta.md diff --git a/docs/zh/docs/deployment/deta.md b/docs/zh/docs/deployment/deta.md new file mode 100644 index 000000000..a7390f786 --- /dev/null +++ b/docs/zh/docs/deployment/deta.md @@ -0,0 +1,244 @@ +# 圚 Deta 䞊郚眲 FastAPI + +本节介绍劂䜕䜿甚 Deta 免莹方案郚眲 **FastAPI** 应甚。🎁 + +郚眲操䜜需芁倧纊 10 分钟。 + +!!! info "诎明" + + Deta 是 **FastAPI** 的赞助商。 🎉 + +## 基础 **FastAPI** 应甚 + +* 创建应甚文件倹䟋劂 `./fastapideta/`进入文件倹 + +### FastAPI 代码 + +* 创建包含劂䞋代码的 `main.py` + +```Python +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int): + return {"item_id": item_id} +``` + +### 需求项 + +圚文件倹里新建包含劂䞋内容的 `requirements.txt` 文件 + +```text +fastapi +``` + +!!! tip "提瀺" + + 圚 Deta 䞊郚眲时无需安装 Uvicorn虜然圚本地测试应甚时需芁安装。 + +### 文件倹架构 + +`./fastapideta/` 文件倹䞭现圚有䞀䞪文件 + +``` +. +└── main.py +└── requirements.txt +``` + +## 创建免莹 Deta 莊号 + +创建免莹的 Deta 莊号只需芁电子邮件和密码。 + +甚至䞍需芁信甚卡。 + +## 安装 CLI + +创建莊号后安装 Deta CLI + +=== "Linux, macOS" + +
+ + ```console + $ curl -fsSL https://get.deta.dev/cli.sh | sh + ``` + +
+ +=== "Windows PowerShell" + +
+ + ```console + $ iwr https://get.deta.dev/cli.ps1 -useb | iex + ``` + +
+ +安装完 CLI 后打匀新的 Terminal就胜检测到刚安装的 CLI。 + +圚新的 Terminal 里甚以䞋呜什确讀 CLI 是吊正确安装 + +
+ +```console +$ deta --help + +Deta command line interface for managing deta micros. +Complete documentation available at https://docs.deta.sh + +Usage: + deta [flags] + deta [command] + +Available Commands: + auth Change auth settings for a deta micro + +... +``` + +
+ +!!! tip "提瀺" + + 安装 CLI 遇到问题时请参阅 Deta 官档。 + +## 䜿甚 CLI 登圕 + +现圚䜿甚 CLI 登圕 Deta + +
+ +```console +$ deta login + +Please, log in from the web page. Waiting.. +Logged in successfully. +``` + +
+ +这䞪呜什䌚打匀浏览噚并自劚验证身仜。 + +## 䜿甚 Deta 郚眲 + +接䞋来䜿甚 Deta CLI 郚眲应甚 + +
+ +```console +$ deta new + +Successfully created a new micro + +// Notice the "endpoint" 🔍 + +{ + "name": "fastapideta", + "runtime": "python3.7", + "endpoint": "https://qltnci.deta.dev", + "visor": "enabled", + "http_auth": "enabled" +} + +Adding dependencies... + + +---> 100% + + +Successfully installed fastapi-0.61.1 pydantic-1.7.2 starlette-0.13.6 +``` + +
+ +悚䌚看到劂䞋 JSON 信息 + +```JSON hl_lines="4" +{ + "name": "fastapideta", + "runtime": "python3.7", + "endpoint": "https://qltnci.deta.dev", + "visor": "enabled", + "http_auth": "enabled" +} +``` + +!!! tip "提瀺" + + 悚郚眲时的 `"endpoint"` URL 可胜䌚有所䞍同。 + +## 查看效果 + +打匀浏览噚跳蜬到 `endpoint` URL。本䟋䞭是 `https://qltnci.deta.dev`䜆悚的铟接可胜䞎歀䞍同。 + +FastAPI 应甚䌚返回劂䞋 JSON 响应 + +```JSON +{ + "Hello": "World" +} +``` + +接䞋来跳蜬到 API 文档 `/docs`本䟋䞭是 `https://qltnci.deta.dev/docs`。 + +文档星瀺劂䞋 + + + +## 启甚公匀访问 + +默讀情况䞋Deta 䜿甚悚的莊号 Cookies 倄理身仜验证。 + +应甚䞀切就绪之后䜿甚劂䞋呜什让公䌗也胜看到悚的应甚 + +
+ +```console +$ deta auth disable + +Successfully disabled http auth +``` + +
+ +现圚就可以把 URL 分享给倧家他们就胜访问悚的 API 了。🚀 + +## HTTPS + +恭喜悚已经圚 Deta 䞊郚眲了 FastAPI 应甚🎉 🍰 + +还芁泚意Deta 胜借正确倄理 HTTPS因歀悚䞍必操心 HTTPS悚的客户端肯定胜有安党加密的连接。 ✅ 🔒 + +## 查看 Visor + +从 API 文档URL 是 `https://gltnci.deta.dev/docs`发送请求至*路埄操䜜* `/items/{item_id}`。 + +䟋劂ID `5`。 + +现圚跳蜬至 https://web.deta.sh。 + +巊蟹栏有䞪 "Micros" 标筟里面是所有的应甚。 + +还有䞀䞪 **Details** 和 **Visor** 标筟跳蜬到 **Visor** 标筟。 + +圚这里查看最近发送给应甚的请求。 + +悚可以猖蟑或重新䜿甚这些请求。 + + + +## 曎倚内容 + +劂果芁持久化保存应甚数据可以䜿甚提䟛了**免莹方案**的 Deta Base。 + +诊见 Deta 官档。 From 6008c04e2e05a75accd6f61ee67ebe48e9fe0ac9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:07:45 +0000 Subject: [PATCH 169/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2bf05c1ab..9edf728b7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/history-design-future.md`. PR [#3832](https://github.com/tiangolo/fastapi/pull/3832) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/project-generation.md`. PR [#3831](https://github.com/tiangolo/fastapi/pull/3831) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/docker.md`. PR [#10296](https://github.com/tiangolo/fastapi/pull/10296) by [@xzmeng](https://github.com/xzmeng). * 🌐 Update Spanish translation for `docs/es/docs/features.md`. PR [#10884](https://github.com/tiangolo/fastapi/pull/10884) by [@pablocm83](https://github.com/pablocm83). From a54ca1487607b71f94ab721b5117abf41460620a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:08:47 +0000 Subject: [PATCH 170/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9edf728b7..189e217ea 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/deployment/deta.md`. PR [#3837](https://github.com/tiangolo/fastapi/pull/3837) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/history-design-future.md`. PR [#3832](https://github.com/tiangolo/fastapi/pull/3832) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/project-generation.md`. PR [#3831](https://github.com/tiangolo/fastapi/pull/3831) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/docker.md`. PR [#10296](https://github.com/tiangolo/fastapi/pull/10296) by [@xzmeng](https://github.com/xzmeng). From 1e8b44f3e4c48528480367b4a8f44b1d7cfb8462 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:09:26 +0800 Subject: [PATCH 171/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/testing-database.md`=20(#382?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/advanced/testing-database.md | 97 +++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 docs/zh/docs/advanced/testing-database.md diff --git a/docs/zh/docs/advanced/testing-database.md b/docs/zh/docs/advanced/testing-database.md new file mode 100644 index 000000000..8dc95c25f --- /dev/null +++ b/docs/zh/docs/advanced/testing-database.md @@ -0,0 +1,97 @@ +# 测试数据库 + +悚还可以䜿甚[测试䟝赖项](testing-dependencies.md){.internal-link target=_blank}䞭的芆盖䟝赖项方法变曎测试的数据库。 + +实现讟眮其它测试数据库、圚测试后回滚数据、或预填测试数据等操䜜。 + +本章的䞻芁思路䞎䞊䞀章完党盞同。 + +## 䞺 SQL 应甚添加测试 + +䞺了䜿甚测试数据库我们芁升级 [SQL 关系型数据库](../tutorial/sql-databases.md){.internal-link target=_blank} 䞀章䞭的瀺䟋。 + +应甚的所有代码郜䞀样盎接查看那䞀章的瀺䟋代码即可。 + +本章只是新添加了测试文件。 + +正垞的䟝赖项 `get_db()` 返回数据库䌚话。 + +测试时䜿甚芆盖䟝赖项返回自定义数据库䌚话代替正垞的䟝赖项。 + +本䟋䞭芁创建仅甚于测试的䞎时数据库。 + +## 文件架构 + +创建新文件 `sql_app/tests/test_sql_app.py`。 + +因歀新的文件架构劂䞋 + +``` hl_lines="9-11" +. +└── sql_app + ├── __init__.py + ├── crud.py + ├── database.py + ├── main.py + ├── models.py + ├── schemas.py + └── tests + ├── __init__.py + └── test_sql_app.py +``` + +## 创建新的数据库䌚话 + +銖先䞺新建数据库创建新的数据库䌚话。 + +测试时䜿甚 `test.db` 替代 `sql_app.db`。 + +䜆其䜙的䌚话代码基本䞊郜是䞀样的只芁倍制就可以了。 + +```Python hl_lines="8-13" +{!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} +``` + +!!! tip "提瀺" + + 䞺减少代码重倍最奜把这段代码写成凜数圚 `database.py` 侎 `tests/test_sql_app.py`䞭䜿甚。 + + 䞺了把泚意力集䞭圚测试代码䞊本䟋只是倍制了这段代码。 + +## 创建数据库 + +因䞺现圚是想圚新文件䞭䜿甚新数据库所以芁䜿甚以䞋代码创建数据库 + +```Python +Base.metadata.create_all(bind=engine) +``` + +䞀般是圚 `main.py` 䞭调甚这行代码䜆圚 `main.py` 里这行代码甚于创建 `sql_app.db`䜆是现圚芁䞺测试创建 `test.db`。 + +因歀芁圚测试代码䞭添加这行代码创建新的数据库文件。 + +```Python hl_lines="16" +{!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} +``` + +## 芆盖䟝赖项 + +接䞋来创建芆盖䟝赖项并䞺应甚添加芆盖内容。 + +```Python hl_lines="19-24 27" +{!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} +``` + +!!! tip "提瀺" + + `overrider_get_db()` 侎 `get_db` 的代码几乎完党䞀样只是 `overrider_get_db` 䞭䜿甚测试数据库的 `TestingSessionLocal`。 + +## 测试应甚 + +然后就可以正垞测试了。 + +```Python hl_lines="32-47" +{!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} +``` + +测试期闎所有圚数据库䞭所做的修改郜圚 `test.db` 里䞍䌚圱响䞻应甚的 `sql_app.db`。 From 539e032b2d93150a2101a102ed6020b96bd8e325 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:11:59 +0000 Subject: [PATCH 172/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 189e217ea..c36c220b9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-database.md`. PR [#3821](https://github.com/tiangolo/fastapi/pull/3821) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/deta.md`. PR [#3837](https://github.com/tiangolo/fastapi/pull/3837) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/history-design-future.md`. PR [#3832](https://github.com/tiangolo/fastapi/pull/3832) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/project-generation.md`. PR [#3831](https://github.com/tiangolo/fastapi/pull/3831) by [@jaystone776](https://github.com/jaystone776). From 4b7fa89f4ed09fc447c7d82c46c0f1843393639d Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:12:29 +0800 Subject: [PATCH 173/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/testing-websockets.md`=20(#3?= =?UTF-8?q?817)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/advanced/testing-websockets.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/zh/docs/advanced/testing-websockets.md diff --git a/docs/zh/docs/advanced/testing-websockets.md b/docs/zh/docs/advanced/testing-websockets.md new file mode 100644 index 000000000..f303e1d67 --- /dev/null +++ b/docs/zh/docs/advanced/testing-websockets.md @@ -0,0 +1,13 @@ +# 测试 WebSockets + +测试 WebSockets 也䜿甚 `TestClient`。 + +䞺歀芁圚 `with` 语句䞭䜿甚 `TestClient` 连接 WebSocket。 + +```Python hl_lines="27-31" +{!../../../docs_src/app_testing/tutorial002.py!} +``` + +!!! note "笔记" + + 曎倚细节诊见 Starlette 官档 - 测试 WebSockets。 From 92cf191f1ff0989b85126c1cd2860b511b86539a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:17:01 +0000 Subject: [PATCH 174/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c36c220b9..c9a2fc3da 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-websockets.md`. PR [#3817](https://github.com/tiangolo/fastapi/pull/3817) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-database.md`. PR [#3821](https://github.com/tiangolo/fastapi/pull/3821) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/deta.md`. PR [#3837](https://github.com/tiangolo/fastapi/pull/3837) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/history-design-future.md`. PR [#3832](https://github.com/tiangolo/fastapi/pull/3832) by [@jaystone776](https://github.com/jaystone776). From eaf394d3646aef4e73eaf84168506a9dc78f76d1 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:21:02 +0800 Subject: [PATCH 175/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/testing-events.md`=20(#3818)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/advanced/testing-events.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/zh/docs/advanced/testing-events.md diff --git a/docs/zh/docs/advanced/testing-events.md b/docs/zh/docs/advanced/testing-events.md new file mode 100644 index 000000000..222a67c8c --- /dev/null +++ b/docs/zh/docs/advanced/testing-events.md @@ -0,0 +1,7 @@ +# 测试事件启劚 - 关闭 + +䜿甚 `TestClient` 和 `with` 语句圚测试䞭运行事件倄理噚`startup` 侎 `shutdown`。 + +```Python hl_lines="9-12 20-24" +{!../../../docs_src/app_testing/tutorial003.py!} +``` From fc4606e1d005549c324641e882c91cce795b9687 Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:22:37 +0800 Subject: [PATCH 176/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/behind-a-proxy.md`=20(#3820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/advanced/behind-a-proxy.md | 351 ++++++++++++++++++++++++ 1 file changed, 351 insertions(+) create mode 100644 docs/zh/docs/advanced/behind-a-proxy.md diff --git a/docs/zh/docs/advanced/behind-a-proxy.md b/docs/zh/docs/advanced/behind-a-proxy.md new file mode 100644 index 000000000..738bd7119 --- /dev/null +++ b/docs/zh/docs/advanced/behind-a-proxy.md @@ -0,0 +1,351 @@ +# 䜿甚代理 + +有些情况䞋悚可胜芁䜿甚 Traefik 或 Nginx 等**代理**服务噚并添加应甚䞍胜识别的附加路埄前猀配眮。 + +歀时芁䜿甚 `root_path` 配眮应甚。 + +`root_path` 是 ASGI 规范提䟛的机制FastAPI 就是基于歀规范匀发的通过 Starlette。 + +`root_path` 甚于倄理这些特定情况。 + +圚挂蜜子应甚时也可以圚内郚䜿甚。 + +## 移陀路埄前猀的代理 + +本䟋䞭移陀路埄前猀的代理是指圚代码䞭声明路埄 `/app`然后圚应甚顶层添加代理把 **FastAPI** 应甚攟圚 `/api/v1` 路埄䞋。 + +本䟋的原始路埄 `/app` 实际䞊是圚 `/api/v1/app` 提䟛服务。 + +哪怕所有代码郜假讟只有 `/app`。 + +代理只圚把请求䌠送给 Uvicorn 之前才䌚**移陀路埄前猀**让应甚以䞺它是圚 `/app` 提䟛服务因歀䞍必圚代码䞭加入前猀 `/api/v1`。 + +䜆之后圚前端打匀 API 文档时代理䌚芁求圚 `/openapi.json`而䞍是 `/api/v1/openapi.json` 䞭提取 OpenAPI 抂囟。 + +因歀 运行圚浏览噚䞭的前端䌚尝试访问 `/openapi.json`䜆没有办法获取 OpenAPI 抂囟。 + +这是因䞺应甚䜿甚了以 `/api/v1` 䞺路埄前猀的代理前端芁从 `/api/v1/openapi.json` 䞭提取 OpenAPI 抂囟。 + +```mermaid +graph LR + +browser("Browser") +proxy["Proxy on http://0.0.0.0:9999/api/v1/app"] +server["Server on http://127.0.0.1:8000/app"] + +browser --> proxy +proxy --> server +``` + +!!! tip "提瀺" + + IP `0.0.0.0` 垞甚于指皋序监听本机或服务噚䞊的所有有效 IP。 + +API 文档还需芁 OpenAPI 抂囟声明 API `server` 䜍于 `/api/v1`䜿甚代理时的 URL。䟋劂 + +```JSON hl_lines="4-8" +{ + "openapi": "3.0.2", + // More stuff here + "servers": [ + { + "url": "/api/v1" + } + ], + "paths": { + // More stuff here + } +} +``` + +本䟋䞭的 `Proxy` 是 **Traefik**`server` 是运行 FastAPI 应甚的 **Uvicorn**。 + +### 提䟛 `root_path` + +䞺歀芁以劂䞋方匏䜿甚呜什行选项 `--root-path` + +
+ +```console +$ uvicorn main:app --root-path /api/v1 + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +Hypercorn 也支持 `--root-path `选项。 + +!!! note "技术细节" + + ASGI 规范定义的 `root_path` 就是䞺了这种甚䟋。 + + å¹¶äž” `--root-path` 呜什行选项支持 `root_path`。 + +### 查看圓前的 `root_path` + +获取应甚䞺每䞪请求䜿甚的圓前 `root_path`这是 `scope` 字兞的内容也是 ASGI 规范的内容。 + +我们圚这里的信息里包含 `roo_path` 只是䞺了挔瀺。 + +```Python hl_lines="8" +{!../../../docs_src/behind_a_proxy/tutorial001.py!} +``` + +然后甚以䞋呜什启劚 Uvicorn + +
+ +```console +$ uvicorn main:app --root-path /api/v1 + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +返回的响应劂䞋 + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +### 圚 FastAPI 应甚里讟眮 `root_path` + +还有䞀种方案劂果䞍胜提䟛 `--root-path` 或等效的呜什行选项则圚创建 FastAPI 应甚时芁讟眮 `root_path` 参数。 + +```Python hl_lines="3" +{!../../../docs_src/behind_a_proxy/tutorial002.py!} +``` + +䌠递 `root_path` 给 `FastAPI` 䞎䌠递 `--root-path` 呜什行选项给 Uvicorn 或 Hypercorn 䞀样。 + +### 关于 `root_path` + +泚意服务噚Uvicorn只是把 `root_path` 䌠递给应甚。 + +圚浏览噚䞭蟓入 http://127.0.0.1:8000/app 时胜看到标准响应 + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +它䞍芁求访问 `http://127.0.0.1:800/api/v1/app`。 + +Uvicorn 预期代理圚 `http://127.0.0.1:8000/app` 访问 Uvicorn而圚顶郚添加 `/api/v1` 前猀是代理芁做的事情。 + +## 关于移陀路埄前猀的代理 + +泚意移陀路埄前猀的代理只是配眮代理的方匏之䞀。 + +倧郚分情况䞋代理默讀郜䞍䌚移陀路埄前猀。 + +未移陀路埄前猀时代理监听 `https://myawesomeapp.com` 等对象劂果浏览噚跳蜬到 `https://myawesomeapp.com/api/v1/app`䞔服务噚䟋劂 Uvicorn监听 `http://127.0.0.1:8000` 代理未移陀路埄前猀 䌚圚同样的路埄`http://127.0.0.1:8000/api/v1/app` 访问 Uvicorn。 + +## 本地测试 Traefik + +悚可以蜻易地圚本地䜿甚 Traefik 运行移陀路埄前猀的试验。 + +䞋蜜 Traefik这是䞀䞪二进制文件需芁解压文件并圚 Terminal 䞭盎接运行。 + +然后创建包含劂䞋内容的 `traefik.toml` 文件 + +```TOML hl_lines="3" +[entryPoints] + [entryPoints.http] + address = ":9999" + +[providers] + [providers.file] + filename = "routes.toml" +``` + +这䞪文件把 Traefik 监听端口讟眮䞺 `9999`并讟眮芁䜿甚及䞀䞪文件 `routes.toml`。 + +!!! tip "提瀺" + + 䜿甚端口 9999 代替标准的 HTTP 端口 80这样就䞍必䜿甚管理员权限运行`sudo`。 + +接䞋来创建 `routes.toml` + +```TOML hl_lines="5 12 20" +[http] + [http.middlewares] + + [http.middlewares.api-stripprefix.stripPrefix] + prefixes = ["/api/v1"] + + [http.routers] + + [http.routers.app-http] + entryPoints = ["http"] + service = "app" + rule = "PathPrefix(`/api/v1`)" + middlewares = ["api-stripprefix"] + + [http.services] + + [http.services.app] + [http.services.app.loadBalancer] + [[http.services.app.loadBalancer.servers]] + url = "http://127.0.0.1:8000" +``` + +这䞪文件配眮 Traefik 䜿甚路埄前猀 `/api/v1`。 + +然后它把请求重定䜍到运行圚 `http://127.0.0.1:8000` 侊的 Uvicorn。 + +现圚启劚 Traefik + +
+ +```console +$ ./traefik --configFile=traefik.toml + +INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml +``` + +
+ +接䞋来䜿甚 Uvicorn 启劚应甚并䜿甚 `--root-path` 选项 + +
+ +```console +$ uvicorn main:app --root-path /api/v1 + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +### 查看响应 + +访问含 Uvicorn 端口的 URLhttp://127.0.0.1:8000/app就胜看到标准响应 + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +!!! tip "提瀺" + + 泚意就算访问 `http://127.0.0.1:8000/app`也星瀺从选项 `--root-path` 䞭提取的 `/api/v1`这是 `root_path` 的倌。 + +打匀含 Traefik 端口的 URL包含路埄前猀http://127.0.0.1:9999/api/v1/app。 + +埗到同样的响应 + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +䜆这䞀次 URL 包含了代理提䟛的路埄前猀`/api/v1`。 + +圓然这是通过代理访问应甚的方匏因歀路埄前猀 `/app/v1` 版本才是**正确**的。 + +而䞍垊路埄前猀的版本`http://127.0.0.1:8000/app`则由 Uvicorn 盎接提䟛䞓䟛*代理*Traefik访问。 + +这挔瀺了代理Traefik劂䜕䜿甚路埄前猀以及服务噚Uvicorn劂䜕䜿甚选项 `--root-path` 侭的 `root_path`。 + +### 查看文档 + +䜆这才是有趣的地方 ✹ + +访问应甚的**官方**方匏是通过含路埄前猀的代理。因歀䞍出所料劂果没有圚 URL 䞭添加路埄前猀盎接访问通过 Uvicorn 运行的 API 文档䞍胜正垞访问因䞺需芁通过代理才胜访问。 + +蟓入 http://127.0.0.1:8000/docs 查看 API 文档 + + + +䜆蟓入**官方**铟接 `/api/v1/docs`并䜿甚端口 `9999` 访问 API 文档就胜正垞运行了🎉 + +蟓入 http://127.0.0.1:9999/api/v1/docs 查看文档 + + + +䞀切正垞。 ✔ + +这是因䞺 FastAPI 圚 OpenAPI 里䜿甚 `root_path` 提䟛的 URL 创建默讀 `server`。 + +## 附加的服务噚 + +!!! warning "譊告" + + 歀甚䟋蟃隟可以跳过。 + +默讀情况䞋**FastAPI** 䜿甚 `root_path` 的铟接圚 OpenAPI 抂囟䞭创建 `server`。 + +䜆也可以䜿甚其它倇选 `servers`䟋劂需芁同䞀䞪 API 文档䞎 staging 和生产环境亀互。 + +劂果䌠递自定义 `servers` 列衚并有 `root_path` 因䞺 API 䜿甚了代理**FastAPI** 䌚圚列衚匀倎䜿甚这䞪 `root_path` 插入**服务噚**。 + +䟋劂 + +```Python hl_lines="4-7" +{!../../../docs_src/behind_a_proxy/tutorial003.py!} +``` + +这段代码生产劂䞋 OpenAPI 抂囟 + +```JSON hl_lines="5-7" +{ + "openapi": "3.0.2", + // More stuff here + "servers": [ + { + "url": "/api/v1" + }, + { + "url": "https://stag.example.com", + "description": "Staging environment" + }, + { + "url": "https://prod.example.com", + "description": "Production environment" + } + ], + "paths": { + // More stuff here + } +} +``` + +!!! tip "提瀺" + + 泚意自劚生成服务噚时`url` 的倌 `/api/v1` 提取自 `roog_path`。 + +http://127.0.0.1:9999/api/v1/docs 的 API 文档所瀺劂䞋 + + + +!!! tip "提瀺" + + API 文档䞎所选的服务噚进行亀互。 + +### 从 `root_path` 犁甚自劚服务噚 + +劂果䞍想让 **FastAPI** 包含䜿甚 `root_path` 的自劚服务噚则芁䜿甚参数 `root_path_in_servers=False` + +```Python hl_lines="9" +{!../../../docs_src/behind_a_proxy/tutorial004.py!} +``` + +这样就䞍䌚圚 OpenAPI 抂囟䞭包含服务噚了。 + +## 挂蜜子应甚 + +劂需挂蜜子应甚诊见 [子应甚 - 挂蜜](./sub-applications.md){.internal-link target=_blank}也芁通过 `root_path` 䜿甚代理这䞎正垞应甚䞀样别无二臎。 + +FastAPI 圚内郚䜿甚 `root_path`因歀子应甚也可以正垞运行。✚ From 13c6eb2db00a51ef66f533eb60ff47d133c4084e Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:23:10 +0800 Subject: [PATCH 177/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/events.md`=20(#3815)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/advanced/events.md | 51 +++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/zh/docs/advanced/events.md diff --git a/docs/zh/docs/advanced/events.md b/docs/zh/docs/advanced/events.md new file mode 100644 index 000000000..6017b8ef0 --- /dev/null +++ b/docs/zh/docs/advanced/events.md @@ -0,0 +1,51 @@ +# 事件启劚 - 关闭 + +**FastAPI** 支持定义圚应甚启劚前或应甚关闭后执行的事件倄理噚凜数。 + +事件凜数既可以声明䞺匂步凜数`async def`也可以声明䞺普通凜数`def`。 + +!!! warning "譊告" + + **FastAPI** 只执行䞻应甚䞭的事件倄理噚䞍执行[子应甚 - 挂蜜](./sub-applications.md){.internal-link target=_blank}䞭的事件倄理噚。 + +## `startup` 事件 + +䜿甚 `startup` 事件声明 `app` 启劚前运行的凜数 + +```Python hl_lines="8" +{!../../../docs_src/events/tutorial001.py!} +``` + +本䟋䞭`startup` 事件倄理噚凜数䞺项目数据库只是**å­—å…ž**提䟛了䞀些初始倌。 + +**FastAPI** 支持倚䞪事件倄理噚凜数。 + +只有所有 `startup` 事件倄理噚运行完毕**FastAPI** 应甚才匀始接收请求。 + +## `shutdown` 事件 + +䜿甚 `shutdown` 事件声明 `app` 关闭时运行的凜数 + +```Python hl_lines="6" +{!../../../docs_src/events/tutorial002.py!} +``` + +歀倄`shutdown` 事件倄理噚凜数圚 `log.txt` 䞭写入䞀行文本 `Application shutdown`。 + +!!! info "诎明" + + `open()` 凜数䞭`mode="a"` 指的是**远加**。因歀这行文本䌚添加圚文件已有内容之后䞍䌚芆盖之前的内容。 + +!!! tip "提瀺" + + 泚意本䟋䜿甚 Python `open()` 标准凜数䞎文件亀互。 + + 这䞪凜数执行 I/O蟓入/蟓出操䜜需芁等埅内容写进磁盘。 + + 䜆 `open()` 凜数䞍支持䜿甚 `async` 侎 `await`。 + + 因歀声明事件倄理凜数芁䜿甚 `def`䞍胜䜿甚 `asnyc def`。 + +!!! info "诎明" + + 有关事件倄理噚的诊情请参阅 Starlette 官档 - 事件。 From 5f194ddcc01c06a02a179d74055a95c7f79b772a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:23:59 +0000 Subject: [PATCH 178/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c9a2fc3da..dc2b8ab3c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-events.md`. PR [#3818](https://github.com/tiangolo/fastapi/pull/3818) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-websockets.md`. PR [#3817](https://github.com/tiangolo/fastapi/pull/3817) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-database.md`. PR [#3821](https://github.com/tiangolo/fastapi/pull/3821) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/deta.md`. PR [#3837](https://github.com/tiangolo/fastapi/pull/3837) by [@jaystone776](https://github.com/jaystone776). From 39d26f3491c2e93cfada205a59d56238932ed096 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:26:17 +0000 Subject: [PATCH 179/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index dc2b8ab3c..484b4bed4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/behind-a-proxy.md`. PR [#3820](https://github.com/tiangolo/fastapi/pull/3820) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-events.md`. PR [#3818](https://github.com/tiangolo/fastapi/pull/3818) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-websockets.md`. PR [#3817](https://github.com/tiangolo/fastapi/pull/3817) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-database.md`. PR [#3821](https://github.com/tiangolo/fastapi/pull/3821) by [@jaystone776](https://github.com/jaystone776). From 1f9d5a1db9aa6ab0fe4f8a849fba873487ef3c8f Mon Sep 17 00:00:00 2001 From: jaystone776 Date: Mon, 29 Jan 2024 02:26:57 +0800 Subject: [PATCH 180/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/advanced/advanced-dependencies.md`=20?= =?UTF-8?q?(#3798)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zh/docs/advanced/advanced-dependencies.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/zh/docs/advanced/advanced-dependencies.md diff --git a/docs/zh/docs/advanced/advanced-dependencies.md b/docs/zh/docs/advanced/advanced-dependencies.md new file mode 100644 index 000000000..b2f6e3559 --- /dev/null +++ b/docs/zh/docs/advanced/advanced-dependencies.md @@ -0,0 +1,71 @@ +# 高级䟝赖项 + +## 参数化的䟝赖项 + +我们之前看到的所有䟝赖项郜是写死的凜数或类。 + +䜆也可以䞺䟝赖项讟眮参数避免声明倚䞪䞍同的凜数或类。 + +假讟芁创建校验查询参数 `q` 是吊包含固定内容的䟝赖项。 + +䜆歀倄芁把埅检验的固定内容定义䞺参数。 + +## **可调甚**实䟋 + +Python 可以把类实䟋变䞺**可调甚项**。 + +这里诎的䞍是类本身类本就是可调甚项而是类实䟋。 + +䞺歀需芁声明 `__call__` 方法 + +```Python hl_lines="10" +{!../../../docs_src/dependencies/tutorial011.py!} +``` + +本䟋䞭**FastAPI** 䜿甚 `__call__` 检查附加参数及子䟝赖项皍后还芁调甚它向*路埄操䜜凜数*䌠递倌。 + +## 参数化实䟋 + +接䞋来䜿甚 `__init__` 声明甚于**参数化**䟝赖项的实䟋参数 + +```Python hl_lines="7" +{!../../../docs_src/dependencies/tutorial011.py!} +``` + +本䟋䞭**FastAPI** 䞍䜿甚 `__init__`我们芁盎接圚代码䞭䜿甚。 + +## 创建实䟋 + +䜿甚以䞋代码创建类实䟋 + +```Python hl_lines="16" +{!../../../docs_src/dependencies/tutorial011.py!} +``` + +这样就可以**参数化**䟝赖项它包含 `checker.fixed_content` 的属性 - `"bar"`。 + +## 把实䟋䜜䞺䟝赖项 + +然后䞍芁再圚 `Depends(checker)` 䞭䜿甚 `Depends(FixedContentQueryChecker)` 而是芁䜿甚 `checker`因䞺䟝赖项是类实䟋 - `checker`䞍是类。 + +倄理䟝赖项时**FastAPI** 以劂䞋方匏调甚 `checker` + +```Python +checker(q="somequery") +``` + +  并甚*路埄操䜜凜数*的参数 `fixed_content_included` 返回䟝赖项的倌 + +```Python hl_lines="20" +{!../../../docs_src/dependencies/tutorial011.py!} +``` + +!!! tip "提瀺" + + 本章瀺䟋有些刻意也看䞍出有什么甚倄。 + + 这䞪简䟋只是䞺了诎明高级䟝赖项的运䜜机制。 + + 圚有关安党的章节䞭工具凜数将以这种方匏实现。 + + 只芁胜理解本章内容就胜理解安党工具背后的运行机制。 From 0cf8c74e464656df601cc644311bdb021d3331bb Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:27:02 +0000 Subject: [PATCH 181/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 484b4bed4..7a1b061ef 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/events.md`. PR [#3815](https://github.com/tiangolo/fastapi/pull/3815) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/behind-a-proxy.md`. PR [#3820](https://github.com/tiangolo/fastapi/pull/3820) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-events.md`. PR [#3818](https://github.com/tiangolo/fastapi/pull/3818) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-websockets.md`. PR [#3817](https://github.com/tiangolo/fastapi/pull/3817) by [@jaystone776](https://github.com/jaystone776). From b2faa22f42714ffa808f05912e4e1f35fb6d754c Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:30:52 +0000 Subject: [PATCH 182/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7a1b061ef..853330031 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/advanced/advanced-dependencies.md`. PR [#3798](https://github.com/tiangolo/fastapi/pull/3798) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/events.md`. PR [#3815](https://github.com/tiangolo/fastapi/pull/3815) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/behind-a-proxy.md`. PR [#3820](https://github.com/tiangolo/fastapi/pull/3820) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-events.md`. PR [#3818](https://github.com/tiangolo/fastapi/pull/3818) by [@jaystone776](https://github.com/jaystone776). From aae14c5379ff18f9e328bfe415f4d5275578f97b Mon Sep 17 00:00:00 2001 From: Sho Nakamura Date: Mon, 29 Jan 2024 03:36:35 +0900 Subject: [PATCH 183/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Japanese=20transla?= =?UTF-8?q?tion=20for=20`docs/ja/docs/tutorial/security/get-current-user.m?= =?UTF-8?q?d`=20(#2681)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- .../tutorial/security/get-current-user.md | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 docs/ja/docs/tutorial/security/get-current-user.md diff --git a/docs/ja/docs/tutorial/security/get-current-user.md b/docs/ja/docs/tutorial/security/get-current-user.md new file mode 100644 index 000000000..7f8dcaad2 --- /dev/null +++ b/docs/ja/docs/tutorial/security/get-current-user.md @@ -0,0 +1,114 @@ +# 珟圚のナヌザヌの取埗 + +䞀぀前の章では、䟝存性泚入システムに基づいたセキュリティシステムは、 *path operation関数* に `str` ずしお `token` を䞎えおいたした: + +```Python hl_lines="10" +{!../../../docs_src/security/tutorial001.py!} +``` + +しかし、それはただそんなに有甚ではありたせん。 + +珟圚のナヌザヌを取埗するようにしおみたしょう。 + +## ナヌザヌモデルの䜜成 + +たずは、Pydanticのナヌザヌモデルを䜜成したしょう。 + +ボディを宣蚀するのにPydanticを䜿甚するのず同じやり方で、Pydanticを別のどんなずころでも䜿うこずができたす: + +```Python hl_lines="5 12-16" +{!../../../docs_src/security/tutorial002.py!} +``` + +## 䟝存関係 `get_current_user` を䜜成 + +䟝存関係 `get_current_user` を䜜っおみたしょう。 + +䟝存関係はサブ䟝存関係を持぀こずができるのを芚えおいたすか + +`get_current_user` は前に䜜成した `oauth2_scheme` ず同じ䟝存関係を持ちたす。 + +以前盎接 *path operation* の䞭でしおいたのず同じように、新しい䟝存関係である `get_current_user` は `str` ずしお `token` を受け取るようになりたす: + +```Python hl_lines="25" +{!../../../docs_src/security/tutorial002.py!} +``` + +## ナヌザヌの取埗 + +`get_current_user` は䜜成した停物のナヌティリティ関数を䜿っお、 `str` ずしおトヌクンを受け取り、先ほどのPydanticの `User` モデルを返华したす: + +```Python hl_lines="19-22 26-27" +{!../../../docs_src/security/tutorial002.py!} +``` + +## 珟圚のナヌザヌの泚入 + +ですので、 `get_current_user` に察しお同様に *path operation* の䞭で `Depends` を利甚できたす。 + +```Python hl_lines="31" +{!../../../docs_src/security/tutorial002.py!} +``` + +Pydanticモデルの `User` ずしお、 `current_user` の型を宣蚀するこずに泚意しおください。 + +その関数の䞭ですべおの入力補完や型チェックを行う際に圹に立ちたす。 + +!!! tip "豆知識" + リク゚ストボディはPydanticモデルでも宣蚀できるこずを芚えおいるかもしれたせん。 + + ここでは `Depends` を䜿っおいるおかげで、 **FastAPI** が混乱するこずはありたせん。 + + +!!! check "確認" + 䟝存関係システムがこのように蚭蚈されおいるおかげで、 `User` モデルを返华する別の䟝存関係別の"dependables"を持぀こずができたす。 + + 同じデヌタ型を返华する䟝存関係は䞀぀だけしか持おない、ずいう制玄が入るこずはないのです。 + + +## 別のモデル + +これで、*path operation関数* の䞭で珟圚のナヌザヌを盎接取埗し、`Depends` を䜿っお、 **䟝存性泚入** レベルでセキュリティメカニズムを凊理できるようになりたした。 + +そしお、セキュリティ芁件のためにどんなモデルやデヌタでも利甚するこずができたす。この堎合は、 Pydanticモデルの `User` + +しかし、特定のデヌタモデルやクラス、型に制限されるこずはありたせん。 + +モデルを、 `id` ず `email` は持぀が、 `username` は党く持たないようにしたいですか わかりたした。同じ手段でこうしたこずもできたす。 + +ある `str` だけを持ちたい あるいはある `dict` だけですか それずも、デヌタベヌスクラスのモデルむンスタンスを盎接持ちたいですか すべお同じやり方で機胜したす。 + +実際には、あなたのアプリケヌションにはログむンするようなナヌザヌはおらず、単にアクセストヌクンを持぀ロボットやボット、別のシステムがありたすかここでも、党く同じようにすべお機胜したす。 + +あなたのアプリケヌションに必芁なのがどんな皮類のモデル、どんな皮類のクラス、どんな皮類のデヌタベヌスであったずしおも、 **FastAPI** は䟝存性泚入システムでカバヌしおくれたす。 + + +## コヌドサむズ + +この䟋は冗長に芋えるかもしれたせん。セキュリティずデヌタモデルナヌティリティ関数および *path operations* が同じファむルに混圚しおいるずいうこずを芚えおおいおください。 + +しかし、ここに重芁なポむントがありたす。 + +セキュリティず䟝存性泚入に関するものは、䞀床だけ曞きたす。 + +そしお、それは奜きなだけ耇雑にするこずができたす。それでも、䞀箇所に、䞀床だけ曞くのです。すべおの柔軟性を備えたす。 + +しかし、同じセキュリティシステムを䜿っお䜕千もの゚ンドポむント*path operations*を持぀こずができたす。 + +そしお、それら゚ンドポむントのすべお必芁な、どの郚分でもがこうした䟝存関係や、あなたが䜜成する別の䟝存関係を再利甚する利点を享受できるのです。 + +さらに、こうした䜕千もの *path operations* は、たった3行で衚珟できるのです: + +```Python hl_lines="30-32" +{!../../../docs_src/security/tutorial002.py!} +``` + +## たずめ + +これで、 *path operation関数* の䞭で盎接珟圚のナヌザヌを取埗できるようになりたした。 + +既に半分のずころたで来おいたす。 + +あずは、 `username` ず `password` を実際にそのナヌザヌやクラむアントに送る、 *path operation* を远加する必芁があるだけです。 + +次はそれを説明したす。 From ab22b795903bb9a782ccfc3d2b4e450b565f6bfc Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Jan 2024 18:43:09 +0000 Subject: [PATCH 184/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 853330031..b4337c742 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/get-current-user.md`. PR [#2681](https://github.com/tiangolo/fastapi/pull/2681) by [@sh0nk](https://github.com/sh0nk). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/advanced-dependencies.md`. PR [#3798](https://github.com/tiangolo/fastapi/pull/3798) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/events.md`. PR [#3815](https://github.com/tiangolo/fastapi/pull/3815) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/behind-a-proxy.md`. PR [#3820](https://github.com/tiangolo/fastapi/pull/3820) by [@jaystone776](https://github.com/jaystone776). From 26ab83e1571af3b229dc748e68972e446edf47ca Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Mon, 29 Jan 2024 18:32:43 +0100 Subject: [PATCH 185/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/body-multiple-params.md`=20(#?= =?UTF-8?q?10308)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/body-multiple-params.md | 308 ++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 docs/de/docs/tutorial/body-multiple-params.md diff --git a/docs/de/docs/tutorial/body-multiple-params.md b/docs/de/docs/tutorial/body-multiple-params.md new file mode 100644 index 000000000..6a237243e --- /dev/null +++ b/docs/de/docs/tutorial/body-multiple-params.md @@ -0,0 +1,308 @@ +# Body – Mehrere Parameter + +Jetzt, da wir gesehen haben, wie `Path` und `Query` verwendet werden, schauen wir uns fortgeschrittenere Verwendungsmöglichkeiten von Requestbody-Deklarationen an. + +## `Path`-, `Query`- und Body-Parameter vermischen + +Zuerst einmal, Sie können `Path`-, `Query`- und Requestbody-Parameter-Deklarationen frei mischen und **FastAPI** wird wissen, was zu tun ist. + +Und Sie können auch Body-Parameter als optional kennzeichnen, indem Sie den Defaultwert auf `None` setzen: + +=== "Python 3.10+" + + ```Python hl_lines="18-20" + {!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="18-20" + {!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="19-21" + {!> ../../../docs_src/body_multiple_params/tutorial001_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="17-19" + {!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="19-21" + {!> ../../../docs_src/body_multiple_params/tutorial001.py!} + ``` + +!!! note "Hinweis" + Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat. + +## Mehrere Body-Parameter + +Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Attributen eines `Item`s, etwa: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +Aber Sie können auch mehrere Body-Parameter deklarieren, z. B. `item` und `user`: + +=== "Python 3.10+" + + ```Python hl_lines="20" + {!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="22" + {!> ../../../docs_src/body_multiple_params/tutorial002.py!} + ``` + +In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind). + +Es wird deshalb die Parameternamen als SchlÃŒssel (Feldnamen) im Body verwenden, und erwartet einen Body wie folgt: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + } +} +``` + +!!! note "Hinweis" + Beachten Sie, dass, obwohl `item` wie zuvor deklariert wurde, es nun unter einem SchlÃŒssel `item` im Body erwartet wird. + +**FastAPI** wird die automatische Konvertierung des Requests ÃŒbernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, genau so wie der Parameter `user`. + +Es wird die Validierung dieser zusammengesetzten Daten ÃŒbernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren. + +## Einzelne Werte im Body + +So wie `Query` und `Path` fÃŒr Query- und Pfad-Parameter, hat **FastAPI** auch das Äquivalent `Body`, um Extra-Daten fÃŒr Body-Parameter zu definieren. + +Zum Beispiel, das vorherige Modell erweiternd, könnten Sie entscheiden, dass Sie einen weiteren SchlÃŒssel `importance` haben möchten, im selben Body, Seite an Seite mit `item` und `user`. + +Wenn Sie diesen Parameter einfach so hinzufÃŒgen, wird **FastAPI** annehmen, dass es ein Query-Parameter ist. + +Aber Sie können **FastAPI** instruieren, ihn als weiteren Body-SchlÃŒssel zu erkennen, indem Sie `Body` verwenden: + +=== "Python 3.10+" + + ```Python hl_lines="23" + {!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="23" + {!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="24" + {!> ../../../docs_src/body_multiple_params/tutorial003_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="20" + {!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="22" + {!> ../../../docs_src/body_multiple_params/tutorial003.py!} + ``` + +In diesem Fall erwartet **FastAPI** einen Body wie: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + }, + "importance": 5 +} +``` + +Wiederum wird es die Daten konvertieren, validieren, dokumentieren, usw. + +## Mehrere Body-Parameter und Query-Parameter + +NatÃŒrlich können Sie auch, wann immer Sie das brauchen, weitere Query-Parameter hinzufÃŒgen, zusÀtzlich zu den Body-Parametern. + +Da einfache Werte standardmÀßig als Query-Parameter interpretiert werden, mÃŒssen Sie `Query` nicht explizit hinzufÃŒgen, Sie können einfach schreiben: + +```Python +q: Union[str, None] = None +``` + +Oder in Python 3.10 und darÃŒber: + +```Python +q: str | None = None +``` + +Zum Beispiel: + +=== "Python 3.10+" + + ```Python hl_lines="27" + {!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="27" + {!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="28" + {!> ../../../docs_src/body_multiple_params/tutorial004_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="25" + {!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="27" + {!> ../../../docs_src/body_multiple_params/tutorial004.py!} + ``` + +!!! info + `Body` hat die gleichen zusÀtzlichen Validierungs- und Metadaten-Parameter wie `Query` und `Path` und andere, die Sie spÀter kennenlernen. + +## Einen einzelnen Body-Parameter einbetten + +Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter, ein Pydantic-Modell `Item`. + +Normalerweise wird **FastAPI** dann seinen JSON-Body direkt erwarten. + +Aber wenn Sie möchten, dass es einen JSON-Body erwartet, mit einem SchlÃŒssel `item` und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann können Sie den speziellen `Body`-Parameter `embed` setzen: + +```Python +item: Item = Body(embed=True) +``` + +so wie in: + +=== "Python 3.10+" + + ```Python hl_lines="17" + {!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="17" + {!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body_multiple_params/tutorial005_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="15" + {!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="17" + {!> ../../../docs_src/body_multiple_params/tutorial005.py!} + ``` + +In diesem Fall erwartet **FastAPI** einen Body wie: + +```JSON hl_lines="2" +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + } +} +``` + +statt: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +## Zusammenfassung + +Sie können mehrere Body-Parameter zu ihrer *Pfadoperation-Funktion* hinzufÃŒgen, obwohl ein Request nur einen einzigen Body enthalten kann. + +**FastAPI** wird sich darum kÃŒmmern, Ihnen korrekte Daten in Ihrer Funktion zu ÃŒberreichen, und das korrekte Schema in der *Pfadoperation* zu validieren und zu dokumentieren. + +Sie können auch einzelne Werte deklarieren, die als Teil des Bodys empfangen werden. + +Und Sie können **FastAPI** instruieren, den Body in einem SchlÃŒssel unterzubringen, selbst wenn nur ein einzelner Body-Parameter deklariert ist. From b180d39d7e03e9ae778a1cfe42d11e909131026d Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 17:33:04 +0000 Subject: [PATCH 186/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b4337c742..a4f9a4593 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/body-multiple-params.md`. PR [#10308](https://github.com/tiangolo/fastapi/pull/10308) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/get-current-user.md`. PR [#2681](https://github.com/tiangolo/fastapi/pull/2681) by [@sh0nk](https://github.com/sh0nk). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/advanced-dependencies.md`. PR [#3798](https://github.com/tiangolo/fastapi/pull/3798) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/events.md`. PR [#3815](https://github.com/tiangolo/fastapi/pull/3815) by [@jaystone776](https://github.com/jaystone776). From 32e5a37d1d2f56f496fb4cc9f9ef0d4919953ed1 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Mon, 29 Jan 2024 18:35:23 +0100 Subject: [PATCH 187/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/body.md`=20(#10295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/body.md | 213 ++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 docs/de/docs/tutorial/body.md diff --git a/docs/de/docs/tutorial/body.md b/docs/de/docs/tutorial/body.md new file mode 100644 index 000000000..97215a780 --- /dev/null +++ b/docs/de/docs/tutorial/body.md @@ -0,0 +1,213 @@ +# Requestbody + +Wenn Sie Daten von einem Client (sagen wir, einem Browser) zu Ihrer API senden, dann senden Sie diese als einen **Requestbody** (Deutsch: Anfragekörper). + +Ein **Request**body sind Daten, die vom Client zu Ihrer API gesendet werden. Ein **Response**body (Deutsch: Antwortkörper) sind Daten, die Ihre API zum Client sendet. + +Ihre API sendet fast immer einen **Response**body. Aber Clients senden nicht unbedingt immer **Request**bodys (sondern nur Metadaten). + +Um einen **Request**body zu deklarieren, verwenden Sie Pydantic-Modelle mit allen deren FÀhigkeiten und VorzÃŒgen. + +!!! info + Um Daten zu versenden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden. + + Senden Sie einen Body mit einem `GET`-Request, dann fÃŒhrt das laut Spezifikation zu undefiniertem Verhalten. Trotzdem wird es von FastAPI unterstÃŒtzt, fÃŒr sehr komplexe/extreme AnwendungsfÀlle. + + Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-BenutzeroberflÀche die Dokumentation fÃŒr den Body auch nicht an, wenn `GET` verwendet wird. Dazwischengeschaltete Proxys unterstÃŒtzen es möglicherweise auch nicht. + +## Importieren Sie Pydantics `BaseModel` + +Zuerst mÃŒssen Sie `BaseModel` von `pydantic` importieren: + +=== "Python 3.10+" + + ```Python hl_lines="2" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +## Erstellen Sie Ihr Datenmodell + +Dann deklarieren Sie Ihr Datenmodell als eine Klasse, die von `BaseModel` erbt. + +Verwenden Sie Standard-Python-Typen fÃŒr die Klassenattribute: + +=== "Python 3.10+" + + ```Python hl_lines="5-9" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="7-11" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +Wie auch bei Query-Parametern gilt, wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Ansonsten ist es erforderlich. Verwenden Sie `None`, um es als optional zu kennzeichnen. + +Zum Beispiel deklariert das obige Modell ein JSON "`object`" (oder Python-`dict`) wie dieses: + +```JSON +{ + "name": "Foo", + "description": "An optional description", + "price": 45.2, + "tax": 3.5 +} +``` + +Da `description` und `tax` optional sind (mit `None` als Defaultwert), wÀre folgendes JSON "`object`" auch gÃŒltig: + +```JSON +{ + "name": "Foo", + "price": 45.2 +} +``` + +## Deklarieren Sie es als Parameter + +Um es zu Ihrer *Pfadoperation* hinzuzufÃŒgen, deklarieren Sie es auf die gleiche Weise, wie Sie Pfad- und Query-Parameter deklariert haben: + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`. + +## Resultate + +Mit nur dieser Python-Typdeklaration, wird **FastAPI**: + +* Den Requestbody als JSON lesen. +* Die entsprechenden Typen konvertieren (falls nötig). +* Diese Daten validieren. + * Wenn die Daten ungÃŒltig sind, einen klar lesbaren Fehler zurÃŒckgeben, der anzeigt, wo und was die inkorrekten Daten waren. +* Ihnen die erhaltenen Daten im Parameter `item` ÃŒbergeben. + * Da Sie diesen in der Funktion als vom Typ `Item` deklariert haben, erhalten Sie die ganze Editor-UnterstÃŒtzung (AutovervollstÀndigung, usw.) fÃŒr alle Attribute und deren Typen. +* Eine JSON Schema Definition fÃŒr Ihr Modell generieren, welche Sie ÃŒberall sonst verwenden können, wenn es fÃŒr Ihr Projekt Sinn macht. +* Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation verwendet. + +## Automatische Dokumentation + +Die JSON-Schemas Ihrer Modelle werden Teil ihrer OpenAPI-generierten Schemas und werden in der interaktiven API Dokumentation angezeigt: + + + +Und werden auch verwendet in der API-Dokumentation innerhalb jeder *Pfadoperation*, welche sie braucht: + + + +## Editor UnterstÃŒtzung + +In Ihrem Editor, innerhalb Ihrer Funktion, erhalten Sie Typhinweise und Code-VervollstÀndigung ÃŒberall (was nicht der Fall wÀre, wenn Sie ein `dict` anstelle eines Pydantic Modells erhalten hÀtten): + + + +Sie bekommen auch Fehler-Meldungen fÃŒr inkorrekte Typoperationen: + + + +Das ist nicht zufÀllig so, das ganze Framework wurde um dieses Design herum aufgebaut. + +Und es wurde in der Designphase grÃŒndlich getestet, vor der Implementierung, um sicherzustellen, dass es mit jedem Editor funktioniert. + +Es gab sogar ein paar Änderungen an Pydantic selbst, um das zu unterstÃŒtzen. + +Die vorherigen Screenshots zeigten Visual Studio Code. + +Aber Sie bekommen die gleiche Editor-UnterstÃŒtzung in PyCharm und in den meisten anderen Python-Editoren: + + + +!!! tip "Tipp" + Wenn Sie PyCharm als Ihren Editor verwenden, probieren Sie das Pydantic PyCharm Plugin aus. + + Es verbessert die Editor-UnterstÃŒtzung fÃŒr Pydantic-Modelle, mit: + + * Code-VervollstÀndigung + * TypÃŒberprÃŒfungen + * Refaktorisierung + * Suchen + * Inspektionen + +## Das Modell verwenden + +Innerhalb der Funktion können Sie alle Attribute des Modells direkt verwenden: + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/body/tutorial002_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="21" + {!> ../../../docs_src/body/tutorial002.py!} + ``` + +## Requestbody- + Pfad-Parameter + +Sie können Pfad- und Requestbody-Parameter gleichzeitig deklarieren. + +**FastAPI** erkennt, dass Funktionsparameter, die mit Pfad-Parametern ÃŒbereinstimmen, **vom Pfad genommen** werden sollen, und dass Funktionsparameter, welche Pydantic-Modelle sind, **vom Requestbody genommen** werden sollen. + +=== "Python 3.10+" + + ```Python hl_lines="15-16" + {!> ../../../docs_src/body/tutorial003_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="17-18" + {!> ../../../docs_src/body/tutorial003.py!} + ``` + +## Requestbody- + Pfad- + Query-Parameter + +Sie können auch zur gleichen Zeit **Body-**, **Pfad-** und **Query-Parameter** deklarieren. + +**FastAPI** wird jeden Parameter korrekt erkennen und die Daten vom richtigen Ort holen. + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial004_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial004.py!} + ``` + +Die Funktionsparameter werden wie folgt erkannt: + +* Wenn der Parameter auch im **Pfad** deklariert wurde, wird er als Pfad-Parameter interpretiert. +* Wenn der Parameter ein **einfacher Typ** ist (wie `int`, `float`, `str`, `bool`, usw.), wird er als **Query**-Parameter interpretiert. +* Wenn der Parameter vom Typ eines **Pydantic-Modells** ist, wird er als Request**body** interpretiert. + +!!! note "Hinweis" + FastAPI weiß, dass der Wert von `q` nicht erforderlich ist, wegen des definierten Defaultwertes `= None` + + Das `Union` in `Union[str, None]` wird von FastAPI nicht verwendet, aber es erlaubt Ihrem Editor, Sie besser zu unterstÃŒtzen und Fehler zu erkennen. + +## Ohne Pydantic + +Wenn Sie keine Pydantic-Modelle verwenden wollen, können Sie auch **Body**-Parameter nehmen. Siehe die Dokumentation unter [Body – Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#einzelne-werte-im-body){.internal-link target=\_blank}. From 4185f0bd9d9a30935de9bfb2c00b1b9702d9c2c6 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Mon, 29 Jan 2024 18:36:19 +0100 Subject: [PATCH 188/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/body-fields.md`=20(#10310)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/body-fields.md | 115 +++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 docs/de/docs/tutorial/body-fields.md diff --git a/docs/de/docs/tutorial/body-fields.md b/docs/de/docs/tutorial/body-fields.md new file mode 100644 index 000000000..643be7489 --- /dev/null +++ b/docs/de/docs/tutorial/body-fields.md @@ -0,0 +1,115 @@ +# Body – Felder + +So wie Sie zusÀtzliche Validation und Metadaten in Parametern der **Pfadoperation-Funktion** mittels `Query`, `Path` und `Body` deklarieren, können Sie auch innerhalb von Pydantic-Modellen zusÀtzliche Validation und Metadaten deklarieren, mittels Pydantics `Field`. + +## `Field` importieren + +Importieren Sie es zuerst: + +=== "Python 3.10+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body_fields/tutorial001_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="2" + {!> ../../../docs_src/body_fields/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="4" + {!> ../../../docs_src/body_fields/tutorial001.py!} + ``` + +!!! warning "Achtung" + Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.) + +## Modellattribute deklarieren + +Dann können Sie `Field` mit Modellattributen deklarieren: + +=== "Python 3.10+" + + ```Python hl_lines="11-14" + {!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="11-14" + {!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="12-15" + {!> ../../../docs_src/body_fields/tutorial001_an.py!} + ``` + +=== "Python 3.10+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="9-12" + {!> ../../../docs_src/body_fields/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ nicht annotiert" + + !!! tip "Tipp" + Bevorzugen Sie die `Annotated`-Version, falls möglich. + + ```Python hl_lines="11-14" + {!> ../../../docs_src/body_fields/tutorial001.py!} + ``` + +`Field` funktioniert genauso wie `Query`, `Path` und `Body`, es hat die gleichen Parameter, usw. + +!!! note "Technische Details" + TatsÀchlich erstellen `Query`, `Path` und andere, die sie kennenlernen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, die ihrerseits eine Unterklasse von Pydantics `FieldInfo`-Klasse ist. + + Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurÃŒck. + + `Body` gibt auch Instanzen einer Unterklasse von `FieldInfo` zurÃŒck. Und spÀter werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind. + + Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsÀchlich Funktionen sind, die spezielle Klassen zurÃŒckgeben. + +!!! tip "Tipp" + Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`. + +## ZusÀtzliche Information hinzufÃŒgen + +Sie können zusÀtzliche Information in `Field`, `Query`, `Body`, usw. deklarieren. Und es wird im generierten JSON-Schema untergebracht. + +Sie werden spÀter mehr darÃŒber lernen, wie man zusÀtzliche Information unterbringt, wenn Sie lernen, Beispiele zu deklarieren. + +!!! warning "Achtung" + Extra-SchlÃŒssel, die `Field` ÃŒberreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese SchlÃŒssel nicht notwendigerweise Teil der OpenAPI-Spezifikation sind, könnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren. + +## Zusammenfassung + +Sie können Pydantics `Field` verwenden, um zusÀtzliche Validierungen und Metadaten fÃŒr Modellattribute zu deklarieren. + +Sie können auch Extra-SchlÃŒssel verwenden, um zusÀtzliche JSON-Schema-Metadaten zu ÃŒberreichen. From 2d886c0e7563cec5a98a823f3eb0932e3e3a394e Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 17:36:44 +0000 Subject: [PATCH 189/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a4f9a4593..f6685ed7a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/body.md`. PR [#10295](https://github.com/tiangolo/fastapi/pull/10295) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body-multiple-params.md`. PR [#10308](https://github.com/tiangolo/fastapi/pull/10308) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/get-current-user.md`. PR [#2681](https://github.com/tiangolo/fastapi/pull/2681) by [@sh0nk](https://github.com/sh0nk). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/advanced-dependencies.md`. PR [#3798](https://github.com/tiangolo/fastapi/pull/3798) by [@jaystone776](https://github.com/jaystone776). From 7c5c29de9ee7362155665cacfd93e6d76a282242 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 17:37:16 +0000 Subject: [PATCH 190/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f6685ed7a..03319666a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/body-fields.md`. PR [#10310](https://github.com/tiangolo/fastapi/pull/10310) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body.md`. PR [#10295](https://github.com/tiangolo/fastapi/pull/10295) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body-multiple-params.md`. PR [#10308](https://github.com/tiangolo/fastapi/pull/10308) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/get-current-user.md`. PR [#2681](https://github.com/tiangolo/fastapi/pull/2681) by [@sh0nk](https://github.com/sh0nk). From 11a1268fe29b0aeb8bcb69c2c0aa1721fa95fd65 Mon Sep 17 00:00:00 2001 From: Reza Rohani Date: Mon, 29 Jan 2024 21:18:49 +0330 Subject: [PATCH 191/222] =?UTF-8?q?=F0=9F=8C=90=20Update=20Farsi=20transla?= =?UTF-8?q?tion=20for=20`docs/fa/docs/index.md`=20(#10216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fa/docs/index.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md index 248084389..cc211848b 100644 --- a/docs/fa/docs/index.md +++ b/docs/fa/docs/index.md @@ -32,9 +32,9 @@ FastAPI یک وؚ فریم‌ورک مدرن و سریع (ؚا کارایی ؚا * **سرعت**: کارایی ؚسیار ؚالا و قاؚل مقایسه ؚا **NodeJS** و **Go** (ؚا ت؎کر از Starlette و Pydantic). [یکی از سریع‌ترین فریم‌ورک‌های ٟایتونی موجود](#performance). -* **کدنویسی سریع**: افزای؎ Û²Û°Û° تا Û³Û°Û° درصدی سرعت توسعه فاؚلیت‌های جدید. * +* **کدنویسی سریع**: افزای؎ Û²Û°Û° تا Û³Û°Û° درصدی سرعت توسعه قاؚلیت‌های جدید. * * **ؚاگ کمتر**: کاه؎ ÛŽÛ° درصدی خطاهای انسانی (ؚرنامه‌نویسی). * -* **غریزی**: ٟ؎تیؚانی فوق‌العاده در محیط‌های توسعه یکٟارچه (IDE). تکمیل در همه ؚخ؎‌های کد. کاه؎ زمان رفع ؚاگ. +* **هو؎مندانه**: ٟ؎تیؚانی فوق‌العاده در محیط‌های توسعه یکٟارچه (IDE). تکمیل در همه ؚخ؎‌های کد. کاه؎ زمان رفع ؚاگ. * **آسان**: طراحی ؎ده ؚرای یادگیری و استفاده آسان. کاه؎ زمان مورد نیاز ؚرای مراجعه ØšÙ‡ مستندات. * **کوچک**: کاه؎ تکرار در کد. چندین قاؚلیت ؚرای هر ٟارامتر (من؞ور ٟارامترهای ورودی تاؚع هندلر می‌ؚا؎د، ØšÙ‡ ؚخ؎ خلاصه در همین صفحه مراجعه ؎ود). ؚاگ کمتر. * **استوار**: ایجاد کدی آماده ؚرای استفاده در محیط ٟروداک؎ن و تولید خودکار مستندات تعاملی @@ -140,7 +140,7 @@ $ pip install "uvicorn[standard]" ## مثال ### ایجاد کنید -* فایلی ØšÙ‡ نام `main.py` ؚا محتوای زیر ایجاد کنید : +* فایلی ØšÙ‡ نام `main.py` ؚا محتوای زیر ایجاد کنید: ```Python from typing import Union @@ -163,7 +163,7 @@ def read_item(item_id: int, q: Union[str, None] = None):
همچنین می‌توانید از async def... نیز استفاده کنید -اگر در کدتان از `async` / `await` استفاده می‌کنید, از `async def` ؚرای تعریف تاؚع خود استفاده کنید: +اگر در کدتان از `async` / `await` استفاده می‌کنید، از `async def` ؚرای تعریف تاؚع خود استفاده کنید: ```Python hl_lines="9 14" from typing import Optional @@ -211,7 +211,7 @@ INFO: Application startup complete.
درؚاره دستور uvicorn main:app --reload... -دستور `uvicorn main:app` ؎امل موارد زیر است: +دستور `uvicorn main:app` ؎امل موارد زیر است: * `main`: فایل `main.py` (ماژول ٟایتون ایجاد ؎ده). * `app`: ؎یء ایجاد ؎ده در فایل `main.py` در خط `app = FastAPI()`. @@ -232,7 +232,7 @@ INFO: Application startup complete. تا اینجا ؎ما APIای ساختید که: * درخواست‌های HTTP ØšÙ‡ _مسیرهای_ `/` و `/items/{item_id}` را دریافت می‌کند. -* هردو _مسیر_ عملیات (یا HTTP _متد_) `GET` را ٟ؎تیؚانی می‌کنند. +* هردو _مسیر_ عملیات (یا HTTP _متد_) `GET` را ٟ؎تیؚانی می‌کند. * _مسیر_ `/items/{item_id}` ؎امل _ٟارامتر مسیر_ `item_id` از نوع `int` است. * _مسیر_ `/items/{item_id}` ؎امل _ٟارامتر ٟرسمان_ اختیاری `q` از نوع `str` است. @@ -254,7 +254,7 @@ INFO: Application startup complete. ## تغییر مثال -حال فایل `main.py` را مطاؚق زیر ویرای؎ کنید تا ؚتوانید ؚدنه یک درخواست `PUT` را دریافت کنید. +حال فایل `main.py` را مطاؚق زیر ویرای؎ کنید تا ؚتوانید ؚدنه یک درخواست `PUT` را دریافت کنید. ØšÙ‡ کمک Pydantic ؚدنه درخواست را ؚا انواع استاندارد ٟایتون تعریف کنید. @@ -298,11 +298,11 @@ def update_item(item_id: int, item: Item): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* روی دکمه "Try it out" کلیک کنید, اکنون می‌توانید ٟارامترهای مورد نیاز هر API را م؎خص کرده و ØšÙ‡ صورت مستقیم ؚا آنها تعامل کنید: +* روی دکمه "Try it out" کلیک کنید، اکنون می‌توانید ٟارامترهای مورد نیاز هر API را م؎خص کرده و ØšÙ‡ صورت مستقیم ؚا آنها تعامل کنید: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) -* سٟس روی دکمه "Execute" کلیک کنید, خواهید دید که واسط کاریری ؚا APIهای تعریف ؎ده ارتؚاط ؚرقرار کرده، ٟارامترهای مورد نیاز را ØšÙ‡ آن‌ها ارسال می‌کند، سٟس نتایج را دریافت کرده و در صفحه ن؎ان می‌دهد: +* سٟس روی دکمه "Execute" کلیک کنید، خواهید دید که واسط کارؚری ؚا APIهای تعریف ؎ده ارتؚاط ؚرقرار کرده، ٟارامترهای مورد نیاز را ØšÙ‡ آن‌ها ارسال می‌کند، سٟس نتایج را دریافت کرده و در صفحه ن؎ان می‌دهد: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) @@ -342,7 +342,7 @@ item: Item * تکمیل کد. * ؚررسی انواع داده. * اعتؚارسنجی داده: - * خطاهای خودکار و م؎خص در هنگام نامعتؚر ؚودن داده + * خطاهای خودکار و م؎خص در هنگام نامعتؚر ؚودن داده. * اعتؚارسنجی، حتی ؚرای ا؎یاء JSON تو در تو. * تؚدیل داده ورودی: که از ØŽØšÚ©Ù‡ رسیده ØšÙ‡ انواع و داد‌ه‌ ٟایتونی. این داده‌ ؎امل: * JSON. @@ -366,22 +366,22 @@ item: Item ØšÙ‡ مثال Ù‚ØšÙ„ÛŒ ؚاز می‌گردیم، در این مثال **FastAPI** موارد زیر را انجام می‌دهد: -* اعتؚارسنجی اینکه ٟارامتر `item_id` در مسیر درخواست‌های `GET` و `PUT` موجود است . +* اعتؚارسنجی اینکه ٟارامتر `item_id` در مسیر درخواست‌های `GET` و `PUT` موجود است. * اعتؚارسنجی اینکه ٟارامتر `item_id` در درخواست‌های `GET` و `PUT` از نوع `int` است. * اگر غیر از این موارد ؚا؎د، سرویس‌گیرنده خطای مفید و م؎خصی دریافت خواهد کرد. * ؚررسی وجود ٟارامتر ٟرسمان اختیاری `q` (مانند `http://127.0.0.1:8000/items/foo?q=somequery`) در درخواست‌های `GET`. - * از آنجا که ٟارامتر `q` ؚا `= None` مقداردهی ؎ده است, این ٟارامتر اختیاری است. + * از آنجا که ٟارامتر `q` ؚا `= None` مقداردهی ؎ده است، این ٟارامتر اختیاری است. * اگر از مقدار اولیه `None` استفاده نکنیم، این ٟارامتر الزامی خواهد ؚود (همانند ؚدنه درخواست در درخواست `PUT`). -* ؚرای درخواست‌های `PUT` ØšÙ‡ آدرس `/items/{item_id}`, ؚدنه درخواست ؚاید از نوع JSON تعریف ؎ده ؚا؎د: +* ؚرای درخواست‌های `PUT` ØšÙ‡ آدرس `/items/{item_id}`، ؚدنه درخواست ؚاید از نوع JSON تعریف ؎ده ؚا؎د: * ؚررسی اینکه ؚدنه ؎امل فیلدی ؚا نام `name` و از نوع `str` است. * ؚررسی اینکه ؚدنه ؎امل فیلدی ؚا نام `price` و از نوع `float` است. - * ؚررسی اینکه ؚدنه ؎امل فیلدی اختیاری ؚا نام `is_offer` است, که در صورت وجود ؚاید از نوع `bool` ؚا؎د. + * ؚررسی اینکه ؚدنه ؎امل فیلدی اختیاری ؚا نام `is_offer` است، که در صورت وجود ؚاید از نوع `bool` ؚا؎د. * تمامی این موارد ؚرای ا؎یاء JSON در هر عمقی قاؚل ؚررسی می‌ؚا؎د. * تؚدیل از/ØšÙ‡ JSON ØšÙ‡ صورت خودکار. -* مستندسازی همه چیز ؚا استفاده از OpenAPI, که می‌توان از آن ؚرای موارد زیر استفاده کرد: +* مستندسازی همه چیز ؚا استفاده از OpenAPI، که می‌توان از آن ؚرای موارد زیر استفاده کرد: * سیستم مستندات تعاملی. * تولید خودکار کد سرویس‌گیرنده‌ در زؚان‌های ؚرنامه‌نویسی ؚی؎مار. -* فراهم سازی Û² مستند تعاملی مؚتنی ؚر وؚ ØšÙ‡ صورت ٟی؎‌فرض . +* فراهم سازی Û² مستند تعاملی مؚتنی ؚر وؚ ØšÙ‡ صورت ٟی؎‌فرض. --- @@ -413,7 +413,7 @@ item: Item **ه؎دار اسٟویل**: ؚخ؎ آموز؎ - راهنمای کارؚر ؎امل موارد زیر است: -* اعلان **ٟارامترهای** موجود در ؚخ؎‌های دیگر درخواست، ؎امل: **سرآیند‌ (هدر)ها**, **کوکی‌ها**, **فیلد‌های فرم** و **فایل‌ها**. +* اعلان **ٟارامترهای** موجود در ؚخ؎‌های دیگر درخواست، ؎امل: **سرآیند‌ (هدر)ها**، **کوکی‌ها**، **فیلد‌های فرم** و **فایل‌ها**. * چگونگی تن؞یم **محدودیت‌های اعتؚارسنجی** ØšÙ‡ عنوان مثال `maximum_length` یا `regex`. * سیستم **Dependency Injection** قوی و کارؚردی. * امنیت و تایید هویت, ؎امل ٟ؎تیؚانی از **OAuth2** مؚتنی ؚر **JWT tokens** و **HTTP Basic**. @@ -428,7 +428,7 @@ item: Item ## کارایی -معیار (ؚنچمارک‌)های مستقل TechEmpower حاکی از آن است که ؚرنامه‌های **FastAPI** که تحت Uvicorn اجرا می‌؎ود، یکی از سریع‌ترین فریم‌ورک‌های مؚتنی ؚر ٟایتون, است که کمی ضعیف‌تر از Starlette و Uvicorn عمل می‌کند (فریم‌ورک و سروری که FastAPI ؚر اساس آنها ایجاد ؎ده است) (*) +معیار (ؚنچمارک‌)های مستقل TechEmpower حاکی از آن است که ؚرنامه‌های **FastAPI** که تحت Uvicorn اجرا می‌؎ود، یکی از سریع‌ترین فریم‌ورک‌های مؚتنی ؚر ٟایتون، است که کمی ضعیف‌تر از Starlette و Uvicorn عمل می‌کند (فریم‌ورک و سروری که FastAPI ؚر اساس آنها ایجاد ؎ده است) (*) ؚرای درک ؚهتری از این موضوع ØšÙ‡ ؚخ؎ ؚنچ‌مارک‌ها مراجعه کنید. @@ -445,7 +445,7 @@ item: Item * jinja2 - در صورتی که ؚخواهید از ٟیکرؚندی ٟی؎‌فرض ؚرای قالؚ‌ها استفاده کنید. * python-multipart - در صورتی که ؚخواهید ؚا استفاده از `request.form()` از قاؚلیت "تجزیه (parse)" فرم استفاده کنید. * itsdangerous - در صورتی که ؚخواید از `SessionMiddleware` ٟ؎تیؚانی کنید. -* pyyaml - ؚرای ٟ؎تیؚانی `SchemaGenerator` در Starlet (ØšÙ‡ احتمال زیاد ؚرای کار کردن ؚا FastAPI ØšÙ‡ آن نیازی ٟیدا نمی‌کنید.). +* pyyaml - ؚرای ٟ؎تیؚانی `SchemaGenerator` در Starlet (ØšÙ‡ احتمال زیاد ؚرای کار کردن ؚا FastAPI ØšÙ‡ آن نیازی ٟیدا نمی‌کنید). * graphene - در صورتی که از `GraphQLApp` ٟ؎تیؚانی می‌کنید. * ujson - در صورتی که ؚخواهید از `UJSONResponse` استفاده کنید. From 08b98adea61dd424c41e00b60fd04b1c7bf6df52 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 17:49:07 +0000 Subject: [PATCH 192/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 03319666a..412b55fee 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Update Farsi translation for `docs/fa/docs/index.md`. PR [#10216](https://github.com/tiangolo/fastapi/pull/10216) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add German translation for `docs/de/docs/tutorial/body-fields.md`. PR [#10310](https://github.com/tiangolo/fastapi/pull/10310) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body.md`. PR [#10295](https://github.com/tiangolo/fastapi/pull/10295) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body-multiple-params.md`. PR [#10308](https://github.com/tiangolo/fastapi/pull/10308) by [@nilslindemann](https://github.com/nilslindemann). From e3728489fad1cdf871faa537472e9028b42304ff Mon Sep 17 00:00:00 2001 From: mojtaba <121169359+mojtabapaso@users.noreply.github.com> Date: Mon, 29 Jan 2024 21:23:46 +0330 Subject: [PATCH 193/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Persian=20translat?= =?UTF-8?q?ion=20for=20`docs/fa/docs/tutorial/middleware.md`=20(#9695)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fa/docs/tutorial/middleware.md | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 docs/fa/docs/tutorial/middleware.md diff --git a/docs/fa/docs/tutorial/middleware.md b/docs/fa/docs/tutorial/middleware.md new file mode 100644 index 000000000..c5752a4b5 --- /dev/null +++ b/docs/fa/docs/tutorial/middleware.md @@ -0,0 +1,59 @@ +# میان‌افزار - middleware + +؎ما میتوانید میان‌افزارها را در **FastAPI** اضافه کنید. + +"میان‌افزار" یک تاؚع است که ؚا هر درخواست(request) Ù‚ØšÙ„ از ٟرداز؎ توسط هر path operation (عملیات مسیر) خاص کار می‌کند. همچنین ؚا هر ٟاسخ(response) Ù‚ØšÙ„ از ؚازگ؎ت آن نیز کار می‌کند. + +* هر **درخواستی (request)** که ØšÙ‡ ؚرنامه ؎ما می آید را می گیرد. +* سٟس می تواند کاری ؚرای آن **درخواست** انجام دهید یا هر کد مورد نیازتان را اجرا کنید. +* سٟس **درخواست** را ØšÙ‡ ؚخ؎ دیگری از ؚرنامه (توسط یک path operation م؎خص) ؚرای ٟرداز؎ ارسال می کند. +* سٟس **ٟاسخ** تولید ؎ده توسط ؚرنامه را (توسط یک path operation م؎خص) دریافت می‌کند. +* می تواند کاری ؚا **ٟاسخ** انجام دهید یا هر کد مورد نیازتان را اجرا کند. +* سٟس **ٟاسخ** را ؚرمی گرداند. + +!!! توجه "جز؊یات فنی" + در صورت وجود واؚستگی هایی ؚا `yield`، کد خروجی **ٟس از** اجرای میان‌‌افزار اجرا خواهد ؎د. + + در صورت وجود هر گونه و؞ایف ٟس زمینه (که در ادامه توضیح داده می‌؎وند)، تمام میان‌افزارها *ٟس از آن* اجرا خواهند ؎د. + +## ساخت یک میان افزار + +ؚرای ایجاد یک میان‌افزار، از دکوریتور `@app.middleware("http")` در ؚالای یک تاؚع استفاده می‌؎ود. + +تاؚع میان افزار دریافت می کند: +* `درخواست` +* تاؚع `call_next` که `درخواست` را ØšÙ‡ عنوان ٟارامتر دریافت می کند + * این تاؚع `درخواست` را ØšÙ‡ *path operation* مرؚوطه ارسال می کند. + * سٟس `ٟاسخ` تولید ؎ده توسط *path operation* مرؚوطه را ؚرمی‌گرداند. +* ؎ما می‌توانید سٟس `ٟاسخ` را تغییر داده و ٟس از آن را ؚرگردانید. + +```Python hl_lines="8-9 11 14" +{!../../../docs_src/middleware/tutorial001.py!} +``` + +!!! نکته ØšÙ‡ خاطر دا؎ته ؚا؎ید که هدرهای اختصاصی سفار؎ی را می توان ؚا استفاده از ٟی؎وند "X-" اضافه کرد. + + اما اگر هدرهای سفار؎ی دارید که می‌خواهید مرورگر کارؚر ؚتواند آنها را ؚؚیند، ؚاید آنها را ؚا استفاده از ٟارامتر `expose_headers` که در مستندات CORS از Starlette توضیح داده ؎ده است، ØšÙ‡ ٟیکرؚندی CORS خود اضافه کنید. + +!!! توجه "جز؊یات فنی" + ؎ما همچنین می‌توانید از `from starlette.requests import Request` استفاده کنید. + + **FastAPI** این را ØšÙ‡ عنوان یک سهولت ؚرای ؎ما ØšÙ‡ عنوان ؚرنامه‌نویس فراهم می‌کند. اما این مستقیما از Starlette ØšÙ‡ دست می‌آید. + +### Ù‚ØšÙ„ و ؚعد از `ٟاسخ` + +؎ما می‌توانید کدی را ؚرای اجرا ؚا `درخواست`، Ù‚ØšÙ„ از اینکه هر *path operation* آن را دریافت کند، اضافه کنید. + +همچنین ٟس از تولید `ٟاسخ`، Ù‚ØšÙ„ از ؚازگ؎ت آن، می‌توانید کدی را اضافه کنید. + +ØšÙ‡ عنوان مثال، می‌توانید یک هدر سفار؎ی ØšÙ‡ نام `X-Process-Time` که ؎امل زمان ٟرداز؎ درخواست و تولید ٟاسخ ØšÙ‡ صورت ثانیه است، اضافه کنید. + +```Python hl_lines="10 12-13" +{!../../../docs_src/middleware/tutorial001.py!} +``` + + ## سایر میان افزار + +؎ما می‌توانید ؚعداً در مورد میان‌افزارهای دیگر در [راهنمای کارؚر ٟی؎رفته: میان‌افزار ٟی؎رفته](../advanced/middleware.md){.internal-link target=_blank} ؚی؎تر ؚخوانید. + +؎ما در ؚخ؎ ؚعدی در مورد این که چگونه ؚا استفاده از یک میان‌افزار، CORS را مدیریت کنید، خواهید خواند. From 4f8eec808f7edebec85cc976a42e2b7f7f70a400 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 17:55:19 +0000 Subject: [PATCH 194/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 412b55fee..15798ec4b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Persian translation for `docs/fa/docs/tutorial/middleware.md`. PR [#9695](https://github.com/tiangolo/fastapi/pull/9695) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Update Farsi translation for `docs/fa/docs/index.md`. PR [#10216](https://github.com/tiangolo/fastapi/pull/10216) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add German translation for `docs/de/docs/tutorial/body-fields.md`. PR [#10310](https://github.com/tiangolo/fastapi/pull/10310) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body.md`. PR [#10295](https://github.com/tiangolo/fastapi/pull/10295) by [@nilslindemann](https://github.com/nilslindemann). From 653a3579ca807f55e128084e3833ed6324f902a6 Mon Sep 17 00:00:00 2001 From: Nils Lindemann Date: Mon, 29 Jan 2024 19:10:09 +0100 Subject: [PATCH 195/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20German=20translati?= =?UTF-8?q?on=20for=20`docs/de/docs/tutorial/body-nested-models.md`=20(#10?= =?UTF-8?q?313)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/tutorial/body-nested-models.md | 382 ++++++++++++++++++++ 1 file changed, 382 insertions(+) create mode 100644 docs/de/docs/tutorial/body-nested-models.md diff --git a/docs/de/docs/tutorial/body-nested-models.md b/docs/de/docs/tutorial/body-nested-models.md new file mode 100644 index 000000000..976f3f924 --- /dev/null +++ b/docs/de/docs/tutorial/body-nested-models.md @@ -0,0 +1,382 @@ +# Body – Verschachtelte Modelle + +Mit **FastAPI** können Sie (dank Pydantic) beliebig tief verschachtelte Modelle definieren, validieren und dokumentieren. + +## Listen als Felder + +Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`e. + +=== "Python 3.10+" + + ```Python hl_lines="12" + {!> ../../../docs_src/body_nested_models/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="14" + {!> ../../../docs_src/body_nested_models/tutorial001.py!} + ``` + +Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts ÃŒber den Typ der Elemente der Liste aussagt. + +## Listen mit Typ-Parametern als Felder + +Aber Python erlaubt es, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren. + +### `List` von `typing` importieren + +In Python 3.9 oder darÃŒber können Sie einfach `list` verwenden, um diese Typannotationen zu deklarieren, wie wir unten sehen werden. 💡 + +In Python-Versionen vor 3.9 (3.6 und darÃŒber), mÃŒssen Sie zuerst `List` von Pythons Standardmodul `typing` importieren. + +```Python hl_lines="1" +{!> ../../../docs_src/body_nested_models/tutorial002.py!} +``` + +### Eine `list`e mit einem Typ-Parameter deklarieren + +Um Typen wie `list`, `dict`, `tuple` mit inneren Typ-Parametern (inneren Typen) zu deklarieren: + +* Wenn Sie eine Python-Version kleiner als 3.9 verwenden, importieren Sie das Äquivalent zum entsprechenden Typ vom `typing`-Modul +* Überreichen Sie den/die inneren Typ(en) von eckigen Klammern umschlossen, `[` und `]`, als „Typ-Parameter“ + +In Python 3.9 wÀre das: + +```Python +my_list: list[str] +``` + +Und in Python-Versionen vor 3.9: + +```Python +from typing import List + +my_list: List[str] +``` + +Das ist alles Standard-Python-Syntax fÃŒr Typdeklarationen. + +Verwenden Sie dieselbe Standardsyntax fÃŒr Modellattribute mit inneren Typen. + +In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Liste von Strings“ ist: + +=== "Python 3.10+" + + ```Python hl_lines="12" + {!> ../../../docs_src/body_nested_models/tutorial002_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="14" + {!> ../../../docs_src/body_nested_models/tutorial002_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="14" + {!> ../../../docs_src/body_nested_models/tutorial002.py!} + ``` + +## Set-Typen + +Aber dann denken wir darÃŒber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein. + +Python hat einen Datentyp speziell fÃŒr Mengen eindeutiger Dinge: das `set`. + +Deklarieren wir also `tags` als Set von Strings. + +=== "Python 3.10+" + + ```Python hl_lines="12" + {!> ../../../docs_src/body_nested_models/tutorial003_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="14" + {!> ../../../docs_src/body_nested_models/tutorial003_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="1 14" + {!> ../../../docs_src/body_nested_models/tutorial003.py!} + ``` + +Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert. + +Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben. + +Und es wird entsprechend annotiert/dokumentiert. + +## Verschachtelte Modelle + +Jedes Attribut eines Pydantic-Modells hat einen Typ. + +Aber dieser Typ kann selbst ein anderes Pydantic-Modell sein. + +Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, -typen, und -validierungen. + +Alles das beliebig tief verschachtelt. + +### Ein Kindmodell definieren + +Wir können zum Beispiel ein `Image`-Modell definieren. + +=== "Python 3.10+" + + ```Python hl_lines="7-9" + {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="9-11" + {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9-11" + {!> ../../../docs_src/body_nested_models/tutorial004.py!} + ``` + +### Das Kindmodell als Typ verwenden + +Und dann können wir es als Typ eines Attributes verwenden. + +=== "Python 3.10+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="20" + {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20" + {!> ../../../docs_src/body_nested_models/tutorial004.py!} + ``` + +Das wÃŒrde bedeuten, dass **FastAPI** einen Body erwartet wie: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": ["rock", "metal", "bar"], + "image": { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + } +} +``` + +Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**: + +* Editor-UnterstÃŒtzung (CodevervollstÀndigung, usw.), selbst fÃŒr verschachtelte Modelle +* Datenkonvertierung +* Datenvalidierung +* Automatische Dokumentation + +## Spezielle Typen und Validierungen + +Abgesehen von normalen einfachen Typen, wie `str`, `int`, `float`, usw. können Sie komplexere einfache Typen verwenden, die von `str` erben. + +Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich Pydantics TypÃŒbersicht an. Sie werden im nÀchsten Kapitel ein paar Beispiele kennenlernen. + +Da wir zum Beispiel im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`: + +=== "Python 3.10+" + + ```Python hl_lines="2 8" + {!> ../../../docs_src/body_nested_models/tutorial005_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="4 10" + {!> ../../../docs_src/body_nested_models/tutorial005_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4 10" + {!> ../../../docs_src/body_nested_models/tutorial005.py!} + ``` + +Es wird getestet, ob der String eine gÃŒltige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert. + +## Attribute mit Listen von Kindmodellen + +Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden: + +=== "Python 3.10+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body_nested_models/tutorial006_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="20" + {!> ../../../docs_src/body_nested_models/tutorial006_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20" + {!> ../../../docs_src/body_nested_models/tutorial006.py!} + ``` + +Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie: + +```JSON hl_lines="11" +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": [ + "rock", + "metal", + "bar" + ], + "images": [ + { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + }, + { + "url": "http://example.com/dave.jpg", + "name": "The Baz" + } + ] +} +``` + +!!! info + Beachten Sie, dass der `images`-SchlÃŒssel jetzt eine Liste von Bild-Objekten hat. + +## Tief verschachtelte Modelle + +Sie können beliebig tief verschachtelte Modelle definieren: + +=== "Python 3.10+" + + ```Python hl_lines="7 12 18 21 25" + {!> ../../../docs_src/body_nested_models/tutorial007_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="9 14 20 23 27" + {!> ../../../docs_src/body_nested_models/tutorial007_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9 14 20 23 27" + {!> ../../../docs_src/body_nested_models/tutorial007.py!} + ``` + +!!! info + Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat. + +## Bodys aus reinen Listen + +Wenn Sie möchten, dass das Àußerste Element des JSON-Bodys ein JSON-`array` (eine Python-`list`e) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen: + +```Python +images: List[Image] +``` + +oder in Python 3.9 und darÃŒber: + +```Python +images: list[Image] +``` + +so wie in: + +=== "Python 3.9+" + + ```Python hl_lines="13" + {!> ../../../docs_src/body_nested_models/tutorial008_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="15" + {!> ../../../docs_src/body_nested_models/tutorial008.py!} + ``` + +## Editor-UnterstÃŒtzung ÃŒberall + +Und Sie erhalten Editor-UnterstÃŒtzung ÃŒberall. + +Selbst fÃŒr Dinge in Listen: + + + +Sie wÃŒrden diese Editor-UnterstÃŒtzung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten wÃŒrden. + +Aber Sie mÃŒssen sich auch nicht weiter um die Modelle kÃŒmmern, hereinkommende Dicts werden automatisch in sie konvertiert. Und was Sie zurÃŒckgeben, wird automatisch nach JSON konvertiert. + +## Bodys mit beliebigen `dict`s + +Sie können einen Body auch als `dict` deklarieren, mit SchlÃŒsseln eines Typs und Werten eines anderen Typs. + +So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attribut-Namen lauten (wie es bei Pydantic-Modellen der Fall wÀre). + +Das ist nÃŒtzlich, wenn Sie SchlÃŒssel empfangen, deren Namen Sie nicht bereits kennen. + +--- + +Ein anderer nÃŒtzlicher Anwendungsfall ist, wenn Sie SchlÃŒssel eines anderen Typs haben wollen, z. B. `int`. + +Das schauen wir uns mal an. + +Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-SchlÃŒssel und `float`-Werte hat. + +=== "Python 3.9+" + + ```Python hl_lines="7" + {!> ../../../docs_src/body_nested_models/tutorial009_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9" + {!> ../../../docs_src/body_nested_models/tutorial009.py!} + ``` + +!!! tip "Tipp" + Bedenken Sie, dass JSON nur `str` als SchlÃŒssel unterstÃŒtzt. + + Aber Pydantic hat automatische Datenkonvertierung. + + Das bedeutet, dass Ihre API-Clients nur Strings senden können, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren. + + Und das `dict` welches Sie als `weights` erhalten, wird `int`-SchlÃŒssel und `float`-Werte haben. + +## Zusammenfassung + +Mit **FastAPI** haben Sie die maximale FlexibilitÀt von Pydantic-Modellen, wÀhrend Ihr Code einfach, kurz und elegant bleibt. + +Aber mit all den VorzÃŒgen: + +* Editor-UnterstÃŒtzung (CodevervollstÀndigung ÃŒberall) +* Datenkonvertierung (auch bekannt als Parsen, Serialisierung) +* Datenvalidierung +* Schema-Dokumentation +* Automatische Dokumentation From a235d93002b925b0d2d7aa650b7ab6d7bb4b24dd Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 29 Jan 2024 18:10:30 +0000 Subject: [PATCH 196/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 15798ec4b..1e3af4714 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add German translation for `docs/de/docs/tutorial/body-nested-models.md`. PR [#10313](https://github.com/tiangolo/fastapi/pull/10313) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/middleware.md`. PR [#9695](https://github.com/tiangolo/fastapi/pull/9695) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Update Farsi translation for `docs/fa/docs/index.md`. PR [#10216](https://github.com/tiangolo/fastapi/pull/10216) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add German translation for `docs/de/docs/tutorial/body-fields.md`. PR [#10310](https://github.com/tiangolo/fastapi/pull/10310) by [@nilslindemann](https://github.com/nilslindemann). From 1b824e0c2352ec67e45a139d22aba9382c2d2622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 30 Jan 2024 10:58:10 +0100 Subject: [PATCH 197/222] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20Tal?= =?UTF-8?q?kPython=20badge=20image=20(#11048)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/en/data/sponsors.yml | 2 +- docs/en/docs/img/sponsors/talkpython-v2.jpg | Bin 0 -> 18712 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/en/docs/img/sponsors/talkpython-v2.jpg diff --git a/README.md b/README.md index 764cd5a36..968ccf7a7 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The key features are: - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index bd5b86e44..0ce434b5e 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -23,7 +23,7 @@ gold: silver: - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust - img: https://fastapi.tiangolo.com/img/sponsors/talkpython.png + img: https://fastapi.tiangolo.com/img/sponsors/talkpython-v2.jpg - url: https://testdriven.io/courses/tdd-fastapi/ title: Learn to build high-quality web apps with best practices img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg diff --git a/docs/en/docs/img/sponsors/talkpython-v2.jpg b/docs/en/docs/img/sponsors/talkpython-v2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a1e492a162458847861035ce010dfde35734c97 GIT binary patch literal 18712 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 Date: Tue, 30 Jan 2024 09:58:29 +0000 Subject: [PATCH 198/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 1e3af4714..3c207f98d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -141,6 +141,7 @@ hide: ### Internal +* 🔧 Update sponsors: TalkPython badge image. PR [#11048](https://github.com/tiangolo/fastapi/pull/11048) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Deta. PR [#11041](https://github.com/tiangolo/fastapi/pull/11041) by [@tiangolo](https://github.com/tiangolo). * 💄 Fix CSS breaking RTL languages (erroneously introduced by a previous RTL PR). PR [#11039](https://github.com/tiangolo/fastapi/pull/11039) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Italian to `mkdocs.yml`. PR [#11016](https://github.com/tiangolo/fastapi/pull/11016) by [@alejsdev](https://github.com/alejsdev). From 2a21dfba0ee0334825aecfd9ef1f85dc02b92e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 30 Jan 2024 15:24:35 +0100 Subject: [PATCH 199/222] =?UTF-8?q?=F0=9F=8D=B1=20Update=20sponsors:=20Tal?= =?UTF-8?q?kPython=20badge=20(#11052)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/img/sponsors/talkpython-v2.jpg | Bin 18712 -> 9778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/docs/img/sponsors/talkpython-v2.jpg b/docs/en/docs/img/sponsors/talkpython-v2.jpg index 4a1e492a162458847861035ce010dfde35734c97..adb0152489fa8dea5594a78a835e0cbfa817e840 100644 GIT binary patch literal 9778 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 literal 18712 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 Date: Tue, 30 Jan 2024 14:24:57 +0000 Subject: [PATCH 200/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 3c207f98d..6838bfa2b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -141,6 +141,7 @@ hide: ### Internal +* 🍱 Update sponsors: TalkPython badge. PR [#11052](https://github.com/tiangolo/fastapi/pull/11052) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: TalkPython badge image. PR [#11048](https://github.com/tiangolo/fastapi/pull/11048) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Deta. PR [#11041](https://github.com/tiangolo/fastapi/pull/11041) by [@tiangolo](https://github.com/tiangolo). * 💄 Fix CSS breaking RTL languages (erroneously introduced by a previous RTL PR). PR [#11039](https://github.com/tiangolo/fastapi/pull/11039) by [@tiangolo](https://github.com/tiangolo). From fb7af9ec72656048df07dd40bab8721075f967a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 30 Jan 2024 19:46:56 +0100 Subject: [PATCH 201/222] =?UTF-8?q?=F0=9F=91=B7=20Upgrade=20GitHub=20Actio?= =?UTF-8?q?n=20issue-manager=20(#11056)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/issue-manager.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml index d1aad28fd..0f564d721 100644 --- a/.github/workflows/issue-manager.yml +++ b/.github/workflows/issue-manager.yml @@ -23,7 +23,7 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: tiangolo/issue-manager@0.4.0 + - uses: tiangolo/issue-manager@0.5.0 with: token: ${{ secrets.FASTAPI_ISSUE_MANAGER }} config: > From ec5e08251d77ea81f7e5d5ccebb1fa55950add7a Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 30 Jan 2024 18:47:20 +0000 Subject: [PATCH 202/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6838bfa2b..0f0dbb1c9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -141,6 +141,7 @@ hide: ### Internal +* 👷 Upgrade GitHub Action issue-manager. PR [#11056](https://github.com/tiangolo/fastapi/pull/11056) by [@tiangolo](https://github.com/tiangolo). * 🍱 Update sponsors: TalkPython badge. PR [#11052](https://github.com/tiangolo/fastapi/pull/11052) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: TalkPython badge image. PR [#11048](https://github.com/tiangolo/fastapi/pull/11048) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Deta. PR [#11041](https://github.com/tiangolo/fastapi/pull/11041) by [@tiangolo](https://github.com/tiangolo). From 7178eb4fb1b88cdd69d356c8d34c03905262c745 Mon Sep 17 00:00:00 2001 From: JeongHyeongKim Date: Wed, 31 Jan 2024 23:35:27 +0900 Subject: [PATCH 203/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/middleware.md`=20(#2829)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/middleware.md | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/ko/docs/tutorial/middleware.md diff --git a/docs/ko/docs/tutorial/middleware.md b/docs/ko/docs/tutorial/middleware.md new file mode 100644 index 000000000..f35b446a6 --- /dev/null +++ b/docs/ko/docs/tutorial/middleware.md @@ -0,0 +1,61 @@ +# 믞듀웚얎 + +믞듀웚얎륌 **FastAPI** 응용 프로귞랚에 추가할 수 있습니닀. + +"믞듀웚얎"는 특정 *겜로 작동*에 의핎 처늬되Ʞ 전, 몚든 **요청**에 대핎서 동작하는 핚수입니닀. 또한 몚든 **응답**읎 반환되Ʞ 전에도 동음하게 동작합니닀. + +* 믞듀웚얎는 응용 프로귞랚윌로 였는 **요청**륌 가젞옵니닀. +* **요청** 또는 닀륞 필요한 윔드륌 싀행 시킬 수 있습니닀. +* **요청**을 응용 프로귞랚의 *겜로 작동*윌로 전달하여 처늬합니닀. +* 애플늬쌀읎션의 *겜로 작업*에서 생성한 **응답**륌 받습니닀. +* **응답** 또는 닀륞 필요한 윔드륌 싀행시킀는 동작을 할 수 있습니닀. +* **응답**륌 반환합니닀. + +!!! note "Ʞ술 섞부사항" + 만앜 `yield`륌 사용한 의졎성을 가지고 있닀멎, 믞듀웚얎가 싀행되고 난 후에 exit읎 싀행됩니닀. + + 만앜 (나쀑에 묞서에서 닀룰) 백귞띌욎드 작업읎 있닀멎, 몚든 믞듀웚얎가 싀행되고 *난 후에* 싀행됩니닀. + +## 믞듀웚얎 만듀Ʞ + +믞듀웚얎륌 작성하Ʞ 위핎서 핚수 상닚에 `@app.middleware("http")` 데윔레읎터륌 사용할 수 있습니닀. + +믞듀웚얎 핚수는 닀음 항목듀을 받습니닀: + +* `request`. +* `request`륌 맀개변수로 받는 `call_next` 핚수. + * 읎 핚수는 `request`륌 핎당하는 *겜로 작업*윌로 전달합니닀. + * 귞런 닀음, *겜로 작업*에 의핎 생성된 `response` 륌 반환합니닀. +* `response`륌 반환하Ʞ 전에 추가로 `response`륌 수정할 수 있습니닀. + +```Python hl_lines="8-9 11 14" +{!../../../docs_src/middleware/tutorial001.py!} +``` + +!!! tip "팁" + 사용자 정의 헀더는 'X-' 접두사륌 사용하여 추가할 수 있습니닀. + + 귞러나 만앜 큎띌읎얞튞의 람띌우저에서 볌 수 있는 사용자 정의 헀더륌 가지고 있닀멎, 귞것듀을 CORS 섀정([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank})에 Starlette CORS 묞서에 명시된 `expose_headers` 맀개변수륌 읎용하여 헀더듀을 추가하여알합니닀. + +!!! note "Ʞ술적 섞부사항" + `from starlette.requests import request`륌 사용할 수도 있습니닀. + + **FastAPI**는 개발자에게 펞의륌 위핎 읎륌 제공합니닀. 귞러나 Starlette에서 직접 파생되었습니닀. + +### `response`의 전곌 후 + +*겜로 작동*을 받Ʞ 전 `request`와 핚께 작동할 수 있는 윔드륌 추가할 수 있습니닀. + +귞늬고 `response` 또한 생성된 후 반환되Ʞ 전에 윔드륌 추가 할 수 있습니닀. + +예륌 듀얎, 요청을 수행하고 응답을 생성하는데 까지 걞늰 시간 값을 가지고 있는 `X-Process-Time` 같은 사용자 정의 헀더륌 추가할 수 있습니닀. + +```Python hl_lines="10 12-13" +{!../../../docs_src/middleware/tutorial001.py!} +``` + +## 닀륞 믞듀웚얎 + +믞듀웚얎에 대한 더 많은 정볎는 [숙렚된 사용자 안낎서: 향상된 믞듀웚얎](../advanced/middleware.md){.internal-link target=\_blank}에서 확읞할 수 있습니닀. + +닀음 부분에서 믞듀웚얎와 핚께 CORS륌 얎떻게 닀룚는지에 대핮 확읞할 것입니닀. From 531b0d5e035be7de800b541828023084a79cf4ad Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 31 Jan 2024 14:35:50 +0000 Subject: [PATCH 204/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0f0dbb1c9..d7dba1721 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/middleware.md`. PR [#2829](https://github.com/tiangolo/fastapi/pull/2829) by [@JeongHyeongKim](https://github.com/JeongHyeongKim). * 🌐 Add German translation for `docs/de/docs/tutorial/body-nested-models.md`. PR [#10313](https://github.com/tiangolo/fastapi/pull/10313) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/middleware.md`. PR [#9695](https://github.com/tiangolo/fastapi/pull/9695) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Update Farsi translation for `docs/fa/docs/index.md`. PR [#10216](https://github.com/tiangolo/fastapi/pull/10216) by [@theonlykingpin](https://github.com/theonlykingpin). From 67494c2b5eaf27f372812e21850c204e2bc79cc6 Mon Sep 17 00:00:00 2001 From: Aykhan Shahsuvarov <88669260+aykhans@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:45:57 +0400 Subject: [PATCH 205/222] =?UTF-8?q?=F0=9F=8C=90=20Add=20Azerbaijani=20tran?= =?UTF-8?q?slation=20for=20`docs/az/docs/index.md`=20(#11047)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/az/docs/index.md | 469 ++++++++++++++++++++++++++++++++++++++++++ docs/az/mkdocs.yml | 1 + docs/en/mkdocs.yml | 2 + 3 files changed, 472 insertions(+) create mode 100644 docs/az/docs/index.md create mode 100644 docs/az/mkdocs.yml diff --git a/docs/az/docs/index.md b/docs/az/docs/index.md new file mode 100644 index 000000000..a22706512 --- /dev/null +++ b/docs/az/docs/index.md @@ -0,0 +1,469 @@ +

+ FastAPI +

+

+ FastAPI framework, yÃŒksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır +

+

+ + Test + + + Əhatə + + + Paket versiyası + + + Dəstəklənən Python versiyaları + +

+ +--- + +**Sənədlər**: https://fastapi.tiangolo.com + +**Qaynaq Kodu**: https://github.com/tiangolo/fastapi + +--- + +FastAPI Python 3.8+ ilə API yaratmaq ÌçÌn standart Python tip məsləhətlərinə əsaslanan, mÃŒasir, sÃŒrətli (yÃŒksək performanslı) framework-dÃŒr. + +Əsas xÃŒsusiyyətləri bunlardır: + +* **SÃŒrətli**: Çox yÃŒksək performans, **NodeJS** və **Go** səviyyəsində (Starlette və Pydantic-ə təşəkkÃŒrlər). [Ən sÃŒrətli Python frameworklərindən biridir](#performans). +* **Çevik kodlama**: Funksiyanallıqları inkişaf etdirmək sÃŒrətini təxminən 200%-dən 300%-ə qədər artırın. * +* **Daha az xəta**: İnsan (developer) tərəfindən törədilən səhvlərin təxminən 40% -ni azaldın. * +* **İntuitiv**: Əla redaktor dəstəyi. Hər yerdə otomatik tamamlama. Xətaları mÌəyyənləşdirməyə daha az vaxt sərf edəcəksiniz. +* **Asan**: İstifadəsi və öyrənilməsi asan olması ÌçÌn nəzərdə tutulmuşdur. Sənədləri oxumaq ÌçÌn daha az vaxt ayıracaqsınız. +* **Qısa**: Kod təkrarlanmasını minimuma endirin. Hər bir parametr tərifində birdən çox xÃŒsusiyyət ilə və daha az səhvlə qarşılaşacaqsınız. +* **GÃŒclÃŒ**: Avtomatik və interaktiv sənədlərlə birlikdə istifadəyə hazır kod əldə edə bilərsiniz. +* **Standartlara əsaslanan**: API-lar ÌçÌn açıq standartlara əsaslanır (və tam uyğun gəlir): OpenAPI (əvvəlki adı ilə Swagger) və JSON Schema. + +* Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır. + +## Sponsorlar + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%}` +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + +Digər sponsorlar + +## Rəylər + +"_[...] Son gÃŒnlərdə **FastAPI**-ı çox istifadə edirəm. [...] Əslində onu komandamın bÃŒtÃŒn **Microsoftda ML sevislərində** istifadə etməyi planlayıram. Onların bəziləri **windows**-un əsas məhsuluna və bəzi **Office** məhsullarına inteqrasiya olunurlar._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_**FastAPI** kitabxanasını **Proqnozlar** əldə etmək ÌçÌn sorğulana bilən **REST** serverini yaratmaqda istifadə etdik._" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** **böhran idarəçiliyi** orkestrləşmə framework-nÃŒn açıq qaynaqlı buraxılışını elan etməkdən məmnundur: **Dispatch**! [**FastAPI** ilə quruldu]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_**FastAPI** ÌçÌn həyəcanlıyam. Çox əyləncəlidir!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_DÃŒzÃŒnÃŒ desəm, sizin qurduğunuz şey həqiqətən möhkəm və peşəkar görÃŒnÃŒr. Bir çox cəhətdən **Hug**-un olmasını istədiyim kimdir - kiminsə belə bir şey qurduğunu görmək həqiqətən ruhlandırıcıdır._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_Əgər REST API-lər yaratmaq ÌçÌn **mÃŒasir framework** öyrənmək istəyirsinizsə, **FastAPI**-a baxın [...] SÃŒrətli, istifadəsi və öyrənməsi asandır. [...]_" + +"_**API** xidmətlərimizi **FastAPI**-a köçÌrdÃŒk [...] Sizin də bəyənəcəyinizi dÌşÌnÃŒrÃŒk._" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +"_Python ilə istifadəyə hazır API qurmaq istəyən hər kəsə **FastAPI**-ı tövsiyə edirəm. **Möhtəşəm şəkildə dizayn edilmiş**, **istifadəsi asan** və **yÃŒksək dərəcədə genişlənə bilən**-dir, API əsaslı inkişaf strategiyamızın **əsas komponentinə** çevrilib və Virtual TAC Engineer kimi bir çox avtomatlaşdırma və servisləri idarə edir._" + +
Deon Pillsbury - Cisco (ref)
+ +--- + +## **Typer**, CLI-ların FastAPI-ı + + + +Əgər siz veb API əvəzinə terminalda istifadə ediləcək CLI proqramı qurursunuzsa, **Typer**-a baxa bilərsiniz. + +**Typer** FastAPI-ın kiçik qardaşıdır. Və o, CLI-lərin **FastAPI**-ı olmaq ÌçÌn nəzərdə tutulub. ⌚ 🚀 + +## Tələblər + +Python 3.8+ + +FastAPI nəhənglərin çiyinlərində dayanır: + +* Web tərəfi ÌçÌn Starlette. +* Data tərəfi ÌçÌn Pydantic. + +## Quraşdırma + +
+ +```console +$ pip install fastapi + +---> 100% +``` + +
+ +Tətbiqimizi əlçatan etmək ÌçÌn bizə Uvicorn və ya Hypercorn kimi ASGI server lazımdır. + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +## NÃŒmunə + +### Kodu yaradaq + +* `main.py` adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək: + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +
+Və ya async def... + +Əgər kodunuzda `async` və ya `await` vardırsa `async def` istifadə edə bilərik: + +```Python hl_lines="9 14" +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +**Qeyd**: + +Əgər bu mövzu haqqında məlumatınız yoxdursa `async` və `await` sənədindəki _"Tələsirsən?"_ bölməsinə baxa bilərsiniz. + +
+ +### Kodu işə salaq + +Serveri aşağıdakı əmr ilə işə salaq: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+uvicorn main:app --reload əmri haqqında... + +`uvicorn main:app` əmri aşağıdakılara instinad edir: + +* `main`: `main.py` faylı (yəni Python "modulu"). +* `app`: `main.py` faylında `app = FastAPI()` sətrində yaratdığımız `FastAPI` obyektidir. +* `--reload`: kod dəyişikliyindən sonra avtomatik olaraq serveri yenidən işə salır. Bu parametrdən yalnız development mərhələsində istifadə etməliyik. + +
+ +### İndi yoxlayaq + +Bu linki brauzerimizdə açaq http://127.0.0.1:8000/items/5?q=somequery. + +Aşağıdakı kimi bir JSON cavabı görəcəksiniz: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +Siz artıq bir API yaratmısınız, hansı ki: + +* `/` və `/items/{item_id}` _yollarında_ HTTP sorğularını qəbul edir. +* Hər iki _yolda_ `GET` əməliyyatlarını (həmçinin HTTP _metodları_ kimi bilinir) aparır. +* `/items/{item_id}` _yolu_ `item_id` adlı `int` qiyməti almalı olan _yol parametrinə_ sahibdir. +* `/items/{item_id}` _yolunun_ `q` adlı yol parametri var və bu parametr istəyə bağlı olsa da, `str` qiymətini almalıdır. + +### İnteraktiv API Sənədləri + +İndi http://127.0.0.1:8000/docs ÃŒnvanına daxil olun. + +Avtomatik interaktiv API sənədlərini görəcəksiniz (Swagger UI tərəfindən təmin edilir): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Alternativ API sənədləri + +İndi isə http://127.0.0.1:8000/redoc ÃŒnvanına daxil olun. + +ReDoc tərəfindən təqdim edilən avtomatik sənədləri görəcəksiniz: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## NÃŒmunəni Yeniləyək + +İndi gəlin `main.py` faylını `PUT` sorğusu ilə birlikdə gövdə qəbul edəcək şəkildə dəyişdirək. + +Pydantic sayəsində standart Python tiplərindən istifadə edərək gövdəni mÌəyyən edək. + +```Python hl_lines="4 9-12 25-27" +from typing import Union + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: Union[bool, None] = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` +Server avtomatik olaraq yenidən işə salınmalı idi (çÌnki biz yuxarıda `uvicorn` əmri ilə `--reload` parametrindən istifadə etmişik). + +### İnteraktiv API sənədlərindəki dəyişikliyə baxaq + +Yenidən http://127.0.0.1:8000/docs ÃŒnvanına daxil olun. + +* İnteraktiv API sənədləri yeni gövdə də daxil olmaq ilə avtomatik olaraq yenilənəcək: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* "Try it out" dÃŒyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Sonra "Execute" dÃŒyməsini klikləyin, istifadəçi interfeysi API ilə əlaqə quracaq, parametrləri göndərəcək, nəticələri əldə edəcək və onları ekranda göstərəcək: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Alternativ API Sənədlərindəki Dəyişikliyə Baxaq + +İndi isə yenidən http://127.0.0.1:8000/redoc ÃŒnvanına daxil olun. + +* Alternativ sənədlər həm də yeni sorğu parametri və gövdəsini əks etdirəcək: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### XÃŒlasə + +Ümumiləşdirsək, parametrlər, gövdə və s. Biz məlumat növlərini **bir dəfə** funksiya parametrləri kimi təyin edirik. + +Bunu standart mÃŒasir Python tipləri ilə edirsiniz. + +Yeni sintaksis, mÌəyyən bir kitabxananın metodlarını və ya siniflərini və s. öyrənmək məcburiyyətində deyilsiniz. + +Sadəcə standart **Python 3.8+**. + +Məsələn, `int` ÌçÌn: + +```Python +item_id: int +``` + +və ya daha mÃŒrəkkəb `Item` modeli ÌçÌn: + +```Python +item: Item +``` + +...və yalnız parametr tipini təyin etməklə bunları əldə edirsiniz: + +* Redaktor dəstəyi ilə: + * Avtomatik tamamlama. + * Tip yoxlanması. +* Məlumatların Təsdiqlənməsi: + * Məlumat etibarsız olduqda avtomatik olaraq aydın xətalar göstərir. + * Hətta çox dərin JSON obyektlərində belə doğrulama aparır. +* Daxil olan məlumatları çevirmək ÌçÌn aşağıdakı məlumat növlərindən istifadə edilir: + * JSON. + * Yol parametrləri. + * Sorğu parametrləri. + * Çərəzlər. + * Başlıqlaq. + * Formalar. + * Fayllar. +* Daxil olan məlumatları çevirmək ÌçÌn aşağıdakı məlumat növlərindən istifadə edilir (JSON olaraq): + * Python tiplərinin (`str`, `int`, `float`, `bool`, `list`, və s) çevrilməsi. + * `datetime` obyektləri. + * `UUID` obyektləri. + * Verilənlər bazası modelləri. + * və daha çoxu... +* 2 alternativ istifadəçi interfeysi daxil olmaqla avtomatik interaktiv API sənədlərini təmin edir: + * Swagger UI. + * ReDoc. + +--- + +Gəlin əvvəlki nÃŒmunəyə qayıdaq və **FastAPI**-nin nələr edəcəyinə nəzər salaq: + +* `GET` və `PUT` sorğuları ÌçÌn `item_id`-nin yolda olub-olmadığını yoxlayacaq. +* `item_id`-nin `GET` və `PUT` sorğuları ÌçÌn növÃŒnÃŒn `int` olduğunu yoxlayacaq. + * Əgər `int` deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir. +* məcburi olmayan `q` parametrinin `GET` (`http://127.0.0.1:8000/items/foo?q=somequery` burdakı kimi) sorğusu içərisində olub olmadığını yoxlayacaq. + * `q` parametrini `= None` ilə yaratdığımız ÌçÌn, məcburi olmayan parametr olacaq. + * Əgər `None` olmasaydı, bu məcburi parametr olardı (`PUT` metodunun gövdəsində olduğu kimi). +* `PUT` sorğusu ÌçÌn, `/items/{item_id}` gövdəsini JSON olaraq oxuyacaq: + * `name` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `str` olub olmadığını yoxlayacaq. + * `price` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. + * `is_offer` adında məcburi olmayan bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. + * BÃŒtÃŒn bunlar ən dərin JSON obyektlərində belə işləyəcək. +* Məlumatların JSON-a və JSON-un Python obyektinə çevrilməsi avtomatik həyata keçiriləcək. +* Hər şeyi OpenAPI ilə uyğun olacaq şəkildə avtomatik olaraq sənədləşdirəcək və onları aşağıdakı kimi istifadə edə biləcək: + * İnteraktiv sənədləşmə sistemləri. + * Bir çox proqramlaşdırma dilləri ÌçÌn avtomatlaşdırılmış mÌştəri kodu yaratma sistemləri. +* 2 interaktiv sənədləşmə veb interfeysini birbaşa təmin edəcək. + +--- + +Yeni başlamışıq, amma siz artıq işin məntiqini başa dÌşmÃŒsÃŒnÃŒz. + +İndi aşağıdakı sətri dəyişdirməyə çalışın: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...bundan: + +```Python + ... "item_name": item.name ... +``` + +...buna: + +```Python + ... "item_price": item.price ... +``` + +...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +Daha çox funksiyaya malik daha dolğun nÃŒmunə ÌçÌn Öyrədici - İstifadəçi Təlimatı səhifəsinə baxa bilərsiniz. + +**Spoiler xəbərdarlığı**: Öyrədici - istifadəçi təlimatına bunlar daxildir: + +* **Parametrlərin**, **başlıqlar**, çərəzlər, **forma sahələri** və **fayllar** olaraq mÌəyyən edilməsi. +* `maximum_length` və ya `regex` kimi **doğrulama məhdudiyyətlərinin** necə təyin ediləcəyi. +* Çox gÃŒclÃŒ və istifadəsi asan **Dependency Injection** sistemi. +* TəhlÃŒkəsizlik və autentifikasiya, **JWT tokenləri** ilə **OAuth2** dəstəyi və **HTTP Basic** autentifikasiyası. +* **çox dərin JSON modellərini** mÌəyyən etmək ÌçÌn daha irəli səviyyə (lakin eyni dərəcədə asan) ÃŒsullar (Pydantic sayəsində). +* Strawberry və digər kitabxanalar ilə **GraphQL** inteqrasiyası. +* Digər əlavə xÃŒsusiyyətlər (Starlette sayəsində): + * **WebSockets** + * HTTPX və `pytest` sayəsində çox asan testlər + * **CORS** + * **Cookie Sessions** + * ...və daha çoxu. + +## Performans + +MÃŒstəqil TechEmpower meyarları göstərir ki, Uvicorn ÃŒzərində işləyən **FastAPI** proqramları ən sÃŒrətli Python kitabxanalarından biridir, yalnız Starlette və Uvicorn-un özÃŒndən yavaşdır, ki FastAPI bunların ÃŒzərinə qurulmuş bir framework-dÃŒr. (*) + +Ətraflı məlumat ÌçÌn bu bölməyə nəzər salın MÃŒqayisələr. + +## Məcburi Olmayan Tələblər + +Pydantic tərəfindən istifadə olunanlar: + +* email_validator - e-poçtun yoxlanılması ÌçÌn. +* pydantic-settings - parametrlərin idarə edilməsi ÌçÌn. +* pydantic-extra-types - Pydantic ilə istifadə edilə bilən əlavə tiplər ÌçÌn. + +Starlette tərəfindən istifadə olunanlar: + +* httpx - Əgər `TestClient` strukturundan istifadə edəcəksinizsə, tələb olunur. +* jinja2 - Standart şablon konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur. +* python-multipart - `request.form()` ilə forma "çevirmə" dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur. +* itsdangerous - `SessionMiddleware` dəstəyi ÌçÌn tələb olunur. +* pyyaml - `SchemaGenerator` dəstəyi ÌçÌn tələb olunur (Çox gÃŒman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq). +* ujson - `UJSONResponse` istifadə etmək istəyirsinizsə, tələb olunur. + +Həm FastAPI, həm də Starlette tərəfindən istifadə olunur: + +* uvicorn - Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir. +* orjson - `ORJSONResponse` istifadə edəcəksinizsə tələb olunur. + +BÃŒtÃŒn bunları `pip install fastapi[all]` ilə quraşdıra bilərsiniz. + +## Lisenziya + +Bu layihə MIT lisenziyasının şərtlərinə əsasən lisenziyalaşdırılıb. diff --git a/docs/az/mkdocs.yml b/docs/az/mkdocs.yml new file mode 100644 index 000000000..de18856f4 --- /dev/null +++ b/docs/az/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 2b843e026..9e22e3a22 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -267,6 +267,8 @@ extra: alternate: - link: / name: en - English + - link: /az/ + name: az - azərbaycan dili - link: /bn/ name: bn - àŠ¬àŠŸàŠ‚àŠ²àŠŸ - link: /de/ From c8c9ae475c33b6989c02ab72c20630b2fcb9b5ec Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 31 Jan 2024 15:46:19 +0000 Subject: [PATCH 206/222] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d7dba1721..3a4c6f170 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -49,6 +49,7 @@ hide: ### Translations +* 🌐 Add Azerbaijani translation for `docs/az/docs/index.md`. PR [#11047](https://github.com/tiangolo/fastapi/pull/11047) by [@aykhans](https://github.com/aykhans). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/middleware.md`. PR [#2829](https://github.com/tiangolo/fastapi/pull/2829) by [@JeongHyeongKim](https://github.com/JeongHyeongKim). * 🌐 Add German translation for `docs/de/docs/tutorial/body-nested-models.md`. PR [#10313](https://github.com/tiangolo/fastapi/pull/10313) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/middleware.md`. PR [#9695](https://github.com/tiangolo/fastapi/pull/9695) by [@mojtabapaso](https://github.com/mojtabapaso). From f43e18562b0dfd7b29305a1ee4751e5de1a0841e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 31 Jan 2024 23:13:52 +0100 Subject: [PATCH 207/222] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20add?= =?UTF-8?q?=20Coherence=20(#11066)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 5 +++++ docs/en/docs/deployment/cloud.md | 1 + docs/en/docs/img/sponsors/coherence-banner.png | Bin 0 -> 18388 bytes docs/en/docs/img/sponsors/coherence.png | Bin 0 -> 27886 bytes docs/en/overrides/main.html | 6 ++++++ 7 files changed, 16 insertions(+) create mode 100644 docs/en/docs/img/sponsors/coherence-banner.png create mode 100644 docs/en/docs/img/sponsors/coherence.png diff --git a/README.md b/README.md index 968ccf7a7..874abf8c6 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 0ce434b5e..fd8518ce3 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -20,6 +20,9 @@ gold: - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png + - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024 + title: Coherence + img: https://fastapi.tiangolo.com/img/sponsors/coherence.png silver: - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index 4078454a8..00cbec7d2 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -23,3 +23,8 @@ logins: - svixhq - Alek99 - codacy + - zanfaruqui + - scalar + - bump-sh + - andrew-propelauth + - svix diff --git a/docs/en/docs/deployment/cloud.md b/docs/en/docs/deployment/cloud.md index 29f0ad1f6..d34fbe2f7 100644 --- a/docs/en/docs/deployment/cloud.md +++ b/docs/en/docs/deployment/cloud.md @@ -14,3 +14,4 @@ You might want to try their services and follow their guides: * Platform.sh * Porter +* Coherence diff --git a/docs/en/docs/img/sponsors/coherence-banner.png b/docs/en/docs/img/sponsors/coherence-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..1d495965920e7fce5127637b50fd9530ce447de4 GIT binary patch literal 18388 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/sponsors/coherence.png b/docs/en/docs/img/sponsors/coherence.png new file mode 100644 index 0000000000000000000000000000000000000000..d48c4edc4df9693ef0d847fcd1b6c3055cb6c609 GIT binary patch literal 27886 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