committed by
GitHub
1 changed files with 131 additions and 0 deletions
@ -0,0 +1,131 @@ |
|||
|
|||
# ๋ฉํ๋ฐ์ดํฐ ๋ฐ ๋ฌธ์ํ URL |
|||
|
|||
**FastAPI** ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋ค์ํ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ์ฌ์ฉ์ ๋ง์ถค ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
## API์ ๋ํ ๋ฉํ๋ฐ์ดํฐ |
|||
|
|||
OpenAPI ๋ช
์ธ ๋ฐ ์๋ํ๋ API ๋ฌธ์ UI์ ์ฌ์ฉ๋๋ ๋ค์ ํ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค: |
|||
|
|||
| ๋งค๊ฐ๋ณ์ | ํ์
| ์ค๋ช
| |
|||
|----------|------|-------| |
|||
| `title` | `str` | API์ ์ ๋ชฉ์
๋๋ค. | |
|||
| `summary` | `str` | API์ ๋ํ ์งง์ ์์ฝ์
๋๋ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ</small> | |
|||
| `description` | `str` | API์ ๋ํ ์งง์ ์ค๋ช
์
๋๋ค. ๋งํฌ๋ค์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. | |
|||
| `version` | `string` | API์ ๋ฒ์ ์
๋๋ค. OpenAPI์ ๋ฒ์ ์ด ์๋, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ์ ์ ๋ํ๋
๋๋ค. ์: `2.5.0` | |
|||
| `terms_of_service` | `str` | API ์ด์ฉ ์ฝ๊ด์ URL์
๋๋ค. ์ ๊ณตํ๋ ๊ฒฝ์ฐ URL ํ์์ด์ด์ผ ํฉ๋๋ค. | |
|||
| `contact` | `dict` | ๋
ธ์ถ๋ API์ ๋ํ ์ฐ๋ฝ์ฒ ์ ๋ณด์
๋๋ค. ์ฌ๋ฌ ํ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. <details><summary><code>contact</code> ํ๋</summary><table><thead><tr><th>๋งค๊ฐ๋ณ์</th><th>ํ์
</th><th>์ค๋ช
</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ธ๋ฌผ/์กฐ์ง์ ์๋ณ๋ช
์
๋๋ค.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ ๋ณด๊ฐ ๋ด๊ธด URL์
๋๋ค. URL ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ธ๋ฌผ/์กฐ์ง์ ์ด๋ฉ์ผ ์ฃผ์์
๋๋ค. ์ด๋ฉ์ผ ์ฃผ์ ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr></tbody></table></details> | |
|||
| `license_info` | `dict` | ๋
ธ์ถ๋ API์ ๋ผ์ด์ ์ค ์ ๋ณด์
๋๋ค. ์ฌ๋ฌ ํ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. <details><summary><code>license_info</code> ํ๋</summary><table><thead><tr><th>๋งค๊ฐ๋ณ์</th><th>ํ์
</th><th>์ค๋ช
</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ํ์</strong> (<code>license_info</code>๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ). API์ ์ฌ์ฉ๋ ๋ผ์ด์ ์ค ์ด๋ฆ์
๋๋ค.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>API์ ๋ํ <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> ๋ผ์ด์ ์ค ํํ์
๋๋ค. <code>identifier</code> ํ๋๋ <code>url</code> ํ๋์ ์ํธ ๋ฐฐํ์ ์
๋๋ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>API์ ์ฌ์ฉ๋ ๋ผ์ด์ ์ค์ URL์
๋๋ค. URL ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr></tbody></table></details> | |
|||
|
|||
๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="3-16 19-32" |
|||
{!../../docs_src/metadata/tutorial001.py!} |
|||
``` |
|||
|
|||
/// tip |
|||
|
|||
`description` ํ๋์ ๋งํฌ๋ค์ด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ถ๋ ฅ์์ ๋ ๋๋ง๋ฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ์๋ํ(๋ก ์์ฑ๋) API ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค: |
|||
|
|||
<img src="/img/tutorial/metadata/image01.png"> |
|||
|
|||
## ๋ผ์ด์ ์ค ์๋ณ์ |
|||
|
|||
OpenAPI 3.1.0 ๋ฐ FastAPI 0.99.0๋ถํฐ `license_info`์ `identifier`๋ฅผ URL ๋์ ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์: |
|||
|
|||
```Python hl_lines="31" |
|||
{!../../docs_src/metadata/tutorial001_1.py!} |
|||
``` |
|||
|
|||
## ํ๊ทธ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ |
|||
|
|||
`openapi_tags` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์๋์ ๊ทธ๋ฃนํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๊ทธ์ ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฆฌ์คํธ๋ ๊ฐ ํ๊ทธ์ ๋ํด ํ๋์ ๋์
๋๋ฆฌ๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. |
|||
|
|||
๊ฐ ๋์
๋๋ฆฌ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค: |
|||
|
|||
* `name` (**ํ์**): `tags` ๋งค๊ฐ๋ณ์์์ *๊ฒฝ๋ก ์๋*๊ณผ `APIRouter`์ ์ฌ์ฉ๋ ํ๊ทธ ์ด๋ฆ๊ณผ ๋์ผํ `str`์
๋๋ค. |
|||
* `description`: ํ๊ทธ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์ ๋ด์ `str`์
๋๋ค. ๋งํฌ๋ค์ด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฌธ์ UI์ ํ์๋ฉ๋๋ค. |
|||
* `externalDocs`: ์ธ๋ถ ๋ฌธ์๋ฅผ ์ค๋ช
ํ๋ `dict`์ด๋ฉฐ: |
|||
* `description`: ์ธ๋ถ ๋ฌธ์์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์ ๋ด์ `str`์
๋๋ค. |
|||
* `url` (**ํ์**): ์ธ๋ถ ๋ฌธ์์ URL์ ๋ด์ `str`์
๋๋ค. |
|||
|
|||
### ํ๊ทธ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์์ฑ |
|||
|
|||
`users` ๋ฐ `items`์ ๋ํ ํ๊ทธ ์์์ ํจ๊ป ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ `openapi_tags` ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํด ๋ณด๊ฒ ์ต๋๋ค: |
|||
|
|||
```Python hl_lines="3-16 18" |
|||
{!../../docs_src/metadata/tutorial004.py!} |
|||
``` |
|||
|
|||
์ค๋ช
์์ ๋งํฌ๋ค์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด "login"์ ๊ตต๊ฒ(**login**) ํ์๋๊ณ , "fancy"๋ ๊ธฐ์ธ์๊ผด(_fancy_)๋ก ํ์๋ฉ๋๋ค. |
|||
|
|||
/// tip |
|||
|
|||
์ฌ์ฉ ์ค์ธ ๋ชจ๋ ํ๊ทธ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ํ์๋ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### ํ๊ทธ ์ฌ์ฉ |
|||
|
|||
`tags` ๋งค๊ฐ๋ณ์๋ฅผ *๊ฒฝ๋ก ์๋* ๋ฐ `APIRouter`์ ํจ๊ป ์ฌ์ฉํ์ฌ ํ๊ทธ์ ํ ๋นํ ์ ์์ต๋๋ค: |
|||
|
|||
```Python hl_lines="21 26" |
|||
{!../../docs_src/metadata/tutorial004.py!} |
|||
``` |
|||
|
|||
/// info |
|||
|
|||
ํ๊ทธ์ ๋ํ ์์ธํ ๋ด์ฉ์ [๊ฒฝ๋ก ์๋ ๊ตฌ์ฑ](path-operation-configuration.md#tags){.internal-link target=_blank}์์ ์ฝ์ด๋ณด์ธ์. |
|||
|
|||
/// |
|||
|
|||
### ๋ฌธ์ ํ์ธ |
|||
|
|||
์ด์ ๋ฌธ์๋ฅผ ํ์ธํ๋ฉด ๋ชจ๋ ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์๋ฉ๋๋ค: |
|||
|
|||
<img src="/img/tutorial/metadata/image02.png"> |
|||
|
|||
### ํ๊ทธ ์์ |
|||
|
|||
๊ฐ ํ๊ทธ ๋ฉํ๋ฐ์ดํฐ ๋์
๋๋ฆฌ์ ์์๋ ๋ฌธ์ UI์ ํ์๋๋ ์์๋ฅผ ์ ์ํฉ๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ์ํ๋ฒณ ์์์ `users`๋ `items` ๋ค์ ์ค์ง๋ง, ์ฐ๋ฆฌ๋ `users` ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋์
๋๋ฆฌ๋ก ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋จผ์ ํ์๋ฉ๋๋ค. |
|||
|
|||
## OpenAPI URL |
|||
|
|||
OpenAPI ๊ตฌ์กฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก `/openapi.json`์์ ์ ๊ณต๋ฉ๋๋ค. |
|||
|
|||
`openapi_url` ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ด๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ์ด๋ฅผ `/api/v1/openapi.json`์ ์ ๊ณตํ๋๋ก ์ค์ ํ๋ ค๋ฉด: |
|||
|
|||
```Python hl_lines="3" |
|||
{!../../docs_src/metadata/tutorial002.py!} |
|||
``` |
|||
|
|||
OpenAPI ๊ตฌ์กฐ๋ฅผ ์์ ํ ๋นํ์ฑํํ๋ ค๋ฉด `openapi_url=None`์ผ๋ก ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ ๋นํ์ฑํ๋ฉ๋๋ค. |
|||
|
|||
## ๋ฌธ์ํ URL |
|||
|
|||
ํฌํจ๋ ๋ ๊ฐ์ง ๋ฌธ์ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค: |
|||
|
|||
* **Swagger UI**: `/docs`์์ ์ ๊ณต๋ฉ๋๋ค. |
|||
* `docs_url` ๋งค๊ฐ๋ณ์๋ก URL์ ์ค์ ํ ์ ์์ต๋๋ค. |
|||
* `docs_url=None`์ผ๋ก ์ค์ ํ์ฌ ๋นํ์ฑํํ ์ ์์ต๋๋ค. |
|||
* **ReDoc**: `/redoc`์์ ์ ๊ณต๋ฉ๋๋ค. |
|||
* `redoc_url` ๋งค๊ฐ๋ณ์๋ก URL์ ์ค์ ํ ์ ์์ต๋๋ค. |
|||
* `redoc_url=None`์ผ๋ก ์ค์ ํ์ฌ ๋นํ์ฑํํ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, Swagger UI๋ฅผ `/documentation`์์ ์ ๊ณตํ๊ณ ReDoc์ ๋นํ์ฑํํ๋ ค๋ฉด: |
|||
|
|||
```Python hl_lines="3" |
|||
{!../../docs_src/metadata/tutorial003.py!} |
|||
``` |
Loadingโฆ
Reference in new issue