diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index e46786a53..387063f12 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -64,7 +64,7 @@ jobs: BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }} # TODO: Use v3 when it's fixed, probably in v3.11 # https://github.com/cloudflare/wrangler-action/issues/307 - uses: cloudflare/wrangler-action@v3.11 + uses: cloudflare/wrangler-action@v3.12 # uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 694d68c69..fc61c3fca 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -35,7 +35,7 @@ jobs: TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} run: python -m build - name: Publish - uses: pypa/gh-action-pypi-publish@v1.11.0 + uses: pypa/gh-action-pypi-publish@v1.12.2 - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 84bec0421..d90e7281e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.1 + rev: v0.7.2 hooks: - id: ruff args: diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d072c618d..3764e2f96 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -27,6 +27,14 @@ hide: ### Translations +* ๐ŸŒ Add Korean translation for `/docs/ko/docs/environment-variables.md`. PR [#12526](https://github.com/fastapi/fastapi/pull/12526) by [@Tolerblanc](https://github.com/Tolerblanc). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/history-design-future.md`. PR [#12646](https://github.com/fastapi/fastapi/pull/12646) by [@saeye](https://github.com/saeye). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/advanced/advanced-dependencies.md`. PR [#12675](https://github.com/fastapi/fastapi/pull/12675) by [@kim-sangah](https://github.com/kim-sangah). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/how-to/conditional-openapi.md`. PR [#12731](https://github.com/fastapi/fastapi/pull/12731) by [@sptcnl](https://github.com/sptcnl). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/advanced/using_request_directly.md`. PR [#12738](https://github.com/fastapi/fastapi/pull/12738) by [@kwang1215](https://github.com/kwang1215). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/advanced/testing-events.md`. PR [#12741](https://github.com/fastapi/fastapi/pull/12741) by [@9zimin9](https://github.com/9zimin9). +* ๐ŸŒ Add Korean translation for `docs/ko/docs/security/index.md`. PR [#12743](https://github.com/fastapi/fastapi/pull/12743) by [@kim-sangah](https://github.com/kim-sangah). +* ๐ŸŒ Add Portuguese translation for `docs/pt/docs/advanced/path-operation-advanced-configuration.md`. PR [#12762](https://github.com/fastapi/fastapi/pull/12762) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * ๐ŸŒ Add Korean translation for `docs/ko/docs/advanced/wsgi.md`. PR [#12659](https://github.com/fastapi/fastapi/pull/12659) by [@Limsunoh](https://github.com/Limsunoh). * ๐ŸŒ Add Portuguese translation for `docs/pt/docs/advanced/websockets.md`. PR [#12703](https://github.com/fastapi/fastapi/pull/12703) by [@devfernandoa](https://github.com/devfernandoa). * ๐ŸŒ Add Portuguese translation for `docs/pt/docs/tutorial/security/simple-oauth2.md`. PR [#12520](https://github.com/fastapi/fastapi/pull/12520) by [@LidiaDomingos](https://github.com/LidiaDomingos). @@ -43,6 +51,10 @@ hide: ### Internal +* โฌ† Bump pypa/gh-action-pypi-publish from 1.12.0 to 1.12.2. PR [#12788](https://github.com/fastapi/fastapi/pull/12788) by [@dependabot[bot]](https://github.com/apps/dependabot). +* โฌ† Bump pypa/gh-action-pypi-publish from 1.11.0 to 1.12.0. PR [#12781](https://github.com/fastapi/fastapi/pull/12781) by [@dependabot[bot]](https://github.com/apps/dependabot). +* โฌ† Bump cloudflare/wrangler-action from 3.11 to 3.12. PR [#12777](https://github.com/fastapi/fastapi/pull/12777) by [@dependabot[bot]](https://github.com/apps/dependabot). +* โฌ† [pre-commit.ci] pre-commit autoupdate. PR [#12766](https://github.com/fastapi/fastapi/pull/12766) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * โฌ† Bump pypa/gh-action-pypi-publish from 1.10.3 to 1.11.0. PR [#12721](https://github.com/fastapi/fastapi/pull/12721) by [@dependabot[bot]](https://github.com/apps/dependabot). * โฌ† Update pre-commit requirement from <4.0.0,>=2.17.0 to >=2.17.0,<5.0.0. PR [#12749](https://github.com/fastapi/fastapi/pull/12749) by [@dependabot[bot]](https://github.com/apps/dependabot). * โฌ† Bump typer from 0.12.3 to 0.12.5. PR [#12748](https://github.com/fastapi/fastapi/pull/12748) by [@dependabot[bot]](https://github.com/apps/dependabot). diff --git a/docs/ko/docs/advanced/advanced-dependencies.md b/docs/ko/docs/advanced/advanced-dependencies.md new file mode 100644 index 000000000..aa5a332f8 --- /dev/null +++ b/docs/ko/docs/advanced/advanced-dependencies.md @@ -0,0 +1,179 @@ +# ๊ณ ๊ธ‰ ์˜์กด์„ฑ + +## ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์˜์กด์„ฑ + +์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๋ชจ๋“  ์˜์กด์„ฑ์€ ๊ณ ์ •๋œ ํ•จ์ˆ˜ ๋˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. + +ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ ๋„ ์˜์กด์„ฑ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, `q` ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํŠน์ • ๊ณ ์ •๋œ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์˜์กด์„ฑ์„ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. + +์ด๋•Œ ํ•ด๋‹น ๊ณ ์ •๋œ ๋‚ด์šฉ์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. + +## "ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ" ์ธ์Šคํ„ด์Šค + +Python์—๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ "ํ˜ธ์ถœ ๊ฐ€๋Šฅ"ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +ํด๋ž˜์Šค ์ž์ฒด(์ด๋ฏธ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•จ)๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +์ด๋ฅผ ์œ„ํ•ด `__call__` ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค: + +//// tab | Python 3.9+ + +```Python hl_lines="12" +{!> ../../docs_src/dependencies/tutorial011_an_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="11" +{!> ../../docs_src/dependencies/tutorial011_an.py!} +``` + +//// + +//// tab | Python 3.8+ non-Annotated + +/// tip | ์ฐธ๊ณ  + +๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด `Annotated` ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +/// + +```Python hl_lines="10" +{!> ../../docs_src/dependencies/tutorial011.py!} +``` + +//// + +์ด ๊ฒฝ์šฐ, **FastAPI**๋Š” ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•˜์œ„ ์˜์กด์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด `__call__`์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, +๋‚˜์ค‘์— *๊ฒฝ๋กœ ์—ฐ์‚ฐ ํ•จ์ˆ˜*์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์ด๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. + +## ์ธ์Šคํ„ด์Šค ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๊ธฐ + +์ด์ œ `__init__`์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ "๋งค๊ฐœ๋ณ€์ˆ˜ํ™”"ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +//// tab | Python 3.9+ + +```Python hl_lines="9" +{!> ../../docs_src/dependencies/tutorial011_an_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="8" +{!> ../../docs_src/dependencies/tutorial011_an.py!} +``` + +//// + +//// tab | Python 3.8+ non-Annotated + +/// tip | ์ฐธ๊ณ  + +๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด `Annotated` ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +/// + +```Python hl_lines="7" +{!> ../../docs_src/dependencies/tutorial011.py!} +``` + +//// + +์ด ๊ฒฝ์šฐ, **FastAPI**๋Š” `__init__`์— ์ „ํ˜€ ๊ด€์—ฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. + +## ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ + +๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +//// tab | Python 3.9+ + +```Python hl_lines="18" +{!> ../../docs_src/dependencies/tutorial011_an_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="17" +{!> ../../docs_src/dependencies/tutorial011_an.py!} +``` + +//// + +//// tab | Python 3.8+ non-Annotated + +/// tip | ์ฐธ๊ณ  + +๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด `Annotated` ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +/// + +```Python hl_lines="16" +{!> ../../docs_src/dependencies/tutorial011.py!} +``` + +//// + +์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `checker.fixed_content` ์†์„ฑ์— `"bar"`๋ผ๋Š” ๊ฐ’์„ ๋‹ด์•„ ์˜์กด์„ฑ์„ "๋งค๊ฐœ๋ณ€์ˆ˜ํ™”"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ์ธ์Šคํ„ด์Šค๋ฅผ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ + +๊ทธ๋Ÿฐ ๋‹ค์Œ, `Depends(FixedContentQueryChecker)` ๋Œ€์‹  `Depends(checker)`์—์„œ ์ด `checker` ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, +ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ์•„๋‹Œ ์ธ์Šคํ„ด์Šค `checker`๊ฐ€ ์˜์กด์„ฑ์ด ๋ฉ๋‹ˆ๋‹ค. + +์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•  ๋•Œ **FastAPI**๋Š” ์ด `checker`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค: + +```Python +checker(q="somequery") +``` + +...๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ *๊ฒฝ๋กœ ์—ฐ์‚ฐ ํ•จ์ˆ˜*์˜ `fixed_content_included` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค: + +//// tab | Python 3.9+ + +```Python hl_lines="22" +{!> ../../docs_src/dependencies/tutorial011_an_py39.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="21" +{!> ../../docs_src/dependencies/tutorial011_an.py!} +``` + +//// + +//// tab | Python 3.8+ non-Annotated + +/// tip | ์ฐธ๊ณ  + +๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด `Annotated` ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +/// + +```Python hl_lines="20" +{!> ../../docs_src/dependencies/tutorial011.py!} +``` + +//// + +/// tip | ์ฐธ๊ณ  + +์ด ๋ชจ๋“  ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์€ ์ด ๋ฐฉ๋ฒ•์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด ์˜ˆ์‹œ๋Š” ์˜๋„์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ์ „์ฒด ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. + +๋ณด์•ˆ ๊ด€๋ จ ์žฅ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ํŽธ์˜ ํ•จ์ˆ˜๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด ๋ชจ๋“  ๊ณผ์ •์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ๋ณด์•ˆ ๋„๊ตฌ๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ด๋ฏธ ํŒŒ์•…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +/// diff --git a/docs/ko/docs/advanced/testing-events.md b/docs/ko/docs/advanced/testing-events.md new file mode 100644 index 000000000..dc082412a --- /dev/null +++ b/docs/ko/docs/advanced/testing-events.md @@ -0,0 +1,7 @@ +# ์ด๋ฒคํŠธ ํ…Œ์ŠคํŠธ: ์‹œ์ž‘ - ์ข…๋ฃŒ + +ํ…Œ์ŠคํŠธ์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(`startup` ๋ฐ `shutdown`)๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, `with` ๋ฌธ๊ณผ ํ•จ๊ป˜ `TestClient`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +```Python hl_lines="9-12 20-24" +{!../../docs_src/app_testing/tutorial003.py!} +``` diff --git a/docs/ko/docs/advanced/using-request-directly.md b/docs/ko/docs/advanced/using-request-directly.md new file mode 100644 index 000000000..027ea9fad --- /dev/null +++ b/docs/ko/docs/advanced/using-request-directly.md @@ -0,0 +1,58 @@ +# `Request` ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ + +์ง€๊ธˆ๊นŒ์ง€ ์š”์ฒญ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๊ฐ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. + +๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค: + +* ๊ฒฝ๋กœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋ถ€ํ„ฐ. +* ํ—ค๋”. +* ์ฟ ํ‚ค. +* ๊ธฐํƒ€ ๋“ฑ๋“ฑ. + +์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, **FastAPI**๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋ฉฐ, API์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ž๋™ํ™”๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +ํ•˜์ง€๋งŒ `Request` ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## `Request` ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ + +**FastAPI**๋Š” ์‹ค์ œ๋กœ ๋‚ด๋ถ€์— **Starlette**์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ ์œ„์— ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๋ง๋ถ™์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ํ•„์š”ํ•  ๋•Œ Starlette์˜ `Request` ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +`Request` ๊ฐ์ฒด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋ณธ๋ฌธ์„ ์ฝ๊ธฐ)์—๋Š” FastAPI๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฌธ์„œํ™”(OpenAPI๋ฅผ ํ†ตํ•œ ๋ฌธ์„œ ์ž๋™ํ™”(๋กœ ์ƒ์„ฑ๋œ) API ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)๋„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜(์˜ˆ: Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ ๋ณธ๋ฌธ)๋Š” ์—ฌ์ „ํžˆ ๊ฒ€์ฆ, ๋ณ€ํ™˜, ์ฃผ์„ ์ถ”๊ฐ€ ๋“ฑ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. + +ํ•˜์ง€๋งŒ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” `Request` ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## `Request` ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ + +์—ฌ๋Ÿฌ๋ถ„์ด ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ/ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜* ๋‚ด๋ถ€์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. + +์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์š”์ฒญ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +```Python hl_lines="1 7-8" +{!../../docs_src/using_request_directly/tutorial001.py!} +``` + +*๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜* ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ `Request` ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋ฉด **FastAPI**๊ฐ€ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์— `Request` ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. + +/// tip | ํŒ + +์ด ๊ฒฝ์šฐ, ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๋”ฐ๋ผ์„œ, ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ถ”์ถœ๋˜๊ณ  ๊ฒ€์ฆ๋˜๋ฉฐ ์ง€์ •๋œ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋˜๊ณ  OpenAPI๋กœ ์ฃผ์„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. + +์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ํ‰์†Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•˜๋ฉด์„œ, ๋ถ€๊ฐ€์ ์œผ๋กœ `Request`๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +/// + +## `Request` ์„ค๋ช…์„œ + +์—ฌ๋Ÿฌ๋ถ„์€ `Request` ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๊ณต์‹ Starlette ์„ค๋ช…์„œ ์‚ฌ์ดํŠธ์—์„œ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ + +`from starlette.requests import Request`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + +**FastAPI**๋Š” ์—ฌ๋Ÿฌ๋ถ„(๊ฐœ๋ฐœ์ž)๋ฅผ ์œ„ํ•œ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ด๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” Starlette์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +/// diff --git a/docs/ko/docs/environment-variables.md b/docs/ko/docs/environment-variables.md new file mode 100644 index 000000000..09c2fd6d3 --- /dev/null +++ b/docs/ko/docs/environment-variables.md @@ -0,0 +1,298 @@ +# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ + +/// tip | "ํŒ" + +๋งŒ์•ฝ "ํ™˜๊ฒฝ ๋ณ€์ˆ˜"๊ฐ€ ๋ฌด์—‡์ด๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด, ์ด ์ฑ•ํ„ฐ๋ฅผ ์Šคํ‚ตํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค. + +/// + +ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ์˜ **๋ฐ”๊นฅ**์ธ, **์šด์˜ ์ฒด์ œ**์— ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์ฝ”๋“œ๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ **์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ํŒŒ์ด์ฌ์˜ **์„ค์น˜** ๊ณผ์ •์˜ ์ผ๋ถ€๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. + +## ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ + +ํŒŒ์ด์ฌ ์—†์ด๋„, **์…ธ (ํ„ฐ๋ฏธ๋„)** ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ **์ƒ์„ฑ** ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +// You could create an env var MY_NAME with +$ export MY_NAME="Wade Wilson" + +// Then you could use it with other programs, like +$ echo "Hello $MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +// Create an env var MY_NAME +$ $Env:MY_NAME = "Wade Wilson" + +// Use it with other programs, like +$ echo "Hello $Env:MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +## ํŒŒ์ด์ฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ + +ํŒŒ์ด์ฌ **๋ฐ”๊นฅ**์ธ ํ„ฐ๋ฏธ๋„์—์„œ(๋‹ค๋ฅธ ๋„๊ตฌ๋กœ๋„ ๊ฐ€๋Šฅ) ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ๋„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด๋ฅผ **ํŒŒ์ด์ฌ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** + +์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ `main.py` ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค: + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +/// tip | "ํŒ" + +`os.getenv()` ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. + +์—ฌ๊ธฐ์„œ๋Š” `"World"`๋ฅผ ๋„ฃ์—ˆ๊ธฐ์— ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ์จ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋„ฃ์ง€ ์•Š์œผ๋ฉด `None` ์ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. + +/// + +๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +// Here we don't set the env var yet +$ python main.py + +// As we didn't set the env var, we get the default value + +Hello World from Python + +// But if we create an environment variable first +$ export MY_NAME="Wade Wilson" + +// And then call the program again +$ python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +// Here we don't set the env var yet +$ python main.py + +// As we didn't set the env var, we get the default value + +Hello World from Python + +// But if we create an environment variable first +$ $Env:MY_NAME = "Wade Wilson" + +// And then call the program again +$ python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python +``` + +
+ +//// + +ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ฐ”๊นฅ์—์„œ ์„ค์ •๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋จธ์ง€ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ €์žฅ(`git`์— ์ปค๋ฐ‹)ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๊ตฌ์„ฑ์ด๋‚˜ **์„ค์ •** ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. + +**ํŠน์ • ํ”„๋กœ๊ทธ๋žจ ํ˜ธ์ถœ**์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋ฐ”๋กœ ์•ž, ๊ฐ™์€ ์ค„์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: + +
+ +```console +// Create an env var MY_NAME in line for this program call +$ MY_NAME="Wade Wilson" python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python + +// The env var no longer exists afterwards +$ python main.py + +Hello World from Python +``` + +
+ +/// tip | "ํŒ" + +The Twelve-Factor App: Config ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +/// + +## ํƒ€์ž…๊ณผ ๊ฒ€์ฆ + +์ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์€ ์˜ค์ง **ํ…์ŠคํŠธ ๋ฌธ์ž์—ด**๋กœ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์€ ํŒŒ์ด์ฌ ์™ธ๋ถ€์— ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋‚˜๋จธ์ง€ ์‹œ์Šคํ…œ(Linux, Windows, macOS ๋“ฑ ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ)๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +์ฆ‰, ํŒŒ์ด์ฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ์ฝ์€ **๋ชจ๋“  ๊ฐ’**์€ **`str`**์ด ๋˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ์˜ ๋ณ€ํ™˜์ด๋‚˜ ๊ฒ€์ฆ์€ ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +**์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ - ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜](./advanced/settings.md){.internal-link target=\_blank} ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ + +**`PATH`**๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”, **ํŠน๋ณ„ํ•œ** ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ(Linux, Windows, macOS ๋“ฑ)์—์„œ ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. + +๋ณ€์ˆ˜ `PATH`์˜ ๊ฐ’์€ Linux์™€ macOS์—์„œ๋Š” ์ฝœ๋ก  `:`, Windows์—์„œ๋Š” ์„ธ๋ฏธ์ฝœ๋ก  `;`์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๊ธด ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: + +//// tab | Linux, macOS + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +์ด๋Š” ์‹œ์Šคํ…œ์ด ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค: + +- `/usr/local/bin` +- `/usr/bin` +- `/bin` +- `/usr/sbin` +- `/sbin` + +//// + +//// tab | Windows + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 +``` + +์ด๋Š” ์‹œ์Šคํ…œ์ด ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค: + +- `C:\Program Files\Python312\Scripts` +- `C:\Program Files\Python312` +- `C:\Windows\System32` + +//// + +ํ„ฐ๋ฏธ๋„์— **๋ช…๋ น์–ด**๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์šด์˜ ์ฒด์ œ๋Š” `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋‚˜์—ด๋œ **๊ฐ ๋””๋ ‰ํ† ๋ฆฌ**์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ **์ฐพ์Šต๋‹ˆ๋‹ค.** + +์˜ˆ๋ฅผ ๋“ค์–ด ํ„ฐ๋ฏธ๋„์— `python`์„ ์ž…๋ ฅํ•˜๋ฉด ์šด์˜ ์ฒด์ œ๋Š” ํ•ด๋‹น ๋ชฉ๋ก์˜ **์ฒซ ๋ฒˆ์งธ ๋””๋ ‰ํ† ๋ฆฌ**์—์„œ `python`์ด๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. + +์ฐพ์œผ๋ฉด **์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค**. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด **๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ**์—์„œ ๊ณ„์† ์ฐพ์Šต๋‹ˆ๋‹ค. + +### ํŒŒ์ด์ฌ ์„ค์น˜์™€ `PATH` ์—…๋ฐ์ดํŠธ + +ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•  ๋•Œ, ์•„๋งˆ `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ด๋ƒ๊ณ  ๋ฌผ์–ด๋ดค์„ ๊ฒ๋‹ˆ๋‹ค. + +//// tab | Linux, macOS + +ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด `/opt/custompython/bin` ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. + +`PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก "์˜ˆ"๋ผ๊ณ  ํ•˜๋ฉด ์„ค์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ `/opt/custompython/bin`์„ `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. + +๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin +``` + +์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์— `python`์„ ์ž…๋ ฅํ•  ๋•Œ, ์‹œ์Šคํ…œ์ด `/opt/custompython/bin`(๋งˆ์ง€๋ง‰ ๋””๋ ‰ํ† ๋ฆฌ)์—์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +//// + +//// tab | Windows + +ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด `C:\opt\custompython\bin` ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. + +`PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก "์˜ˆ"๋ผ๊ณ  ํ•˜๋ฉด ์„ค์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ `C:\opt\custompython\bin`์„ `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin +``` + +์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์— `python`์„ ์ž…๋ ฅํ•  ๋•Œ, ์‹œ์Šคํ…œ์ด `C:\opt\custompython\bin`(๋งˆ์ง€๋ง‰ ๋””๋ ‰ํ† ๋ฆฌ)์—์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +//// + +๊ทธ๋ž˜์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•œ๋‹ค๋ฉด: + +
+ +```console +$ python +``` + +
+ +//// tab | Linux, macOS + +์‹œ์Šคํ…œ์€ `/opt/custompython/bin`์—์„œ `python` ํ”„๋กœ๊ทธ๋žจ์„ **์ฐพ์•„** ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค: + +
+ +```console +$ /opt/custompython/bin/python +``` + +
+ +//// + +//// tab | Windows + +์‹œ์Šคํ…œ์€ `C:\opt\custompython\bin\python`์—์„œ `python` ํ”„๋กœ๊ทธ๋žจ์„ **์ฐพ์•„** ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค: + +
+ +```console +$ C:\opt\custompython\bin\python +``` + +
+ +//// + +์ด ์ •๋ณด๋Š” [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md){.internal-link target=\_blank} ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +## ๊ฒฐ๋ก  + +์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  **ํ™˜๊ฒฝ ๋ณ€์ˆ˜**๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํŒŒ์ด์ฌ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค. + +๋˜ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ‚คํ”ผ๋””์•„(ํ•œ๊ตญ์–ด)์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๋งŽ์€ ๊ฒฝ์šฐ์—์„œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•˜๊ณ  ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๋ฐ”๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ณ„์† ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์„น์…˜์ธ [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md)์—์„œ ์ด ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/ko/docs/history-design-future.md b/docs/ko/docs/history-design-future.md new file mode 100644 index 000000000..6680a46e7 --- /dev/null +++ b/docs/ko/docs/history-design-future.md @@ -0,0 +1,81 @@ +# ์—ญ์‚ฌ, ๋””์ž์ธ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ + +์–ด๋А ๋‚ , [ํ•œ FastAPI ์‚ฌ์šฉ์ž](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920)๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค: + +> ์ด ํ”„๋กœ์ ํŠธ์˜ ์—ญ์‚ฌ๋ฅผ ์•Œ๋ ค ์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? ๋ช‡ ์ฃผ ๋งŒ์— ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ ๊ฒƒ ๊ฐ™์•„์š”. [...] + +์—ฌ๊ธฐ์„œ ๊ทธ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +## ๋Œ€์•ˆ + +์ €๋Š” ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ ๋จธ์‹ ๋Ÿฌ๋‹, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ๋น„๋™๊ธฐ ์ž‘์—…, NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ API๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ํŒ€์„ ์ด๋Œ์–ด ์™”์Šต๋‹ˆ๋‹ค. + +์ด ๊ณผ์ •์—์„œ ๋งŽ์€ ๋Œ€์•ˆ์„ ์กฐ์‚ฌํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๋ฉฐ, ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์˜ ์—ญ์‚ฌ๋Š” ๊ทธ ์ด์ „์— ๋‚˜์™”๋˜ ์—ฌ๋Ÿฌ ๋„๊ตฌ์˜ ์—ญ์‚ฌ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. + +[๋Œ€์•ˆ](alternatives.md){.internal-link target=_blank} ์„น์…˜์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ: + +> **FastAPI**๋Š” ์ด์ „์— ๋‚˜์™”๋˜ ๋งŽ์€ ๋„๊ตฌ๋“ค์˜ ๋…ธ๋ ฅ ์—†์ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. +> +> ์ด์ „์— ๊ฐœ๋ฐœ๋œ ์—ฌ๋Ÿฌ ๋„๊ตฌ๋“ค์ด ์ด ํ”„๋กœ์ ํŠธ์— ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. +> +> ์ €๋Š” ์˜ค๋žซ๋™์•ˆ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” **FastAPI**๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋„๊ตฌ๋“ค์„ ์กฐํ•ฉํ•ด ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. +> +> ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋„๊ตฌ๋“ค๋กœ๋ถ€ํ„ฐ ์ตœ๊ณ ์˜ ์•„์ด๋””์–ด๋“ค์„ ๋ชจ์œผ๊ณ , ์ด๋ฅผ ์ตœ์ ์˜ ๋ฐฉ์‹์œผ๋กœ ์กฐํ•ฉํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” :term:Python 3.6+ ํƒ€์ž… ํžŒํŠธ ์™€ ๊ฐ™์€, ์ด์ „์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. + +--- + +## ์กฐ์‚ฌ + +์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์—์„œ ๋ฐฐ์šด ์ ๋“ค์„ ๋ชจ์•„ ์ €์™€ ๊ฐœ๋ฐœํŒ€์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, ํ‘œ์ค€ :term:Python ํƒ€์ž… ํžŒํŠธ ์— ๊ธฐ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ๋Š” ์ ์ด ๋ช…ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค. + +๋˜ํ•œ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‘œ์ค€์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ด๋ผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. + +๊ทธ๋ž˜์„œ **FastAPI**์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋ช‡ ๋‹ฌ ๋™์•ˆ OpenAPI, JSON Schema, OAuth2 ๋ช…์„ธ๋ฅผ ์—ฐ๊ตฌํ•˜๋ฉฐ ์ด๋“ค์˜ ๊ด€๊ณ„์™€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„, ์ฐจ์ด์ ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. + +--- + +## ๋””์ž์ธ + +๊ทธ ํ›„, **FastAPI** ์‚ฌ์šฉ์ž๊ฐ€ ๋  ๊ฐœ๋ฐœ์ž๋กœ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž "API"๋ฅผ ๋””์ž์ธํ–ˆ์Šต๋‹ˆ๋‹ค. + +[Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools)์— ๋”ฐ๋ฅด๋ฉด ์•ฝ 80%์˜ Python ๊ฐœ๋ฐœ์ž๊ฐ€ PyCharm, VS Code, Jedi ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ธฐ ๋“ฑ์—์„œ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. + +๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, **FastAPI**์˜ ์ด์ ์€ ๊ฑฐ์˜ ๋ชจ๋“  ํŽธ์ง‘๊ธฐ์—์„œ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ชจ๋“  ๊ณณ์—์„œ ์ž๋™ ์™„์„ฑ, ํƒ€์ž… ๊ฒ€์‚ฌ, ์—๋Ÿฌ ํ™•์ธ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋Š” ์ตœ์ ์˜ ๋ฐฉ์‹์„ ์ฐพ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. + +์ด ๋ชจ๋“  ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. + +--- + +## ํ•„์š”์กฐ๊ฑด + +์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ํ…Œ์ŠคํŠธํ•œ ํ›„, [Pydantic](https://docs.pydantic.dev/)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. + +์ดํ›„ ์ €๋Š” **Pydantic**์ด JSON Schema์™€ ์™„๋ฒฝํžˆ ํ˜ธํ™˜๋˜๋„๋ก ๊ฐœ์„ ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์„ ์–ธ์„ ์ง€์›ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ์˜ ์ž๋™ ์™„์„ฑ๊ณผ ํƒ€์ž… ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. + +๋˜ํ•œ, ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ํ•„์š”์กฐ๊ฑด์ด์—ˆ๋˜ [Starlette](https://www.starlette.io/)์—๋„ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. + +--- + +## ๊ฐœ๋ฐœ + +**FastAPI**๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ฆˆ์Œ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ค€๋น„๊ฐ€ ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„๊ฐ€ ์ •์˜๋˜์—ˆ๊ณ , ํ•„์š”์กฐ๊ฑด๊ณผ ๋„๊ตฌ๊ฐ€ ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ, ํ‘œ์ค€๊ณผ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ง€์‹๋„ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. + +--- + +## ๋ฏธ๋ž˜ + +ํ˜„์‹œ์ ์—์„œ **FastAPI**๊ฐ€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ช…๋ฐฑํ•ด์กŒ์Šต๋‹ˆ๋‹ค. + +์—ฌ๋Ÿฌ ์šฉ๋„์— ๋” ์ ํ•ฉํ•œ ๋„๊ตฌ๋กœ์„œ ๊ธฐ์กด ๋Œ€์•ˆ๋ณด๋‹ค ์„ ํ˜ธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. +์ด๋ฏธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์™€ ํŒ€๋“ค์ด **FastAPI**์— ์˜์กดํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค (์ €์™€ ์ œ ํŒ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค). + +ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐœ์„ ํ•ด์•ผ ํ•  ์ ๊ณผ ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. + +**FastAPI**๋Š” ๋ฐ์€ ๋ฏธ๋ž˜๋กœ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. +๊ทธ๋ฆฌ๊ณ  [์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€](help-fastapi.md){.internal-link target=_blank}์€ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค. diff --git a/docs/ko/docs/how-to/conditional-openapi.md b/docs/ko/docs/how-to/conditional-openapi.md new file mode 100644 index 000000000..79c7f0dd2 --- /dev/null +++ b/docs/ko/docs/how-to/conditional-openapi.md @@ -0,0 +1,61 @@ +# ์กฐ๊ฑด๋ถ€์ ์ธ OpenAPI + +ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€๋กœ OpenAPI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๋ณด์•ˆ, API ๋ฐ docs์— ๋Œ€ํ•ด์„œ + +ํ”„๋กœ๋•์…˜์—์„œ, ๋ฌธ์„œํ™”๋œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด API๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด *๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค*. + +์ด๋Š” API์— ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, *๊ฒฝ๋กœ ์ž‘์—…*์€ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์œ„์น˜์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ฝ”๋“œ์— ๋ณด์•ˆ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฒฐํ•จ์€ ์—ฌ์ „ํžˆ ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +๋ฌธ์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ '๋ชจํ˜ธ์„ฑ์— ์˜ํ•œ ๋ณด์•ˆ'์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +API๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค: + +* ์š”์ฒญ ๋ณธ๋ฌธ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•ด ์ž˜ ์ •์˜๋œ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์„ธ์š”. + +* ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๊ถŒํ•œ๊ณผ ์—ญํ• ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”. + +* ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ ˆ๋Œ€ ์ €์žฅํ•˜์ง€ ๋ง๊ณ , ์˜ค์ง ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ์ €์žฅํ•˜์„ธ์š”. + +* Passlib๊ณผ JWT ํ† ํฐ๊ณผ ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ ์•”ํ˜ธํ™” ๋„๊ตฌ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์„ธ์š”. + +* ํ•„์š”ํ•œ ๊ณณ์— OAuth2 ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์„ธ๋ถ„ํ™”๋œ ๊ถŒํ•œ ์ œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. + +* ๋“ฑ๋“ฑ.... + +๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ํŠน์ • ํ™˜๊ฒฝ(์˜ˆ: ํ”„๋กœ๋•์…˜)์—์„œ ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์„ค์ •์— ๋”ฐ๋ผ API ๋ฌธ์„œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๋งค์šฐ ํŠน์ •ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ์„ค์ • ๋ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜์˜ ์กฐ๊ฑด๋ถ€ OpenAPI + +๋™์ผํ•œ Pydantic ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ OpenAPI ๋ฐ ๋ฌธ์„œ UI๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด: + +{* ../../docs_src/conditional_openapi/tutorial001.py hl[6,11] *} + +์—ฌ๊ธฐ์„œ `openapi_url` ์„ค์ •์„ ๊ธฐ๋ณธ๊ฐ’์ธ `"/openapi.json"`์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. + +๊ทธ๋Ÿฐ ๋’ค, ์šฐ๋ฆฌ๋Š” `FastAPI` ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `OPENAPI_URL`์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜์—ฌ OpenAPI(๋ฌธ์„œ UI ํฌํ•จ)๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: + +
+ +```console +$ OPENAPI_URL= uvicorn main:app + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +๊ทธ๋ฆฌ๊ณ  `/openapi.json`, `/docs` ๋˜๋Š” `/redoc`์˜ URL๋กœ ์ด๋™ํ•˜๋ฉด `404 Not Found`๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค: + +```JSON +{ + "detail": "Not Found" +} +``` diff --git a/docs/ko/docs/security/index.md b/docs/ko/docs/security/index.md new file mode 100644 index 000000000..5a6c733f0 --- /dev/null +++ b/docs/ko/docs/security/index.md @@ -0,0 +1,19 @@ +# ๊ณ ๊ธ‰ ๋ณด์•ˆ + +## ์ถ”๊ฐ€ ๊ธฐ๋Šฅ + +[์ž์Šต์„œ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md){.internal-link target=_blank} ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ ์™ธ์—๋„ ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +/// tip + +๋‹ค์Œ ์„น์…˜์€ **๋ฐ˜๋“œ์‹œ "๊ณ ๊ธ‰"** ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. + +๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ, ์ ํ•ฉํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๊ทธ ์ค‘ ํ•˜๋‚˜์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +/// + +## ๋จผ์ € ์ž์Šต์„œ ์ฝ๊ธฐ + +๋‹ค์Œ ์„น์…˜์€ ์ด๋ฏธ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. + +์ด ์„น์…˜๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๋ฉฐ, ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/pt/docs/advanced/path-operation-advanced-configuration.md b/docs/pt/docs/advanced/path-operation-advanced-configuration.md new file mode 100644 index 000000000..04f5cc9a3 --- /dev/null +++ b/docs/pt/docs/advanced/path-operation-advanced-configuration.md @@ -0,0 +1,212 @@ +# Configuraรงรฃo Avanรงada da Operaรงรฃo de Rota + +## operationId do OpenAPI + +/// warning | Aviso + +Se vocรช nรฃo รฉ um "especialista" no OpenAPI, vocรช provavelmente nรฃo precisa disso. + +/// + +Vocรช pode definir o `operationId` do OpenAPI que serรก utilizado na sua *operaรงรฃo de rota* com o parรขmetro `operation_id`. + +Vocรช precisa ter certeza que ele รฉ รบnico para cada operaรงรฃo. + +{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *} + +### Utilizando o nome da *funรงรฃo de operaรงรฃo de rota* como o operationId + +Se vocรช quiser utilizar o nome das funรงรตes da sua API como `operationId`s, vocรช pode iterar sobre todos esses nomes e sobrescrever o `operationId` em cada *operaรงรฃo de rota* utilizando o `APIRoute.name` dela. + +Vocรช deve fazer isso depois de adicionar todas as suas *operaรงรตes de rota*. + +{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2,12:21,24] *} + +/// tip | Dica + +Se vocรช chamar `app.openapi()` manualmente, os `operationId`s devem ser atualizados antes dessa chamada. + +/// + +/// warning | Aviso + +Se vocรช fizer isso, vocรช tem que ter certeza de que cada uma das suas *funรงรตes de operaรงรฃo de rota* tem um nome รบnico. + +Mesmo que elas estejam em mรณdulos (arquivos Python) diferentes. + +/// + +## Excluir do OpenAPI + +Para excluir uma *operaรงรฃo de rota* do esquema OpenAPI gerado (e por consequรชncia, dos sistemas de documentaรงรฃo automรกticos), utilize o parรขmetro `include_in_schema` e defina ele como `False`: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *} + +## Descriรงรฃo avanรงada a partir de docstring + +Vocรช pode limitar as linhas utilizadas a partir de uma docstring de uma *funรงรฃo de operaรงรฃo de rota* para o OpenAPI. + +Adicionar um `\f` (um caractere de escape para alimentaรงรฃo de formulรกrio) faz com que o **FastAPI** restrinja a saรญda utilizada pelo OpenAPI atรฉ esse ponto. + +Ele nรฃo serรก mostrado na documentaรงรฃo, mas outras ferramentas (como o Sphinx) serรฃo capazes de utilizar o resto do texto. + +{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *} + +## Respostas Adicionais + +Vocรช provavelmente jรก viu como declarar o `response_model` e `status_code` para uma *operaรงรฃo de rota*. + +Isso define os metadados sobre a resposta principal da *operaรงรฃo de rota*. + +Vocรช tambรฉm pode declarar respostas adicionais, com seus modelos, cรณdigos de status, etc. + +Existe um capรญtulo inteiro da nossa documentaรงรฃo sobre isso, vocรช pode ler em [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. + +## Extras do OpenAPI + +Quando vocรช declara uma *operaรงรฃo de rota* na sua aplicaรงรฃo, o **FastAPI** irรก gerar os metadados relevantes da *operaรงรฃo de rota* automaticamente para serem incluรญdos no esquema do OpenAPI. + +/// note | Nota + +Na especificaรงรฃo do OpenAPI, isso รฉ chamado de um Objeto de Operaรงรฃo. + +/// + +Ele possui toda a informaรงรฃo sobre a *operaรงรฃo de rota* e รฉ usado para gerar a documentaรงรฃo automaticamente. + +Ele inclui os atributos `tags`, `parameters`, `requestBody`, `responses`, etc. + +Esse esquema especรญfico para uma *operaรงรฃo de rota* normalmente รฉ gerado automaticamente pelo **FastAPI**, mas vocรช tambรฉm pode estender ele. + +/// tip | Dica + +Esse รฉ um ponto de extensรฃo de baixo nรญvel. + +Caso vocรช sรณ precise declarar respostas adicionais, uma forma conveniente de fazer isso รฉ com [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. + +/// + +Vocรช pode estender o esquema do OpenAPI para uma *operaรงรฃo de rota* utilizando o parรขmetro `openapi_extra`. + +### Extensรตes do OpenAPI + +Esse parรขmetro `openapi_extra` pode ser รบtil, por exemplo, para declarar [Extensรตes do OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions): + +{* ../../docs_src/path_operation_advanced_configuration/tutorial005.py hl[6] *} + +Se vocรช abrir os documentos criados automaticamente para a API, sua extensรฃo aparecerรก no final da *operaรงรฃo de rota* especรญfica. + + + +E se vocรช olhar o esquema OpenAPI resultante (na rota `/openapi.json` da sua API), vocรช verรก que a sua extensรฃo tambรฉm faz parte da *operaรงรฃo de rota* especรญfica: + +```JSON hl_lines="22" +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/items/": { + "get": { + "summary": "Read Items", + "operationId": "read_items_items__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "x-aperture-labs-portal": "blue" + } + } + } +} +``` + +### Esquema de *operaรงรฃo de rota* do OpenAPI personalizado + +O dicionรกrio em `openapi_extra` vai ter todos os seus nรญveis mesclados dentro do esquema OpenAPI gerado automaticamente para a *operaรงรฃo de rota*. + +Entรฃo, vocรช pode adicionar dados extras para o esquema gerado automaticamente. + +Por exemplo, vocรช poderia optar por ler e validar a requisiรงรฃo com seu prรณprio cรณdigo, sem utilizar funcionalidades automatizadas do FastAPI com o Pydantic, mas vocรช ainda pode quere definir a requisiรงรฃo no esquema OpenAPI. + +Vocรช pode fazer isso com `openapi_extra`: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[19:36,39:40] *} + +Nesse exemplo, nรณs nรฃo declaramos nenhum modelo do Pydantic. Na verdade, o corpo da requisiรงรฃo nรฃo estรก nem mesmo analisado como JSON, ele รฉ lido diretamente como `bytes` e a funรงรฃo `magic_data_reader()` seria a responsรกvel por analisar ele de alguma forma. + +De toda forma, nรณs podemos declarar o esquema esperado para o corpo da requisiรงรฃo. + +### Tipo de conteรบdo do OpenAPI personalizado + +Utilizando esse mesmo truque, vocรช pode utilizar um modelo Pydantic para definir o esquema JSON que รฉ entรฃo incluรญdo na seรงรฃo do esquema personalizado do OpenAPI na *operaรงรฃo de rota*. + +E vocรช pode fazer isso atรฉ mesmo quando os dados da requisiรงรฃo nรฃo seguem o formato JSON. + +Por exemplo, nesta aplicaรงรฃo nรณs nรฃo usamos a funcionalidade integrada ao FastAPI de extrair o esquema JSON dos modelos Pydantic nem a validaรงรฃo automรกtica do JSON. Na verdade, estamos declarando o tipo do conteรบdo da requisiรงรฃo como YAML, em vez de JSON: + +//// tab | Pydantic v2 + +```Python hl_lines="17-22 24" +{!> ../../docs_src/path_operation_advanced_configuration/tutorial007.py!} +``` + +//// + +//// tab | Pydantic v1 + +```Python hl_lines="17-22 24" +{!> ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} +``` + +//// + +/// info | Informaรงรฃo + +Na versรฃo 1 do Pydantic, o mรฉtodo para obter o esquema JSON de um modelo รฉ `Item.schema()`, na versรฃo 2 do Pydantic, o mรฉtodo รฉ `Item.model_json_schema()` + +/// + +Entretanto, mesmo que nรฃo utilizemos a funcionalidade integrada por padrรฃo, ainda estamos usando um modelo Pydantic para gerar um esquema JSON manualmente para os dados que queremos receber no formato YAML. + +Entรฃo utilizamos a requisiรงรฃo diretamente, e extraรญmos o corpo como `bytes`. Isso significa que o FastAPI nรฃo vai sequer tentar analisar o corpo da requisiรงรฃo como JSON. + +E entรฃo no nosso cรณdigo, nรณs analisamos o conteรบdo YAML diretamente, e estamos utilizando o mesmo modelo Pydantic para validar o conteรบdo YAML: + +//// tab | Pydantic v2 + +```Python hl_lines="26-33" +{!> ../../docs_src/path_operation_advanced_configuration/tutorial007.py!} +``` + +//// + +//// tab | Pydantic v1 + +```Python hl_lines="26-33" +{!> ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} +``` + +//// + +/// info | Informaรงรฃo + +Na versรฃo 1 do Pydantic, o mรฉtodo para analisar e validar um objeto era `Item.parse_obj()`, na versรฃo 2 do Pydantic, o mรฉtodo รฉ chamado de `Item.model_validate()`. + +/// + +///tip | Dica + +Aqui reutilizamos o mesmo modelo do Pydantic. + +Mas da mesma forma, nรณs poderรญamos ter validado de alguma outra forma. + +///