Skip to content

๊ฐœ๋ฐœ - ๊ธฐ์—ฌ

๋จผ์ € help FastAPI and get help์—์„œ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์„ ๋ณด๊ณ  ๋„์›€์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

์ด๋ฏธ ์ €์žฅ์†Œ๋ฅผ Cloneํ–ˆ๊ณ , ์ฝ”๋“œ๋ฅผ ์กฐ์‚ฌํ•˜๊ฒŒ ์•Œ๊ณ ์‹ถ์€ ๊ฒฝ์šฐ์— ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ด๋“œ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

venv๋ฅผ ์ด์šฉํ•œ ๊ฐ€์ƒํ™˜๊ฒฝ

Python์˜ venv ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

$ python -m venv env

๊ทธ๋Ÿฌ๋ฉด Python ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ./env/ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ๊ณ ๋ฆฝ๋œ ํ™˜๊ฒฝ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”

์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด:

<div class="termy">

```console
$ source ./env/bin/activate
```

</div>
<div class="termy">

```console
$ .\env\Scripts\Activate.ps1
```

</div>
Or if you use Bash for Windows (e.g. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>):

<div class="termy">

```console
$ source ./env/Scripts/activate
```

</div>

๋™์ž‘ ํ™•์ธ์„ ์œ„ํ•ด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค:

<div class="termy">

```console
$ which pip

some/directory/fastapi/env/bin/pip
```

</div>
<div class="termy">

```console
$ Get-Command pip

some/directory/fastapi/env/bin/pip
```

</div>

env/bin/pip ์— pip ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰

ํŒ

์ด ํ™˜๊ฒฝ ์•„๋ž˜์— pip ์—์„œ ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋‹ค์‹œ ํ™œ์„ฑํ™” ํ•ฉ๋‹ˆ๋‹ค.

This makes sure that if you use a terminal program installed by that package (like `flit`), you use the one from your local environment and not any other that could be installed globally.

Flit

FastAPI ๋Š” Flit ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ, ํŒจํ‚ค์ง€, publishํ•ฉ๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™” ํ•œ ํ›„, flit ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค:

$ pip install flit

---> 100%

์ด์ œ ํ™˜๊ฒฝ์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์„ค์น˜ํ•œ flit ์ด ์ „์—ญ์ด ์•„๋‹Œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  flit ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค :

<div class="termy">

```console
$ flit install --deps develop --symlink

---> 100%
```

</div>
If you are on Windows, use `--pth-file` instead of `--symlink`:

<div class="termy">

```console
$ flit install --deps develop --pth-file

---> 100%
```

</div>

์ด์ œ ๋ชจ๋“  ์ข…์†์„ฑ๊ณผ FastAPI๋ฅผ ๋‹น์‹ ์˜ ๋กœ์ปฌํ™˜๊ฒฝ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ FastAPI ์‚ฌ์šฉ

FastAPI๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•˜๋Š” Python ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด, ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ Python์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด, ๋กœ์ปฌ FastAPI ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  --symlink (Windows์˜ ๊ฒฝ์šฐ --pth-file )์— ์„ค์น˜๋˜์–ด์žˆ๋Š” ๋กœ์ปฌ FastAPI ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๊ฒฝ์šฐ, Python ํŒŒ์ผ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ FastAPI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋กœ์ปฌ๋ฒ„์ „์„ "install" ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Format

๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํฌ๋งทํ•˜๊ณ  ์ง€์›Œ์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :

$ bash scripts/format.sh

๋˜ํ•œ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌํ•˜๋ ค๋ฉด, ์œ„ ์„น์…˜์˜ ๋ช…๋ น์ธ --symlink (Windows์˜ ๊ฒฝ์šฐ --pth-file )์„ ์‚ฌ์šฉํ•˜์—ฌ FastAPI๋ฅผ ๋กœ์ปฌํ™˜๊ฒฝ์— ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Format imports

์ด์™ธ์—๋„ ๋ชจ๋“  import๋ฅผ ํฌ๋งทํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ import๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

$ bash scripts/format-imports.sh

์—ฌ๋Ÿฌ ๋ช…๋ น์„ ์ฐจ๋ก€๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋งŽ์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋˜๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ scripts/format.sh ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ , scripts/format-imports.sh ๋Š” ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค .

Docs

๋จผ์ € ์œ„์™€ ๊ฐ™์ด ํ™˜๊ฒฝ์„ ์„ค์ •ํ•œ๋‹ค๋ฉด ํ•„์š”ํ•œ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œํ™” ํ•˜๋Š”๋ฐ MkDocs ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฒˆ์—ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ / ์Šคํฌ๋ฆฝํŠธ์ธ ./scripts/docs.py ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ

./scripts/docs.py ์˜ ์ฝ”๋“œ๋ฅผ ๋ณผ ํ•„์š”๋Š” ์—†๊ณ , ๊ทธ๋ƒฅ ๋ช…๋ นํ–‰์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฌธ์„œ๋Š” Markdown ํ˜•์‹์œผ๋กœ ./docs/en/ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ํŠœํ† ๋ฆฌ์–ผ์€ ์ฝ”๋“œ ๋ธ”๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๋ธ”๋ก๋“ค์€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๋ธ”๋ก๋“ค์€ Markdown ๋‚ด๋ถ€์— ์ž‘์„ฑ๋˜์ง€ ์•Š๊ณ , ./docs_src/ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Python ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น Python ํŒŒ์ผ์€ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฌธ์„œ์— ํฌํ•จ/์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

Docs for tests

๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ ๋ฌธ์„œ์˜ ์˜ˆ์ œ ์†Œ์Šค ํŒŒ์ผ์— ๋Œ€ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

  • ๋ฌธ์„œ๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ธ๊ฐ€?
  • ๋ฌธ์„œ์˜ ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๋ฌธ์„œ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ ๋ฒ”์œ„์—์„œ ๋ณด์žฅ๋˜๋Š”๊ฐ€?

๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—, ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ live-reloading ๋ฉ๋‹ˆ๋‹ค:

$ python ./scripts/docs.py live

<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008
<span style="color: green;">[INFO]</span> Start watching changes
<span style="color: green;">[INFO]</span> Start detecting changes

๋ฌธ์„œ๋Š” http://127.0.0.1:8008 ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ฌธ์„œ/์†Œ์Šค ํŒŒ์ผ ์„ ํŽธ์ง‘ํ•˜๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Typer CLI (optional)

./scripts/docs.py ์—์„œ๋Š” python ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Typer CLI ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•œ๋‹ค๋ฉด, ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ํ„ฐ๋ฏธ๋„์—์„œ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ด์šฉํ•˜์—ฌ Typer CLI๋ฅผ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

$ typer --install-completion

zsh completion installed in /home/user/.bashrc.
Completion will take effect once you restart the terminal.

Apps and docs at the same time

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ˜ํ”Œ์„ ์‹คํ–‰ํ•˜๋ฉด :

$ uvicorn tutorial001:app --reload

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Uvicorn์€ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ port 8000 ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, port 8008 ์˜ ๋ฌธ์„œ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Translations

๋ฒˆ์—ญ์— ๋Œ€ํ•œ ๋„์›€์€ ๋งค์šฐ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋„์›€ ์—†์ด ์ด๋ฃฐ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐ŸŒŽ ๐Ÿš€

๋ฒˆ์—ญ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Tips and guidelines

  • ๋‹น์‹ ์˜ ์–ธ์–ด๋ฅผ existing pull requests ์—์„œ ํ™•์ธํ•˜๊ณ , ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์Šน์ธํ•˜๋Š” ๋ฆฌ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํŒ

์ด๋ฏธ ์กด์žฌํ•˜๋Š” pull requests์— add comments with change suggestions ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Check the docs about <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews" class="external-link" target="_blank">adding a pull request review</a> to approve it or request changes.
  • issues ์—์„œ ๋‹น์‹ ์˜ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฒˆ์—ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ๋ฒˆ์—ญํ•˜๋Š” ํŽ˜์ด์ง€ ๋‹น ํ•œ ๊ฐœ์˜ pull request๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€ํ† ํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ œ๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ, ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒˆ์—ญ์„ ๊ฒ€ํ† ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ž์‹ ์˜ ์–ธ์–ด๊ฐ€ ๋ฒˆ์—ญ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ๊ฒƒ์— ๋ฆฌ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ๋Š” ๋ฒˆ์—ญ์ด ์ž˜ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๊ฒƒ์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ™์€ Python ์˜ˆ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฌธ์„œ๋‚ด์— ์žˆ๋Š” ํ…์ŠคํŠธ๋งŒ์„ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ค‘์— ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ์ด๋ฏธ์ง€, ํŒŒ์ผ, ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ์ž‘์—…์ค‘์— ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฒˆ์—ญ์„ ์›ํ•˜๋Š” ์–ธ์–ด์˜ ๋‘ ๋ฌธ์ž๋กœ ๋œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ํ‘œ List of ISO 639-1 codes ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Existing language

์ŠคํŽ˜์ธ์–ด์ฒ˜๋Ÿผ ์ด๋ฏธ ์ผ๋ถ€ ํŽ˜์ด์ง€๊ฐ€ ๋ฒˆ์—ญ๋˜์–ด ์žˆ๋Š” ์–ธ์–ด์˜ ๋ฒˆ์—ญ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ŠคํŽ˜์ธ์–ด์˜ ๊ฒฝ์šฐ, ๋‘ ๋ฌธ์ž๋กœ ๋œ ์ฝ”๋“œ๊ฐ€ es ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ŠคํŽ˜์ธ์–ด์˜ ๋””๋ ‰ํ† ๋ฆฌ๋Š” docs/es/ ์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ

๋ฉ”์ธ ("๊ณต์‹") ์–ธ์–ด๋Š” ์˜์–ด์ด๊ณ , docs/en/ ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ŠคํŽ˜์ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ๋ผ์ด๋ธŒ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค :

// Use the command "live" and pass the language code as a CLI argument
$ python ./scripts/docs.py live es

<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008
<span style="color: green;">[INFO]</span> Start watching changes
<span style="color: green;">[INFO]</span> Start detecting changes

์ด์ œ http://127.0.0.1:8008 ์„ ์—ด์–ด ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FastAPI ๋ฌธ์„œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋ฉด ๋ชจ๋“  ์–ธ์–ด์— ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ํŽ˜์ด์ง€๋Š” ๋ฒˆ์—ญ๋˜์ง€ ์•Š๊ณ , ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ๋ฒˆ์—ญ๋œ ํŽ˜์ด์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Now let's say that you want to add a translation for the section Features.

  • ๋‹ค์Œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค :
docs/en/docs/features.md
  • ๋ฒˆ์—ญํ•˜๊ณ  ์‹ถ์€ ์–ธ์–ด๋ฅผ ์œ„ํ•ด์„œ ์ด๊ฒƒ์„ ์ •ํ™•ํžˆ ๊ฐ™์€ ์œ„์น˜์— ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด:
docs/es/docs/features.md

ํŒ

๊ฒฝ๋กœ์™€ ํŒŒ์ผ์˜ ์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ en ์—์„œ es ๋กœ ๋ฐ”๊พธ๋Š” ์–ธ์–ด์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  • ์ด์ œ ์˜์–ด๋กœ๋œ MkDocs config file ์„ ์—ฝ๋‹ˆ๋‹ค :
docs/en/docs/mkdocs.yml
  • config file์—์„œ docs/features.md ์˜ ์œ„์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. :
site_name: FastAPI
# More stuff
nav:
- FastAPI: index.md
- Languages:
  - en: /
  - es: /es/
- features.md
  • ํŽธ์ง‘ํ•˜๊ณ ์ž ํ•˜๋Š” ์–ธ์–ด์˜ MkDocs ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค, ์˜ˆ๋ฅผ ๋“ค๋ฉด:
docs/es/docs/mkdocs.yml
  • ๊ทธ๊ฒƒ์„ ์˜์–ด์™€ ๋˜‘๊ฐ™์€ ์œ„์น˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค, ์˜ˆ๋ฅผ ๋“ค๋ฉด:
site_name: FastAPI
# More stuff
nav:
- FastAPI: index.md
- Languages:
  - en: /
  - es: /es/
- features.md

๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฒˆ์—ญ์„ ํฌํ•จํ•œ ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์ด ์˜์–ด ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ธŒ๋ผ์šฐ์ €์— ์ ‘์†ํ•˜๋ฉด ๋ฌธ์„œ์— ์ƒˆ๋กœ์šด ์„น์…˜์ด ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ‰

์ด์ œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ์ผ์˜ ์ €์žฅ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

New Language

์•„์ง ๋ฒˆ์—ญ๋˜์ง€ ์•Š์€ ์–ธ์–ด์˜ ๋ฒˆ์—ญ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

Creole์–ด ๋ฒˆ์—ญ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ์•„์ง ๋ฌธ์„œ์— ์—†์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋งํฌ๋ฅผ ํ™•์ธํ•˜๋ฉด "Creole"์˜ ๋ฌธ์ž์ฝ”๋“œ๋Š” ht ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฒˆ์—ญ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค :

// Use the command new-lang, pass the language code as a CLI argument
$ python ./scripts/docs.py new-lang ht

Successfully initialized: docs/ht
Updating ht
Updating en

์ด์ œ ์ฝ”๋“œํŽธ์ง‘๊ธฐ์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ docs/ht/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ

Create a first pull request with just this, to set up the configuration for the new language, before adding translations.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€์—์„œ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋ˆ„๊ตฐ๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ์ž‘์—…์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

๋จผ์ € ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ docs/ht/index.md ๋ฅผ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ "๊ธฐ์กด์˜ ์–ธ์–ด"์— ๋Œ€ํ•œ ์ด์ „์˜ ์ง€์‹œ๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

New Language not supported

๋ผ์ด๋ธŒ ์„œ๋ฒ„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค :

 raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: partials/language/xx.html

์ด๊ฒƒ์€ ํ…Œ๋งˆ๊ฐ€ ํ•ด๋‹น ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (์ด ๊ฒฝ์šฐ, xx ์˜ ๋‘ ๋ฌธ์ž๋กœ ๋œ ๊ฐ€์งœ ์ฝ”๋“œ).

๊ทธ๋Ÿฌ๋‚˜ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค, ํ…Œ๋งˆ ์–ธ์–ด๋ฅผ ์˜์–ด๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ์–ธ์–ด์˜ mkdocs.yml ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŽธ์ง‘ํ•˜์‹ญ์‹œ์˜ค:

site_name: FastAPI
# More stuff
theme:
  # More stuff
  language: xx

์–ธ์–ด๋ฅผ xx (๋‹น์‹ ์˜ ์–ธ์–ด ์ฝ”๋“œ) ์—์„œ en ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ ๋ผ์ด๋ธŒ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Preview the result

./scripts/docs.py ์Šคํฌ๋ฆฝํŠธ๋ฅผ live ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ˜„์žฌ์˜ ์–ธ์–ด์—์„œ ์ด์šฉ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๊ณผ ๋ฒˆ์—ญ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ์‹คํ–‰๋˜๋ฉด ์˜จ๋ผ์ธ์—์„œ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ชจ๋‘ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด, ๋จผ์ € ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค :

// Use the command "build-all", this will take a bit
$ python ./scripts/docs.py build-all

Updating es
Updating en
Building docs for: en
Building docs for: es
Successfully built docs for: es
Copying en index.md to README.md

์ด์ œ ์–ธ์–ด๋งˆ๋‹ค ./docs_build/ ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ฒˆ์—ญ์ด ๋ˆ„๋ฝ๋œ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ "์ด ํŒŒ์ผ์—๋Š” ๋ฒˆ์—ญ์ด ์•„์ง ์—†์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ๋ฉ”๋ชจ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…๋ฆฝ MkDocs ์‚ฌ์ดํŠธ๋ฅผ ๋นŒ๋“œํ•˜์—ฌ ๊ทธ๊ฒƒ๋“ค์„ ๊ฒฐํ•ฉํ•˜๊ณ  ./site/ ์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด serve ๋ช…๋ น์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// Use the command "serve" after running "build-all"
$ python ./scripts/docs.py serve

Warning: this is a very simple server. For development, use mkdocs serve instead.
This is here only to preview a site with translations already built.
Make sure you run the build-all command first.
Serving at: http://127.0.0.1:8008

Tests

๋กœ์ปฌ์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  HTML์—์„œ coverage ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

$ bash scripts/test-cov-html.sh

์ด ๋ช…๋ น์€ ./htmlcov/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ./htmlcov/index.html ํŒŒ์ผ์„ ์—ด๋ฉด, ํ…Œ์ŠคํŠธ์— ํฌํ•จ๋œ ์ฝ”๋“œ์˜ ์˜์—ญ์„ ๋Œ€ํ™”์‹์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ˆ„๋ฝ๋œ ์˜์—ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.