committed by
GitHub
3 changed files with 0 additions and 170 deletions
@ -1,96 +0,0 @@ |
|||
# ๊ณ ๊ธ ๋ฏธ๋ค์จ์ด |
|||
|
|||
๋ฉ์ธ ํํ ๋ฆฌ์ผ์์ [Custom Middleware](../tutorial/middleware.md){.internal-link target=_blank}๋ฅผ ์์ฉํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฝ์ผ์
จ์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ [CORS with the `CORSMiddleware`](){.internal-link target=_blank}ํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์
จ์ต๋๋ค. |
|||
|
|||
์ด ์น์
์์๋ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. |
|||
|
|||
## ASGI ๋ฏธ๋ค์จ์ด ์ถ๊ฐํ๊ธฐ |
|||
|
|||
**FastAPI**๋ Starlette์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, <abbr title="Asynchronous Server Gateway Interface">ASGI</abbr> ์ฌ์์ ๊ตฌํํ๋ฏ๋ก ASGI ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฏธ๋ค์จ์ด๊ฐ FastAPI๋ Starlette์ฉ์ผ๋ก ๋ง๋ค์ด์ง์ง ์์๋ ASGI ์ฌ์์ ์ค์ํ๋ ํ ๋์ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ผ๋ฐ์ ์ผ๋ก ASGI ๋ฏธ๋ค์จ์ด๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ASGI ์ฑ์ ๋ฐ๋ ํด๋์ค๋ค์
๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ํ์ฌ ASGI ๋ฏธ๋ค์จ์ด ๋ฌธ์์์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋๋ก ์๋ดํ ๊ฒ์
๋๋ค. |
|||
|
|||
```Python |
|||
from unicorn import UnicornMiddleware |
|||
|
|||
app = SomeASGIApp() |
|||
|
|||
new_app = UnicornMiddleware(app, some_config="rainbow") |
|||
``` |
|||
|
|||
ํ์ง๋ง ๋ด๋ถ ๋ฏธ๋ค์จ์ด๊ฐ ์๋ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์ ์ ์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ๋๋ก ์๋ํ๋๋ก ํ๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ FastAPI(์ค์ ๋ก๋ Starlette)๊ฐ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ์ํด `app.add_middleware()`๋ฅผ ์ฌ์ฉํฉ๋๋ค(CORS์ ์์์์ ๊ฐ์ด). |
|||
|
|||
```Python |
|||
from fastapi import FastAPI |
|||
from unicorn import UnicornMiddleware |
|||
|
|||
app = FastAPI() |
|||
|
|||
app.add_middleware(UnicornMiddleware, some_config="rainbow") |
|||
``` |
|||
|
|||
`app.add_middleware()`๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฏธ๋ค์จ์ด ํด๋์ค์ ๋ฏธ๋ค์จ์ด์ ์ ๋ฌํ ์ถ๊ฐ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. |
|||
|
|||
## ํตํฉ ๋ฏธ๋ค์จ์ด |
|||
|
|||
**FastAPI**์๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. |
|||
|
|||
/// note | ๊ธฐ์ ์ธ๋ถ ์ฌํญ |
|||
|
|||
๋ค์ ์์ ์์๋ `from starlette.middleware.something import SomethingMiddleware`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด `fastapi.middleware`์ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ ๋ฏธ๋ค์จ์ด๋ Starlette์์ ์ง์ ์ ๊ณตํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `HTTPSRedirectMiddleware` |
|||
|
|||
๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ด `https` ๋๋ `wss`์ฌ์ผ ํฉ๋๋ค. |
|||
|
|||
`http` ๋๋ `ws`๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋์ ๋ณด์ ์ฒด๊ณ๋ก ๋ฆฌ๋๋ ์
๋ฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *} |
|||
|
|||
## `TrustedHostMiddleware` |
|||
|
|||
HTTP ํธ์คํธ ํค๋ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์์ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ `Host` ํค๋๋ฅผ ๊ฐ๋๋ก ๊ฐ์ ํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/advanced_middleware/tutorial002.py hl[2,6:8] *} |
|||
|
|||
๋ค์ ์ธ์๊ฐ ์ง์๋ฉ๋๋ค: |
|||
|
|||
* `allowed_hosts` - ํธ์คํธ ์ด๋ฆ์ผ๋ก ํ์ฉํด์ผ ํ๋ ๋๋ฉ์ธ ์ด๋ฆ ๋ชฉ๋ก์
๋๋ค. ์ผ์นํ๋ ํ์ ๋๋ฉ์ธ์ ๋ํด `*.example.com`๊ณผ ๊ฐ์ ์์ผ๋์นด๋ ๋๋ฉ์ธ์ด ์ง์๋ฉ๋๋ค. ๋ชจ๋ ํธ์คํธ ์ด๋ฆ์ ํ์ฉํ๋ ค๋ฉด `allowed_hosts=[โ*โ]`๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์๋ตํ์ธ์. |
|||
|
|||
์์ ์์ฒญ์ ์ ํจ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์ธ๋์ง ์์ผ๋ฉด `400`์ด๋ผ๋ ์๋ต์ด ์ ์ก๋ฉ๋๋ค. |
|||
|
|||
## `GZipMiddleware` |
|||
|
|||
`Accept-Encoding` ํค๋์ `โgzipโ`์ด ํฌํจ๋ ๋ชจ๋ ์์ฒญ์ ๋ํด GZip ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค. |
|||
|
|||
๋ฏธ๋ค์จ์ด๋ ํ์ค ์๋ต๊ณผ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/advanced_middleware/tutorial003.py hl[2,6] *} |
|||
|
|||
์ง์๋๋ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: |
|||
|
|||
* `minimum_size` - ์ด ์ต์ ํฌ๊ธฐ(๋ฐ์ดํธ)๋ณด๋ค ์์ ์๋ต์ GZipํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `500`์
๋๋ค. |
|||
* `compresslevel` - GZip ์์ถ ์ค์ ์ฌ์ฉ๋ฉ๋๋ค. 1์์ 9 ์ฌ์ด์ ์ ์์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `9`์
๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก ์์ถ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ์ปค์ง๊ณ , ๊ฐ์ด ๋์์๋ก ์์ถ ์๋๋ ๋๋ ค์ง์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ์์์ง๋๋ค. |
|||
|
|||
## ๊ธฐํ ๋ฏธ๋ค์จ์ด |
|||
|
|||
๋ค๋ฅธ ๋ง์ ASGI ๋ฏธ๋ค์จ์ด๊ฐ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด: |
|||
|
|||
<a href=โhttps://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.pyโ class=โexternal-linkโ target=โ_blankโ>์ ๋น์ฝ์ `ProxyHeadersMiddleware`></a> |
|||
<a href=โhttps://github.com/florimondmanca/msgpack-asgiโ class=โexternal-linkโ target=โ_blankโ>MessagePack</a> |
|||
|
|||
์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ธํ๋ ค๋ฉด <a href=โhttps://www.starlette.dev/middleware/โ class=โexternal-linkโ target=โ_blankโ>์คํ๋ ์ ๋ฏธ๋ค์จ์ด ๋ฌธ์</a> ๋ฐ <a href=โhttps://github.com/florimondmanca/awesome-asgiโ class=โexternal-linkโ target=โ_blankโ>ASGI Awesome List</a>๋ฅผ ์ฐธ์กฐํ์ธ์. |
|||
@ -1,55 +0,0 @@ |
|||
# OpenAPI ์นํ
(Webhooks) |
|||
|
|||
API **์ฌ์ฉ์**์๊ฒ ํน์ **์ด๋ฒคํธ**๊ฐ ๋ฐ์ํ ๋ *๊ทธ๋ค*์ ์ฑ(์์คํ
)์ ์์ฒญ์ ๋ณด๋ด **์๋ฆผ**์ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. |
|||
|
|||
์ฆ, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ API์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ๊ณผ๋ ๋ฐ๋๋ก, **API**(๋๋ ์ฑ)๊ฐ **์ฌ์ฉ์์ ์์คํ
**(๊ทธ๋ค์ API๋ ์ฑ)์ผ๋ก **์์ฒญ์ ๋ณด๋ด๋** ์ํฉ์ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
์ด๋ฅผ ํํ **์นํ
(Webhook)**์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. |
|||
|
|||
## ์นํ
์คํ
|
|||
|
|||
**์ฝ๋์์** ์นํ
์ผ๋ก ๋ณด๋ผ ๋ฉ์์ง, ์ฆ ์์ฒญ์ **๋ฐ๋(body)**๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ํ๋ก์ธ์ค์
๋๋ค. |
|||
|
|||
์ฑ์์ ํด๋น ์์ฒญ์ด๋ ์ด๋ฒคํธ๋ฅผ ์ ์กํ **์์ **์ ์ ์ํฉ๋๋ค. |
|||
|
|||
**์ฌ์ฉ์**๋ ์ฑ์ด ํด๋น ์์ฒญ์ ๋ณด๋ผ **URL**์ ์ ์ํฉ๋๋ค. (์: ์น ๋์๋ณด๋์์ ์ค์ ) |
|||
|
|||
์นํ
์ URL์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๊ณผ ์ด๋ฌํ ์์ฒญ์ ์ค์ ๋ก ์ ์กํ๋ ์ฝ๋์ ๋ํ ๋ชจ๋ ๋ก์ง์ ์ฌ๋ฌ๋ถ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ์ํ๋๋๋ก **๊ณ ์ ์ ์ฝ๋**๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค. |
|||
|
|||
## **FastAPI**์ OpenAPI๋ก ์นํ
๋ฌธ์ํํ๊ธฐ |
|||
|
|||
**FastAPI**๋ฅผ ์ฌ์ฉํ์ฌ OpenAPI์ ํจ๊ป ์นํ
์ ์ด๋ฆ, ์ฑ์ด ๋ณด๋ผ ์ ์๋ HTTP ์์
์ ํ(์: `POST`, `PUT` ๋ฑ), ๊ทธ๋ฆฌ๊ณ ๋ณด๋ผ ์์ฒญ์ **๋ฐ๋**๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ **์นํ
** ์์ฒญ์ ์์ ํ **API ๊ตฌํ**์ ํจ์ฌ ์ฝ๊ฒ ํ ์ ์์ผ๋ฉฐ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉ์ API ์ฝ๋์ ์ผ๋ถ๋ฅผ ์๋ ์์ฑํ ์๋ ์์ต๋๋ค. |
|||
|
|||
/// info |
|||
|
|||
์นํ
์ OpenAPI 3.1.0 ์ด์์์ ์ง์๋๋ฉฐ, FastAPI `0.99.0` ์ด์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## ์นํ
์ด ํฌํจ๋ ์ฑ ๋ง๋ค๊ธฐ |
|||
|
|||
**FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ๋, `webhooks` ์์ฑ์ ์ฌ์ฉํ์ฌ *์นํ
*์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ `@app.webhooks.post()`์ ๊ฐ์ ๋ฐฉ์์ผ๋ก *๊ฒฝ๋ก(path) ์์
*์ ์ ์ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *} |
|||
|
|||
์ด๋ ๊ฒ ์ ์ํ ์นํ
์ **OpenAPI** ์คํค๋ง์ ์๋ **๋ฌธ์ํ UI**์ ํ์๋ฉ๋๋ค. |
|||
|
|||
/// info |
|||
|
|||
`app.webhooks` ๊ฐ์ฒด๋ ์ฌ์ค `APIRouter`์ผ ๋ฟ์ด๋ฉฐ, ์ฌ๋ฌ ํ์ผ๋ก ์ฑ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ํ์
์
๋๋ค. |
|||
|
|||
/// |
|||
|
|||
์นํ
์์๋ ์ค์ **๊ฒฝ๋ก(path)** (์: `/items/`)๋ฅผ ์ ์ธํ์ง ์๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ฌํ๋ ํ
์คํธ๋ **์๋ณ์**๋ก, ์นํ
์ ์ด๋ฆ(์ด๋ฒคํธ ์ด๋ฆ)์
๋๋ค. ์๋ฅผ ๋ค์ด, `@app.webhooks.post("new-subscription")`์์ ์นํ
์ด๋ฆ์ `new-subscription`์
๋๋ค. |
|||
|
|||
์ด๋ ์ค์ **URL ๊ฒฝ๋ก**๋ **์ฌ์ฉ์**๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ(์: ์น ๋์๋ณด๋)์ ํตํด ์ง์ ํ๋๋ก ๊ธฐ๋๋๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
### ๋ฌธ์ ํ์ธํ๊ธฐ |
|||
|
|||
์ด์ ์ฑ์ ์์ํ๊ณ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋ก ์ด๋ํด ๋ด
์๋ค. |
|||
|
|||
๋ฌธ์์์ ๊ธฐ์กด *๊ฒฝ๋ก ์์
*๋ฟ๋ง ์๋๋ผ **์นํ
**๋ ํ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/openapi-webhooks/image01.png"> |
|||
@ -1,19 +0,0 @@ |
|||
# ๊ณ ๊ธ ๋ณด์ |
|||
|
|||
## ์ถ๊ฐ ๊ธฐ๋ฅ |
|||
|
|||
[์์ต์ - ์ฌ์ฉ์ ๊ฐ์ด๋: ๋ณด์](../../tutorial/security/index.md){.internal-link target=_blank} ๋ฌธ์์์ ๋ค๋ฃฌ ๋ด์ฉ ์ธ์๋ ๋ณด์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. |
|||
|
|||
/// tip |
|||
|
|||
๋ค์ ์น์
์ **๋ฐ๋์ "๊ณ ๊ธ"** ๊ธฐ๋ฅ์ ์๋๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ, ์ ํฉํ ํด๊ฒฐ์ฑ
์ด ๊ทธ ์ค ํ๋์ ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## ๋จผ์ ์์ต์ ์ฝ๊ธฐ |
|||
|
|||
๋ค์ ์น์
์ ์ด๋ฏธ [์์ต์ - ์ฌ์ฉ์ ๊ฐ์ด๋: ๋ณด์](../../tutorial/security/index.md){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. |
|||
|
|||
์ด ์น์
๋ค์ ๋ชจ๋ ๋์ผํ ๊ฐ๋
์ ๋ฐํ์ผ๋ก ํ๋ฉฐ, ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. |
|||
Loadingโฆ
Reference in new issue