committed by
GitHub
1 changed files with 127 additions and 0 deletions
@ -0,0 +1,127 @@ |
|||
# ํ
ํ๋ฆฟ |
|||
|
|||
**FastAPI**์ ํจ๊ป ์ํ๋ ์ด๋ค ํ
ํ๋ฆฟ ์์ง๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ผ๋ฐ์ ์ธ ์ ํ์ Jinja2๋ก, Flask์ ๋ค๋ฅธ ๋๊ตฌ์์๋ ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
์ค์ ์ ์ฝ๊ฒ ํ ์ ์๋ ์ ํธ๋ฆฌํฐ๊ฐ ์์ผ๋ฉฐ, ์ด๋ฅผ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค(Starlette ์ ๊ณต). |
|||
|
|||
## ์์กด์ฑ ์ค์น |
|||
|
|||
๊ฐ์ ํ๊ฒฝ์ ์์ฑํ๊ณ (virtual environment{.internal-link target=_blank}), ํ์ฑํํ ํ jinja2๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค: |
|||
|
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install jinja2 |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## ์ฌ์ฉํ๊ธฐ `Jinja2Templates` |
|||
|
|||
* `Jinja2Templates`๋ฅผ ๊ฐ์ ธ์ต๋๋ค. |
|||
* ๋์ค์ ์ฌ์ฌ์ฉํ ์ ์๋ `templates` ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. |
|||
* ํ
ํ๋ฆฟ์ ๋ฐํํ ๊ฒฝ๋ก ์์
์ `Request` ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค. |
|||
* ์์ฑํ `templates`๋ฅผ ์ฌ์ฉํ์ฌ `TemplateResponse`๋ฅผ ๋ ๋๋งํ๊ณ ๋ฐํํฉ๋๋ค. ํ
ํ๋ฆฟ์ ์ด๋ฆ, ์์ฒญ ๊ฐ์ฒด ๋ฐ Jinja2 ํ
ํ๋ฆฟ ๋ด์์ ์ฌ์ฉ๋ ํค-๊ฐ ์์ด ํฌํจ๋ "์ปจํ
์คํธ" ๋์
๋๋ฆฌ๋ ์ ๋ฌํฉ๋๋ค. |
|||
|
|||
|
|||
```Python hl_lines="4 11 15-18" |
|||
{!../../docs_src/templates/tutorial001.py!} |
|||
``` |
|||
|
|||
/// note | ์ฐธ๊ณ |
|||
|
|||
FastAPI 0.108.0 ์ด์ ๊ณผ Starlette 0.29.0์์๋ `name`์ด ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์์ต๋๋ค. |
|||
|
|||
๋ํ ์ด์ ๋ฒ์ ์์๋ `request` ๊ฐ์ฒด๊ฐ Jinja2์ ์ปจํ
์คํธ์์ ํค-๊ฐ ์์ ์ผ๋ถ๋ก ์ ๋ฌ๋์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// tip | ํ |
|||
|
|||
`response_class=HTMLResponse`๋ฅผ ์ ์ธํ๋ฉด ๋ฌธ์ UI ์๋ต์ด HTML์์ ์ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// note | ๊ธฐ์ ์ธ๋ถ ์ฌํญ |
|||
`from starlette.templating import Jinja2Templates`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ํธ๋ฆฌํจ์ผ๋ก `fastapi.templating` ๋์ `starlette.templating`์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต์ Starlette์์ ์ง์ ์ต๋๋ค. `Request` ๋ฐ `StaticFiles`๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. |
|||
/// |
|||
|
|||
## ํ
ํ๋ฆฟ ์์ฑํ๊ธฐ |
|||
|
|||
๊ทธ๋ฐ ๋ค์ `templates/item.html`์ ํ
ํ๋ฆฟ์ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด: |
|||
|
|||
```jinja hl_lines="7" |
|||
{!../../docs_src/templates/templates/item.html!} |
|||
``` |
|||
|
|||
### ํ
ํ๋ฆฟ ์ปจํ
์คํธ ๊ฐ |
|||
|
|||
๋ค์๊ณผ ๊ฐ์ HTML์์: |
|||
|
|||
{% raw %} |
|||
|
|||
```jinja |
|||
Item ID: {{ id }} |
|||
``` |
|||
|
|||
{% endraw %} |
|||
|
|||
...์ด๋ ์ ๋ฌํ "์ปจํ
์คํธ" `dict`์์ ๊ฐ์ ธ์จ `id`๋ฅผ ํ์ํฉ๋๋ค: |
|||
|
|||
```Python |
|||
{"id": id} |
|||
``` |
|||
|
|||
์๋ฅผ ๋ค์ด, ID๊ฐ `42`์ผ ๊ฒฝ์ฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋ง๋ฉ๋๋ค: |
|||
|
|||
```html |
|||
Item ID: 42 |
|||
``` |
|||
|
|||
### ํ
ํ๋ฆฟ `url_for` ์ธ์ |
|||
|
|||
ํ
ํ๋ฆฟ ๋ด์์ `url_for()`๋ฅผ ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ, ์ด๋ *๊ฒฝ๋ก ์์
ํจ์*์์ ์ฌ์ฉ๋ ์ธ์์ ๋์ผํ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ถ์์: |
|||
|
|||
{% raw %} |
|||
|
|||
```jinja |
|||
<a href="{{ url_for('read_item', id=id) }}"> |
|||
``` |
|||
|
|||
{% endraw %} |
|||
|
|||
...์ด๋ *๊ฒฝ๋ก ์์
ํจ์* `read_item(id=id)`๊ฐ ์ฒ๋ฆฌํ ๋์ผํ URL๋ก ๋งํฌ๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ID๊ฐ `42`์ผ ๊ฒฝ์ฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋ง๋ฉ๋๋ค: |
|||
```html |
|||
<a href="/items/42"> |
|||
``` |
|||
|
|||
## ํ
ํ๋ฆฟ๊ณผ ์ ์ ํ์ผ |
|||
|
|||
ํ
ํ๋ฆฟ ๋ด์์ `url_for()`๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์๋ฅผ ๋ค์ด `name="static"`์ผ๋ก ๋ง์ดํธํ `StaticFiles`์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
```jinja hl_lines="4" |
|||
{!../../docs_src/templates/templates/item.html!} |
|||
``` |
|||
|
|||
์ด ์์ ์์๋ `static/styles.css`์ ์๋ CSS ํ์ผ์ ์ฐ๊ฒฐ๋ ๊ฒ์
๋๋ค: |
|||
|
|||
```CSS hl_lines="4" |
|||
{!../../docs_src/templates/static/styles.css!} |
|||
``` |
|||
|
|||
๊ทธ๋ฆฌ๊ณ `StaticFiles`๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก, ํด๋น CSS ํ์ผ์ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์์ `/static/styles.css` URL๋ก ์๋ ์ ๊ณต๋ฉ๋๋ค. |
|||
|
|||
## ๋ ๋ง์ ์ธ๋ถ ์ฌํญ |
|||
|
|||
ํ
ํ๋ฆฟ ํ
์คํธ๋ฅผ ํฌํจํ ๋ ๋ง์ ์ธ๋ถ ์ฌํญ์ <a href="https://www.starlette.io/templates/" class="external-link" target="_blank">Starlette์ ํ
ํ๋ฆฟ ๋ฌธ์</a>๋ฅผ ํ์ธํ์ธ์. |
Loadingโฆ
Reference in new issue