committed by
GitHub
2 changed files with 245 additions and 0 deletions
@ -0,0 +1,244 @@ |
|||
# ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ |
|||
|
|||
ํ์ด์ฌ ํฌ๋งท ๋ฌธ์์ด์ด ์ฌ์ฉํ๋ ๋์ผํ ๋ฌธ๋ฒ์ผ๋ก "๋งค๊ฐ๋ณ์" ๋๋ "๋ณ์"๋ฅผ ๊ฒฝ๋ก์ ์ ์ธํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="6-7" |
|||
{!../../../docs_src/path_params/tutorial001.py!} |
|||
``` |
|||
|
|||
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ `item_id`์ ๊ฐ์ ํจ์์ `item_id` ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋์ ์ด ์์ ๋ฅผ ์คํํ๊ณ <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋ก ์ด๋ํ๋ฉด, ๋ค์ ์๋ต์ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
```JSON |
|||
{"item_id":"foo"} |
|||
``` |
|||
|
|||
## ํ์
์ด ์๋ ๋งค๊ฐ๋ณ์ |
|||
|
|||
ํ์ด์ฌ ํ์ค ํ์
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ํจ์์ ์๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ํ์
์ ์ ์ธํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="7" |
|||
{!../../../docs_src/path_params/tutorial002.py!} |
|||
``` |
|||
|
|||
์ง๊ธ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ, `item_id`๋ `int`๋ก ์ ์ธ ๋์์ต๋๋ค. |
|||
|
|||
!!! check "ํ์ธ" |
|||
์ด ๊ธฐ๋ฅ์ ํจ์ ๋ด์์ ์ค๋ฅ ๊ฒ์ฌ, ์๋์์ฑ ๋ฑ์ ํธ์ง๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค |
|||
|
|||
## ๋ฐ์ดํฐ <abbr title="๋ค์์ผ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค: ์ง๋ ฌํ, ํ์ฑ, ๋ง์ฌ๋ง">๋ณํ</abbr> |
|||
|
|||
์ด ์์ ๋ฅผ ์คํํ๊ณ <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>์ ์ด๋ฉด, ๋ค์ ์๋ต์ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
```JSON |
|||
{"item_id":3} |
|||
``` |
|||
|
|||
!!! check "ํ์ธ" |
|||
ํจ์๊ฐ ๋ฐ์(๋ฐํ๋ ํ๋) ๊ฐ์ ๋ฌธ์์ด `"3"`์ด ์๋๋ผ ํ์ด์ฌ `int` ํ์ธ `3`์
๋๋ค. |
|||
|
|||
์ฆ, ํ์
์ ์ธ์ ํ๋ฉด **FastAPI**๋ ์๋์ผ๋ก ์์ฒญ์ <abbr title="HTTP ์์ฒญ์์ ์ ๋ฌ๋๋ ๋ฌธ์์ด์ ํ์ด์ฌ ๋ฐ์ดํฐ๋ก ๋ณํ">"ํ์ฑ"</abbr>ํฉ๋๋ค. |
|||
|
|||
## ๋ฐ์ดํฐ ๊ฒ์ฆ |
|||
|
|||
ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์์ <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋ก ์ด๋ํ๋ฉด, ๋ฉ์ง HTTP ์ค๋ฅ๋ฅผ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
```JSON |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"loc": [ |
|||
"path", |
|||
"item_id" |
|||
], |
|||
"msg": "value is not a valid integer", |
|||
"type": "type_error.integer" |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ `item_id`๋ `int`๊ฐ ์๋ `"foo"` ๊ฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
`int` ๋์ `float`์ ์ ๋ฌํ๋ฉด ๋์ผํ ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a> |
|||
|
|||
!!! check "ํ์ธ" |
|||
์ฆ, ํ์ด์ฌ ํ์
์ ์ธ์ ํ๋ฉด **FastAPI**๋ ๋ฐ์ดํฐ ๊ฒ์ฆ์ ํฉ๋๋ค. |
|||
|
|||
์ค๋ฅ๋ ๊ฒ์ฆ์ ํต๊ณผํ์ง ๋ชปํ ์ง์ ๋ ์ ํํ๊ฒ ๋ช
์ํฉ๋๋ค. |
|||
|
|||
์ด๋ API์ ์ํธ ์์ฉํ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๊ณ ๋๋ฒ๊น
ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. |
|||
|
|||
## ๋ฌธ์ํ |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ์์ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋ฅผ ์ด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์๋ ๋ํ์ API ๋ฌธ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/path-params/image01.png"> |
|||
|
|||
!!! check "ํ์ธ" |
|||
๋ค์ ํ๋ฒ, ๊ทธ์ ํ์ด์ฌ ํ์
์ ์ธ์ ํ๊ธฐ๋ง ํ๋ฉด **FastAPI**๋ ์๋ ๋ํ์ API ๋ฌธ์(Swagger UI ํตํฉ)๋ฅผ ์ ๊ณตํฉ๋๋ค. |
|||
|
|||
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ ์ ์ํ์ผ๋ก ์ ์ธ๋์์ ์ฃผ๋ชฉํ์ธ์. |
|||
|
|||
## ํ์ค ๊ธฐ๋ฐ์ ์ด์ , ๋์ฒด ๋ฌธ์ํ |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ ์คํค๋ง๋ <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md" class="external-link" target="_blank">OpenAPI</a> ํ์ค์์ ๋์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํธํ๋๋ ๋๊ตฌ๊ฐ ๋ง์ด ์์ต๋๋ค. |
|||
|
|||
์ด ๋๋ถ์ **FastAPI**๋ <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋ก ์ ์ํ ์ ์๋ (ReDoc์ ์ฌ์ฉํ๋) ๋์ฒด API ๋ฌธ์๋ฅผ ์ ๊ณตํฉ๋๋ค: |
|||
|
|||
<img src="/img/tutorial/path-params/image02.png"> |
|||
|
|||
์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธํ๋๋ ๋๊ตฌ๊ฐ ๋ง์ด ์์ต๋๋ค. ๋ค์ํ ์ธ์ด์ ๋ํ ์ฝ๋ ์์ฑ ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค. |
|||
|
|||
## Pydantic |
|||
|
|||
๋ชจ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ์ <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a>์ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ํ๋๋ฏ๋ก ์ด๋ก ์ธํ ๋ชจ๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ๊ด๋ฆฌ๋ฅผ ์ ๋ฐ๊ณ ์์์ ๋๋ ์ ์์ต๋๋ค. |
|||
|
|||
`str`, `float`, `bool`๊ณผ ๋ค๋ฅธ ๋ณต์กํ ๋ฐ์ดํฐ ํ์
์ ์ธ์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ์ค ๋ช ๊ฐ์ง๋ ์์ต์์ ๋ค์ ์ฅ์์ ์ดํด๋ด
๋๋ค. |
|||
|
|||
## ์์ ๋ฌธ์ |
|||
|
|||
*๊ฒฝ๋ก ๋์*์ ๋ง๋ค๋ ๊ณ ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๊ณ ์๋ ์ํฉ๋ค์ ๋ง๋ฆ๋จ๋ฆด ์ ์์ต๋๋ค. |
|||
|
|||
`/users/me`์ฒ๋ผ, ํ์ฌ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ํฉ์๋ค. |
|||
|
|||
์ฌ์ฉ์ ID๋ฅผ ์ด์ฉํด ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ๋ก `/users/{user_id}`๋ ์์ต๋๋ค. |
|||
|
|||
*๊ฒฝ๋ก ๋์*์ ์์ฐจ์ ์ผ๋ก ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ `/users/{user_id}` ์ด์ ์ `/users/me`๋ฅผ ๋จผ์ ์ ์ธํด์ผ ํฉ๋๋ค: |
|||
|
|||
```Python hl_lines="6 11" |
|||
{!../../../docs_src/path_params/tutorial003.py!} |
|||
``` |
|||
|
|||
๊ทธ๋ ์ง ์์ผ๋ฉด `/users/{user_id}`๋ ๋งค๊ฐ๋ณ์ `user_id`์ ๊ฐ์ `"me"`๋ผ๊ณ "์๊ฐํ์ฌ" `/users/me`๋ ์ฐ๊ฒฐํฉ๋๋ค. |
|||
|
|||
## ์ฌ์ ์ ์ ๊ฐ |
|||
|
|||
๋ง์ฝ *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*๋ฅผ ๋ฐ๋ *๊ฒฝ๋ก ๋์*์ด ์์ง๋ง, ์ ํจํ๊ณ ๋ฏธ๋ฆฌ ์ ์ํ ์ ์๋ *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์* ๊ฐ์ ์ํ๋ค๋ฉด ํ์ด์ฌ ํ์ค <abbr title="์ด๊ฑฐํ(Enumeration)">`Enum`</abbr>์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
### `Enum` ํด๋์ค ์์ฑ |
|||
|
|||
`Enum`์ ์ํฌํธํ๊ณ `str`๊ณผ `Enum`์ ์์ํ๋ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. |
|||
|
|||
`str`์ ์์ํจ์ผ๋ก์จ API ๋ฌธ์๋ ๊ฐ์ด `string` ํ์ด์ด์ผ ํ๋ ๊ฒ์ ์๊ฒ ๋๊ณ ์ ๋๋ก ๋ ๋๋ง ํ ์ ์๊ฒ ๋ฉ๋๋ค. |
|||
|
|||
๊ณ ์ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์ ํจํ ํด๋์ค ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ง๋ญ๋๋ค: |
|||
|
|||
```Python hl_lines="1 6-9" |
|||
{!../../../docs_src/path_params/tutorial005.py!} |
|||
``` |
|||
|
|||
!!! info "์ ๋ณด" |
|||
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">์ด๊ฑฐํ(๋๋ enums)</a>์ ํ์ด์ฌ ๋ฒ์ 3.4 ์ดํ๋ก ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค. |
|||
|
|||
!!! tip "ํ" |
|||
ํน์ ํท๊ฐ๋ฆฐ๋ค๋ฉด, "AlexNet", "ResNet", ๊ทธ๋ฆฌ๊ณ "LeNet"์ ๊ทธ์ ๊ธฐ๊ณ ํ์ต <abbr title="๊ธฐ์ ์ ์ผ๋ก ์ ํํ๋ ๋ฅ ๋ฌ๋ ๋ชจ๋ธ ๊ตฌ์กฐ">๋ชจ๋ธ</abbr>๋ค์ ์ด๋ฆ์
๋๋ค. |
|||
|
|||
### *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์* ์ ์ธ |
|||
|
|||
์์ฑํ ์ด๊ฑฐํ ํด๋์ค(`ModelName`)๋ฅผ ์ฌ์ฉํ๋ ํ์
์ด๋
ธํ
์ด์
์ผ๋ก *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*๋ฅผ ๋ง๋ญ๋๋ค: |
|||
|
|||
```Python hl_lines="16" |
|||
{!../../../docs_src/path_params/tutorial005.py!} |
|||
``` |
|||
|
|||
### ๋ฌธ์ ํ์ธ |
|||
|
|||
*๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์๋์ด ์์ผ๋ฏ๋ก ๋ํํ ๋ฌธ์์์ ๋ฉ์ง๊ฒ ํ์๋ฉ๋๋ค: |
|||
|
|||
<img src="/img/tutorial/path-params/image03.png"> |
|||
|
|||
### ํ์ด์ฌ *์ด๊ฑฐํ*์ผ๋ก ์์
ํ๊ธฐ |
|||
|
|||
*๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*์ ๊ฐ์ *์ด๊ฑฐํ ๋ฉค๋ฒ*๊ฐ ๋ฉ๋๋ค. |
|||
|
|||
#### *์ด๊ฑฐํ ๋ฉค๋ฒ* ๋น๊ต |
|||
|
|||
์ด๊ฑฐ์ฒด `ModelName`์ *์ด๊ฑฐํ ๋ฉค๋ฒ*๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="17" |
|||
{!../../../docs_src/path_params/tutorial005.py!} |
|||
``` |
|||
|
|||
#### *์ด๊ฑฐํ ๊ฐ* ๊ฐ์ ธ์ค๊ธฐ |
|||
|
|||
`model_name.value` ๋๋ ์ผ๋ฐ์ ์ผ๋ก `your_enum_member.value`๋ฅผ ์ด์ฉํ์ฌ ์ค์ ๊ฐ(์ง๊ธ์ ๊ฒฝ์ฐ `str`)์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="20" |
|||
{!../../../docs_src/path_params/tutorial005.py!} |
|||
``` |
|||
|
|||
!!! tip "ํ" |
|||
`ModelName.lenet.value`๋ก๋ ๊ฐ `"lenet"`์ ์ ๊ทผํ ์ ์์ต๋๋ค. |
|||
|
|||
#### *์ด๊ฑฐํ ๋ฉค๋ฒ* ๋ฐํ |
|||
|
|||
*๊ฒฝ๋ก ๋์*์์ ์ค์ฒฉ JSON ๋ณธ๋ฌธ(์: `dict`) ์ญ์ *์ด๊ฑฐํ ๋ฉค๋ฒ*๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
ํด๋ผ์ด์ธํธ์ ๋ฐํํ๊ธฐ ์ ์ ํด๋น ๊ฐ(์ด ๊ฒฝ์ฐ ๋ฌธ์์ด)์ผ๋ก ๋ณํ๋ฉ๋๋ค: |
|||
|
|||
```Python hl_lines="18 21 23" |
|||
{!../../../docs_src/path_params/tutorial005.py!} |
|||
``` |
|||
|
|||
ํด๋ผ์ด์ธํธ๋ ์๋์ JSON ์๋ต์ ์ป์ต๋๋ค: |
|||
|
|||
```JSON |
|||
{ |
|||
"model_name": "alexnet", |
|||
"message": "Deep Learning FTW!" |
|||
} |
|||
``` |
|||
|
|||
## ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ |
|||
|
|||
`/files/{file_path}`๊ฐ ์๋ *๊ฒฝ๋ก ๋์*์ด ์๋ค๊ณ ํด๋ด
์๋ค. |
|||
|
|||
๊ทธ๋ฐ๋ฐ ์ฌ๋ฌ๋ถ์ `home/johndoe/myfile.txt`์ฒ๋ผ *path*์ ๋ค์ด์๋ `file_path` ์์ฒด๊ฐ ํ์ํฉ๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ํด๋น ํ์ผ์ URL์ ๋ค์์ฒ๋ผ ๋ฉ๋๋ค: `/files/home/johndoe/myfile.txt`. |
|||
|
|||
### OpenAPI ์ง์ |
|||
|
|||
ํ
์คํธ์ ์ ์๊ฐ ์ด๋ ค์ด ์๋๋ฆฌ์ค๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก OpenAPI๋ *๊ฒฝ๋ก*๋ฅผ ํฌํจํ๋ *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*๋ฅผ ๋ด๋ถ์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ผ์๋ Starlette์ ๋ด๋ถ ๋๊ตฌ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ **FastAPI**์์๋ ํ ์ ์์ต๋๋ค. |
|||
|
|||
๋งค๊ฐ๋ณ์์ ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด์ผ ํ๋ค๋ ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋ฌธ์๋ ๊ณ์ ์๋ํฉ๋๋ค. |
|||
|
|||
### ๊ฒฝ๋ก ๋ณํ๊ธฐ |
|||
|
|||
Starlette์์ ์ง์ ์ต์
์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ URL์ ์ฌ์ฉํ์ฌ *path*๋ฅผ ํฌํจํ๋ *๊ฒฝ๋ก ๋งค๊ฐ๋ณ์*๋ฅผ ์ ์ธ ํ ์ ์์ต๋๋ค: |
|||
|
|||
``` |
|||
/files/{file_path:path} |
|||
``` |
|||
|
|||
์ด๋ฌํ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ `file_path`์ด๊ณ ๋ง์ง๋ง ๋ถ๋ถ `:path`๋ ๋งค๊ฐ๋ณ์๊ฐ *๊ฒฝ๋ก*์ ์ผ์นํด์ผํจ์ ์๋ ค์ค๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="6" |
|||
{!../../../docs_src/path_params/tutorial004.py!} |
|||
``` |
|||
|
|||
!!! tip "ํ" |
|||
๋งค๊ฐ๋ณ์๊ฐ `/home/johndoe/myfile.txt`๋ฅผ ๊ฐ๊ณ ์์ด ์ฌ๋์๋ก ์์(`/`)ํด์ผ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ URL์: `/files//home/johndoe/myfile.txt`์ด๋ฉฐ `files`๊ณผ `home` ์ฌ์ด์ ์ด์ค ์ฌ๋์(`//`)๊ฐ ์๊น๋๋ค. |
|||
|
|||
## ์์ฝ |
|||
|
|||
**FastAPI**๊ณผ ํจ๊ป๋ผ๋ฉด ์งง๊ณ ์ง๊ด์ ์ธ ํ์ค ํ์ด์ฌ ํ์
์ ์ธ์ ์ฌ์ฉํ์ฌ ๋ค์์ ์ป์ ์ ์์ต๋๋ค: |
|||
|
|||
* ํธ์ง๊ธฐ ์ง์: ์ค๋ฅ ๊ฒ์ฌ, ์๋์์ฑ ๋ฑ |
|||
* ๋ฐ์ดํฐ "<abbr title="HTTP ์์ฒญ์์ ์ ๋ฌ๋๋ ๋ฌธ์์ด์ ํ์ด์ฌ ๋ฐ์ดํฐ๋ก ๋ณํ">ํ์ฑ</abbr>" |
|||
* ๋ฐ์ดํฐ ๊ฒ์ฆ |
|||
* API ์ฃผ์(Annotation)๊ณผ ์๋ ๋ฌธ์ |
|||
|
|||
์ ์ฌํญ๋ค์ ๊ทธ์ ํ๋ฒ์ ์ ์ธํ๋ฉด ๋ฉ๋๋ค. |
|||
|
|||
์ด๋ (์๋ ์ฑ๋ฅ๊ณผ๋ ๋ณ๊ฐ๋ก) ๋์ฒด ํ๋ ์์ํฌ์ ๋น๊ตํ์ ๋ **FastAPI**์ ์ฃผ์ ๊ฐ์์ ์ฅ์ ์ผ ๊ฒ์
๋๋ค. |
Loadingโฆ
Reference in new issue