committed by
GitHub
1 changed files with 313 additions and 0 deletions
@ -0,0 +1,313 @@ |
|||
# ์ฌ์ฉ์ ์ ์ ์๋ต - HTML, Stream, ํ์ผ, ๊ธฐํ |
|||
|
|||
๊ธฐ๋ณธ์ ์ผ๋ก, **FastAPI** ์๋ต์ `JSONResponse`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํํฉ๋๋ค. |
|||
|
|||
์ด๋ฅผ ์ฌ์ ์ ํ๋ ค๋ฉด [์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ์ฒ๋ผ `Response`๋ฅผ ์ง์ ๋ฐํํ๋ฉด ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ `Response` (๋๋ `JSONResponse`์ ๊ฐ์ ํ์ ํด๋์ค)๋ฅผ ์ง์ ๋ฐํํ๋ฉด, ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ (์ฌ์ง์ด `response_model`์ ์ ์ธํ๋๋ผ๋), ๋ฌธ์ํ๊ฐ ์๋์ผ๋ก ์์ฑ๋์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด, ์์ฑ๋ OpenAPI์ ์ผ๋ถ๋ก HTTP ํค๋ `Content-Type`์ ํน์ "๋ฏธ๋์ด ํ์
"์ ํฌํจํ๋ ๊ฒฝ์ฐ). |
|||
|
|||
ํ์ง๋ง *๊ฒฝ๋ก ์์
๋ฐ์ฝ๋ ์ดํฐ*์์ `response_class` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ `Response`(์: ๋ชจ๋ `Response` ํ์ ํด๋์ค)๋ฅผ ์ ์ธํ ์๋ ์์ต๋๋ค. |
|||
|
|||
*๊ฒฝ๋ก ์์
ํจ์*์์ ๋ฐํํ๋ ๋ด์ฉ์ ํด๋น `Response`์์ ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ทธ `Response`๊ฐ `JSONResponse`์ `UJSONResponse`์ ๊ฒฝ์ฐ ์ฒ๋ผ JSON ๋ฏธ๋์ด ํ์
(`application/json`)์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, *๊ฒฝ๋ก ์์
๋ฐ์ฝ๋ ์ดํฐ*์์ ์ ์ธํ Pydantic์ `response_model`์ ์ฌ์ฉํด ์๋์ผ๋ก ๋ณํ(๋ฐ ํํฐ๋ง) ๋ฉ๋๋ค. |
|||
|
|||
/// note | ์ฐธ๊ณ |
|||
|
|||
๋ฏธ๋์ด ํ์
์ด ์๋ ์๋ต ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, FastAPI๋ ์๋ต์ ๋ด์ฉ์ด ์์ ๊ฒ์ผ๋ก ์์ํ๋ฏ๋ก ์์ฑ๋ OpenAPI ๋ฌธ์์์ ์๋ต ํ์์ ๋ฌธ์ํํ์ง ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## `ORJSONResponse` ์ฌ์ฉํ๊ธฐ |
|||
|
|||
์๋ฅผ ๋ค์ด, ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ค๋ ๊ฒฝ์ฐ, <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">orjson</a>์ ์ค์นํ์ฌ ์ฌ์ฉํ๊ณ ์๋ต์ `ORJSONResponse`๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ฌ์ฉํ๊ณ ์ ํ๋ `Response` ํด๋์ค(ํ์ ํด๋์ค)๋ฅผ ์ํฌํธํ ํ, **๊ฒฝ๋ก ์์
๋ฐ์ฝ๋ ์ดํฐ*์์ ์ ์ธํ์ธ์. |
|||
|
|||
๋๊ท๋ชจ ์๋ต์ ๊ฒฝ์ฐ, ๋์
๋๋ฆฌ๋ฅผ ๋ฐํํ๋ ๊ฒ๋ณด๋ค `Response`๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฆ
๋๋ค. |
|||
|
|||
์ด์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก, FastAPI๊ฐ ๋ด๋ถ์ ๋ชจ๋ ํญ๋ชฉ์ ๊ฒ์ฌํ๊ณ JSON์ผ๋ก ์ง๋ ฌํํ ์ ์๋์ง ํ์ธํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ ์ฌ์ฉ์ ์๋ด์์์ ์ค๋ช
๋ [JSON ํธํ ๊ฐ๋ฅ ์ธ์ฝ๋](../tutorial/encoder.md){.internal-link target=_blank}๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๋์ผํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๊ณผ ๊ฐ์ **์์์ ๊ฐ์ฒด**๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ๋ฐํํ๋ ๋ด์ฉ์ด **JSON์ผ๋ก ์ง๋ ฌํ ๊ฐ๋ฅ**ํ๋ค๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ, ํด๋น ๋ด์ฉ์ ์๋ต ํด๋์ค์ ์ง์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ, FastAPI๊ฐ ๋ฐํ ๋ด์ฉ์ `jsonable_encoder`๋ฅผ ํตํด ์ฒ๋ฆฌํ ๋ค ์๋ต ํด๋์ค์ ์ ๋ฌํ๋ ์ค๋ฒํค๋๋ฅผ ํผํ ์ ์์ต๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial001b.py hl[2,7] *} |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
`response_class` ๋งค๊ฐ๋ณ์๋ ์๋ต์ "๋ฏธ๋์ด ํ์
"์ ์ ์ํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ, HTTP ํค๋ `Content-Type`์ `application/json`์ผ๋ก ์ค์ ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์ด๋ OpenAPI์ ๊ทธ๋๋ก ๋ฌธ์ํ๋ฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// tip | ํ |
|||
|
|||
`ORJSONResponse`๋ FastAPI์์๋ง ์ฌ์ฉํ ์ ์๊ณ Starlette์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## HTML ์๋ต |
|||
|
|||
**FastAPI**์์ HTML ์๋ต์ ์ง์ ๋ฐํํ๋ ค๋ฉด `HTMLResponse`๋ฅผ ์ฌ์ฉํ์ธ์. |
|||
|
|||
* `HTMLResponse`๋ฅผ ์ํฌํธ ํฉ๋๋ค. |
|||
* *๊ฒฝ๋ก ์์
๋ฐ์ฝ๋ ์ดํฐ*์ `response_class` ๋งค๊ฐ๋ณ์๋ก `HTMLResponse`๋ฅผ ์ ๋ฌํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *} |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
`response_class` ๋งค๊ฐ๋ณ์๋ ์๋ต์ "๋ฏธ๋์ด ํ์
"์ ์ ์ํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ, HTTP ํค๋ `Content-Type`์ `text/html`๋ก ์ค์ ๋ฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์ด๋ OpenAPI์ ๊ทธ๋๋ก ๋ฌธ์ํ ๋ฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### `Response` ๋ฐํํ๊ธฐ |
|||
|
|||
[์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ ์ฒ๋ผ, *๊ฒฝ๋ก ์์
*์์ ์๋ต์ ์ง์ ๋ฐํํ์ฌ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค. |
|||
|
|||
์์ ์์ ์ ๋์ผํ๊ฒ `HTMLResponse`๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/custom_response/tutorial003.py hl[2,7,19] *} |
|||
|
|||
/// warning | ๊ฒฝ๊ณ |
|||
|
|||
*๊ฒฝ๋ก ์์
ํจ์*์์ ์ง์ ๋ฐํ๋ `Response`๋ OpenAPI์ ๋ฌธ์ํ๋์ง ์์ต๋๋ค(์๋ฅผ๋ค์ด, `Content-Type`์ด ๋ฌธ์ํ๋์ง ์์) ์๋ ๋ํํ ๋ฌธ์์์๋ ํ์๋์ง ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
๋ฌผ๋ก ์ค์ `Content-Type` ํค๋, ์ํ ์ฝ๋ ๋ฑ์ ๋ฐํ๋ `Response` ๊ฐ์ฒด์์ ๊ฐ์ ธ์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### OpenAPI์ ๋ฌธ์ํํ๊ณ `Response` ์ฌ์ ์ ํ๊ธฐ |
|||
|
|||
ํจ์ ๋ด๋ถ์์ ์๋ต์ ์ฌ์ ์ํ๋ฉด์ ๋์์ OpenAPI์์ "๋ฏธ๋์ด ํ์
"์ ๋ฌธ์ํํ๊ณ ์ถ๋ค๋ฉด, `response_class` ๋งค๊ฒ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด์ `Response` ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ `response_class`๋ OpenAPI *๊ฒฝ๋ก ์์
*์ ๋ฌธ์ํํ๋ ๋ฐ๋ง ์ฌ์ฉ๋๊ณ , ์ค์ ๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋ฐํํ `Response`๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
### `HTMLResponse`์ง์ ๋ฐํํ๊ธฐ |
|||
|
|||
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *} |
|||
|
|||
์ด ์์ ์์, `generate_html_response()` ํจ์๋ HTML์ `str`๋ก ๋ฐํํ๋ ๋์ ์ด๋ฏธ `Response`๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค. |
|||
|
|||
`generate_html_response()`๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ์ผ๋ก์จ, ๊ธฐ๋ณธ์ ์ธ **FastAPI** ๊ธฐ๋ณธ ๋์์ ์ฌ์ ์ ํ๋ `Response`๋ฅผ ์ด๋ฏธ ๋ฐํํ๊ณ ์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง `response_class`์ `HTMLResponse`๋ฅผ ํจ๊ป ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, FastAPI๋ ์ด๋ฅผ OpenAPI ๋ฐ ๋ํํ ๋ฌธ์์์ `text/html`๋ก HTML์ ๋ฌธ์ํ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. |
|||
|
|||
<img src="/img/tutorial/custom-response/image01.png"> |
|||
|
|||
## ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต๋ค |
|||
|
|||
๋ค์์ ์ฌ์ฉํ ์ ์๋ ๋ช๊ฐ์ง ์๋ต๋ค ์
๋๋ค. |
|||
|
|||
`Response`๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๋ฐํ ํ ์ ์์ผ๋ฉฐ, ์ง์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. |
|||
|
|||
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|||
|
|||
`from starlette.responses import HTMLResponse`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๊ฐ๋ฐ์์ธ ์ฌ๋ฌ๋ถ์ ํธ์๋ฅผ ์ํด `starlette.responses`๋ฅผ `fastapi.responses`๋ก ์ ๊ณต ํ์ง๋ง, ๋๋ถ๋ถ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต์ Starlette์์ ์ง์ ๊ฐ์ ธ์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### `Response` |
|||
|
|||
๊ธฐ๋ณธ `Response` ํด๋์ค๋ ๋ค๋ฅธ ๋ชจ๋ ์๋ต ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค ์
๋๋ค. |
|||
|
|||
์ด ํด๋์ค๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค: |
|||
|
|||
* `content` - `str` ๋๋ `bytes`. |
|||
* `status_code` - HTTP ์ํ์ฝ๋๋ฅผ ๋ํ๋ด๋ `int`. |
|||
* `headers` - ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง `dict`. |
|||
* `media_type` - ๋ฏธ๋์ด ํ์
์ ๋ํ๋ด๋ `str` ์: `"text/html"`. |
|||
|
|||
FastAPI (์ค์ ๋ก๋ Starlette)๊ฐ ์๋์ผ๋ก `Content-Length` ํค๋๋ฅผ ํฌํจ์ํต๋๋ค. ๋ํ `media_type`์ ๊ธฐ๋ฐํ์ฌ `Content-Type` ํค๋๋ฅผ ํฌํจํ๋ฉฐ, ํ
์คํธ ํ์
์ ๊ฒฝ์ฐ ๋ฌธ์ ์งํฉ์ ์ถ๊ฐ ํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *} |
|||
|
|||
### `HTMLResponse` |
|||
|
|||
ํ
์คํธ ๋๋ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ HTML ์๋ต์ ๋ฐํํฉ๋๋ค. ์์์ ์ค๋ช
ํ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค. |
|||
|
|||
### `PlainTextResponse` |
|||
|
|||
ํ
์คํธ ๋๋ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ผ๋ฐ ํ
์คํธ ์๋ต์ ๋ฐํํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *} |
|||
|
|||
### `JSONResponse` |
|||
|
|||
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ `application/json`์ผ๋ก ์ธ์ฝ๋ฉ๋ ์๋ต์ ๋ฐํํฉ๋๋ค. |
|||
|
|||
์ด๋ ์์์ ์ค๋ช
ํ๋ฏ์ด **FastAPI**์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๋ต ํ์์
๋๋ค. |
|||
|
|||
### `ORJSONResponse` |
|||
|
|||
<a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์ ์ฌ์ฉํ์ฌ ๋น ๋ฅธ JSON ์๋ต์ ์ ๊ณตํ๋ ๋์์
๋๋ค. ์์์ ์ค๋ช
ํ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค. |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด `orjson`์ ์ค์นํด์ผํฉ๋๋ค. ์: `pip install orjson`. |
|||
|
|||
/// |
|||
|
|||
### `UJSONResponse` |
|||
|
|||
<a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ JSON ์๋ต ํ์์
๋๋ค. |
|||
|
|||
/// info | ์ ๋ณด |
|||
|
|||
์ด ์๋ต์ ์ฌ์ฉํ๋ ค๋ฉด `ujson`์ ์ค์นํด์ผํฉ๋๋ค. ์: 'pip install ujson`. |
|||
|
|||
/// |
|||
|
|||
/// warning | ๊ฒฝ๊ณ |
|||
|
|||
`ujson` ์ ์ผ๋ถ ์์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด Python ๋ด์ฅ ๊ตฌํ๋ณด๋ค ๋ ์๊ฒฉํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *} |
|||
|
|||
/// tip | ํ |
|||
|
|||
`ORJSONResponse`๊ฐ ๋ ๋น ๋ฅธ ๋์์ผ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### `RedirectResponse` |
|||
|
|||
HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 307(์์ ๋ฆฌ๋๋ ์
)์ผ๋ก ์ค์ ๋ฉ๋๋ค. |
|||
|
|||
`RedirectResponse`๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *} |
|||
|
|||
--- |
|||
|
|||
๋๋ `response_class` ๋งค๊ฐ๋ณ์์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค: |
|||
|
|||
|
|||
{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *} |
|||
|
|||
์ด ๊ฒฝ์ฐ, *๊ฒฝ๋ก ์์
* ํจ์์์ URL์ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ, ์ฌ์ฉ๋๋ `status_code`๋ `RedirectResponse`์ ๊ธฐ๋ณธ๊ฐ์ธ `307` ์
๋๋ค. |
|||
|
|||
--- |
|||
|
|||
`status_code` ๋งค๊ฐ๋ณ์๋ฅผ `response_class` ๋งค๊ฐ๋ณ์์ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *} |
|||
|
|||
### `StreamingResponse` |
|||
|
|||
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋๋ ์ผ๋ฐ ์ ๋๋ ์ดํฐ/์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐ์ ์๋ต ๋ณธ๋ฌธ์ ์คํธ๋ฆฌ๋ฐ ํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *} |
|||
|
|||
#### ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ `StreamingResponse` |
|||
|
|||
ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด(์: `open()`์ผ๋ก ๋ฐํ๋ ๊ฐ์ฒด)๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต(iterate)ํ๋ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๋ฐฉ์์ผ๋ก, ํ์ผ ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋จผ์ ์ฝ์ด๋ค์ผ ํ์ ์์ด, ์ ๋๋ ์ดํฐ ํจ์๋ฅผ `StreamingResponse`์ ์ ๋ฌํ์ฌ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๋ฐฉ์์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง, ๋น๋์ค ์ฒ๋ฆฌ ๋ฑ์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *} |
|||
|
|||
1. ์ด๊ฒ์ด ์ ๋๋ ์ดํฐ ํจ์์
๋๋ค. `yield` ๋ฌธ์ ํฌํจํ๊ณ ์์ผ๋ฏ๋ก "์ ๋๋ ์ดํฐ ํจ์"์
๋๋ค. |
|||
2. `with` ๋ธ๋ก์ ์ฌ์ฉํจ์ผ๋ก์จ, ์ ๋๋ ์ดํฐ ํจ์๊ฐ ์๋ฃ๋ ํ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ซํ๋๋ก ํฉ๋๋ค. ์ฆ, ์๋ต ์ ์ก์ด ๋๋ ํ ๋ซํ๋๋ค. |
|||
3. ์ด `yield from`์ ํจ์๊ฐ `file_like`๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต(iterate)ํ๋๋ก ํฉ๋๋ค. ๋ฐ๋ณต๋ ๊ฐ ๋ถ๋ถ์ ์ด ์ ๋๋ ์ดํฐ ํจ์(`iterfile`)์์ ์์ฑ๋ ๊ฒ์ฒ๋ผ `yield` ๋ฉ๋๋ค. |
|||
|
|||
์ด๋ ๊ฒ ํ๋ฉด "์์ฑ(generating)" ์์
์ ๋ด๋ถ์ ์ผ๋ก ๋ค๋ฅธ ๋ฌด์ธ๊ฐ์ ์์ํ๋ ์ ๋๋ ์ดํฐ ํจ์๊ฐ ๋ฉ๋๋ค. |
|||
|
|||
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด `with` ๋ธ๋ก ์์์ ํ์ผ์ ์ด ์ ์์ด, ์์
์ด ์๋ฃ๋ ํ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ซํ๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. |
|||
|
|||
/// tip | ํ |
|||
|
|||
์ฌ๊ธฐ์ ํ์ค `open()`์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ `async`์ `await`๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฒฝ๋ก ์์
์ ์ผ๋ฐ `def`๋ก ์ ์ธํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
### `FileResponse` |
|||
|
|||
ํ์ผ์ ๋น๋๊ธฐ๋ก ์คํธ๋ฆฌ๋ฐํ์ฌ ์๋ตํฉ๋๋ค. |
|||
|
|||
๋ค๋ฅธ ์๋ต ์ ํ๊ณผ๋ ๋ค๋ฅธ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค: |
|||
|
|||
* `path` - ์คํธ๋ฆฌ๋ฐํ ํ์ผ์ ๊ฒฝ๋ก. |
|||
* `headers` - ๋์
๋๋ฆฌ ํ์์ ์ฌ์ฉ์ ์ ์ ํค๋. |
|||
* `media_type` - ๋ฏธ๋์ด ํ์
์ ๋ํ๋ด๋ ๋ฌธ์์ด. ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ํ์ผ ์ด๋ฆ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ก ํฉ๋๋ค. |
|||
* `filename` - ์ค์ ๋ ๊ฒฝ์ฐ ์๋ต์ `Content-Disposition`์ ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
ํ์ผ ์๋ต์๋ ์ ์ ํ `Content-Length`, `Last-Modified`, ๋ฐ `ETag` ํค๋๊ฐ ํฌํจ๋ฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial009.py hl[2,10] *} |
|||
|
|||
๋ํ `response_class` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค: |
|||
|
|||
{* ../../docs_src/custom_response/tutorial009b.py hl[2,8,10] *} |
|||
|
|||
์ด ๊ฒฝ์ฐ, ๊ฒฝ๋ก ์์
ํจ์์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|||
|
|||
## ์ฌ์ฉ์ ์ ์ ์๋ต ํด๋์ค |
|||
|
|||
`Response`๋ฅผ ์์๋ฐ์ ์ฌ์ฉ์ ์ ์ ์๋ต ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ํฌํจ๋ `ORJSONResponse` ํด๋์ค์์ ์ฌ์ฉ๋์ง ์๋ ์ค์ ์ผ๋ก <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">orjson</a>์ ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. |
|||
|
|||
๋ง์ฝ ๋ค์ฌ์ฐ๊ธฐ ๋ฐ ํฌ๋งท๋ JSON์ ๋ฐํํ๊ณ ์ถ๋ค๋ฉด, `orjson.OPT_INDENT_2` ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
`CustomORJSONResponse`๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ `Response.render(content)` ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ๋ด์ฉ์ `bytes`๋ก ๋ฐํํ๋ ๊ฒ์
๋๋ค: |
|||
|
|||
{* ../../docs_src/custom_response/tutorial009c.py hl[9:14,17] *} |
|||
|
|||
์ด์ ๋ค์ ๋์ : |
|||
|
|||
```json |
|||
{"message": "Hello World"} |
|||
``` |
|||
|
|||
์ด ์๋ต์ ์ด๋ ๊ฒ ๋ฐํ๋ฉ๋๋ค: |
|||
|
|||
```json |
|||
{ |
|||
"message": "Hello World" |
|||
} |
|||
``` |
|||
|
|||
๋ฌผ๋ก JSON ํฌ๋งทํ
๋ณด๋ค ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ ๊ฒ์
๋๋ค. ๐ |
|||
|
|||
## ๊ธฐ๋ณธ ์๋ต ํด๋์ค |
|||
|
|||
**FastAPI** ํด๋์ค ๊ฐ์ฒด ๋๋ `APIRouter`๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์๋ต ํด๋์ค๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ์ ์ํ๋ ๋งค๊ฐ๋ณ์๋ `default_response_class`์
๋๋ค. |
|||
|
|||
์๋ ์์ ์์ **FastAPI**๋ ๋ชจ๋ ๊ฒฝ๋ก ์์
์์ ๊ธฐ๋ณธ์ ์ผ๋ก `JSONResponse` ๋์ `ORJSONResponse`๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *} |
|||
|
|||
/// tip | ํ |
|||
|
|||
์ฌ์ ํ ์ด์ ์ฒ๋ผ *๊ฒฝ๋ก ์์
*์์ `response_class`๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## ์ถ๊ฐ ๋ฌธ์ํ |
|||
|
|||
OpenAPI์์ `responses`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋์ด ํ์
๋ฐ ๊ธฐํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ์ธํ ์๋ ์์ต๋๋ค: [OpenAPI์์ ์ถ๊ฐ ์๋ต](additional-responses.md){.internal-link target=_blank}. |
Loadingโฆ
Reference in new issue