|
|
@ -1,16 +1,14 @@ |
|
|
# ์ฌ์ฉ์ ์ ์ ์๋ต - HTML, Stream, ํ์ผ, ๊ธฐํ { #custom-response-html-stream-file-others } |
|
|
# ์ฌ์ฉ์ ์ ์ ์๋ต - HTML, Stream, ํ์ผ, ๊ธฐํ { #custom-response-html-stream-file-others } |
|
|
|
|
|
|
|
|
๊ธฐ๋ณธ์ ์ผ๋ก, **FastAPI** ์๋ต์ `JSONResponse`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํํฉ๋๋ค. |
|
|
๊ธฐ๋ณธ์ ์ผ๋ก **FastAPI**๋ JSON ์๋ต์ ๋ฐํํฉ๋๋ค. |
|
|
|
|
|
|
|
|
์ด๋ฅผ ์ฌ์ ์ ํ๋ ค๋ฉด [์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ์ฒ๋ผ `Response`๋ฅผ ์ง์ ๋ฐํํ๋ฉด ๋ฉ๋๋ค. |
|
|
[์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ์ฒ๋ผ `Response`๋ฅผ ์ง์ ๋ฐํํ์ฌ ์ด๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
๊ทธ๋ฌ๋ `Response` (๋๋ `JSONResponse`์ ๊ฐ์ ํ์ ํด๋์ค)๋ฅผ ์ง์ ๋ฐํํ๋ฉด, ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ (์ฌ์ง์ด `response_model`์ ์ ์ธํ๋๋ผ๋), ๋ฌธ์ํ๊ฐ ์๋์ผ๋ก ์์ฑ๋์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด, ์์ฑ๋ OpenAPI์ ์ผ๋ถ๋ก HTTP ํค๋ `Content-Type`์ ํน์ "๋ฏธ๋์ด ํ์
"์ ํฌํจํ๋ ๊ฒฝ์ฐ). |
|
|
๊ทธ๋ฌ๋ `Response`๋ฅผ ์ง์ ๋ฐํํ๋ฉด(๋๋ `JSONResponse`์ ๊ฐ์ ํ์ ํด๋์ค๋ฅผ ๋ฐํํ๋ฉด) ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ(๋น๋ก `response_model`์ ์ ์ธํ๋ค ํ๋๋ผ๋), ๋ฌธ์๋ ์๋์ผ๋ก ์์ฑ๋์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด, ์์ฑ๋ OpenAPI์ ์ผ๋ถ๋ก HTTP ํค๋ `Content-Type`์ ํน์ "๋ฏธ๋์ด ํ์
"์ ํฌํจํ๋ ๊ฒ ๋ฑ). |
|
|
|
|
|
|
|
|
ํ์ง๋ง *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ `response_class` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ `Response`(์: ๋ชจ๋ `Response` ํ์ ํด๋์ค)๋ฅผ ์ ์ธํ ์๋ ์์ต๋๋ค. |
|
|
ํ์ง๋ง *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ `response_class` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ `Response`(์: ์ด๋ค `Response` ํ์ ํด๋์ค๋ )๋ฅผ ์ ์ธํ ์๋ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ ๋ฐํํ๋ ๋ด์ฉ์ ํด๋น `Response`์์ ํฌํจ๋ฉ๋๋ค. |
|
|
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ ๋ฐํํ๋ ๋ด์ฉ์ ํด๋น `Response` ์์ ๋ด๊น๋๋ค. |
|
|
|
|
|
|
|
|
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ทธ `Response`๊ฐ `JSONResponse`์ `UJSONResponse`์ ๊ฒฝ์ฐ ์ฒ๋ผ JSON ๋ฏธ๋์ด ํ์
(`application/json`)์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ ์ ์ธํ Pydantic์ `response_model`์ ์ฌ์ฉํด ์๋์ผ๋ก ๋ณํ(๋ฐ ํํฐ๋ง) ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
/// note | ์ฐธ๊ณ |
|
|
/// note | ์ฐธ๊ณ |
|
|
|
|
|
|
|
|
@ -18,41 +16,27 @@ |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
## `ORJSONResponse` ์ฌ์ฉํ๊ธฐ { #use-orjsonresponse } |
|
|
## JSON ์๋ต { #json-responses } |
|
|
|
|
|
|
|
|
์๋ฅผ ๋ค์ด, ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ค๋ ๊ฒฝ์ฐ, <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_py310.py hl[2,7] *} |
|
|
๊ธฐ๋ณธ์ ์ผ๋ก FastAPI๋ JSON ์๋ต์ ๋ฐํํฉ๋๋ค. |
|
|
|
|
|
|
|
|
/// info | ์ ๋ณด |
|
|
[์๋ต ๋ชจ๋ธ](../tutorial/response-model.md){.internal-link target=_blank}์ ์ ์ธํ๋ฉด FastAPI๋ Pydantic์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํฉ๋๋ค. |
|
|
|
|
|
|
|
|
`response_class` ๋งค๊ฐ๋ณ์๋ ์๋ต์ "๋ฏธ๋์ด ํ์
"์ ์ ์ํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
์ด ๊ฒฝ์ฐ, HTTP ํค๋ `Content-Type`์ `application/json`์ผ๋ก ์ค์ ๋ฉ๋๋ค. |
|
|
์๋ต ๋ชจ๋ธ์ ์ ์ธํ์ง ์์ผ๋ฉด FastAPI๋ [JSON ํธํ ๊ฐ๋ฅ ์ธ์ฝ๋](../tutorial/encoder.md){.internal-link target=_blank}์์ ์ค๋ช
ํ `jsonable_encoder`๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ๋ค `JSONResponse`์ ๋ฃ์ต๋๋ค. |
|
|
|
|
|
|
|
|
๊ทธ๋ฆฌ๊ณ ์ด๋ OpenAPI์ ๊ทธ๋๋ก ๋ฌธ์ํ๋ฉ๋๋ค. |
|
|
`JSONResponse`์ฒ๋ผ JSON ๋ฏธ๋์ด ํ์
(`application/json`)์ ๊ฐ์ง `response_class`๋ฅผ ์ ์ธํ๋ฉด, ์ฌ๋ฌ๋ถ์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ ์ ์ธํ Pydantic์ `response_model`๋ก ๋ฐ์ดํฐ๊ฐ ์๋ ๋ณํ(๋ฐ ํํฐ๋ง)๋ฉ๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ์ JSON ๋ฐ์ดํธ ์ง๋ ฌํ ์์ฒด๋ Pydantic์ด ์ํํ์ง ์๊ณ , `jsonable_encoder`๋ก ๋ณํํ ํ `JSONResponse` ํด๋์ค์ ์ ๋ฌํ๋ฉฐ, ๊ทธ ํด๋์ค๊ฐ Python ํ์ค JSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํธ๋ก ์ง๋ ฌํํฉ๋๋ค. |
|
|
|
|
|
|
|
|
/// |
|
|
### JSON ์ฑ๋ฅ { #json-performance } |
|
|
|
|
|
|
|
|
/// tip | ํ |
|
|
์์ฝํ๋ฉด, ์ต๋ ์ฑ๋ฅ์ด ํ์ํ๋ค๋ฉด [์๋ต ๋ชจ๋ธ](../tutorial/response-model.md){.internal-link target=_blank}์ ์ฌ์ฉํ๊ณ , *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ `response_class`๋ฅผ ์ ์ธํ์ง ๋ง์ธ์. |
|
|
|
|
|
|
|
|
`ORJSONResponse`๋ FastAPI์์๋ง ์ฌ์ฉํ ์ ์๊ณ Starlette์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} |
|
|
|
|
|
|
|
|
/// |
|
|
|
|
|
|
|
|
|
|
|
## HTML ์๋ต { #html-response } |
|
|
## HTML ์๋ต { #html-response } |
|
|
|
|
|
|
|
|
**FastAPI**์์ HTML ์๋ต์ ์ง์ ๋ฐํํ๋ ค๋ฉด `HTMLResponse`๋ฅผ ์ฌ์ฉํ์ธ์. |
|
|
**FastAPI**์์ HTML ์๋ต์ ์ง์ ๋ฐํํ๋ ค๋ฉด `HTMLResponse`๋ฅผ ์ฌ์ฉํ์ธ์. |
|
|
|
|
|
|
|
|
* `HTMLResponse`๋ฅผ ์ํฌํธ ํฉ๋๋ค. |
|
|
* `HTMLResponse`๋ฅผ ์ํฌํธํฉ๋๋ค. |
|
|
* *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ `response_class` ๋งค๊ฐ๋ณ์๋ก `HTMLResponse`๋ฅผ ์ ๋ฌํฉ๋๋ค. |
|
|
* *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ `response_class` ๋งค๊ฐ๋ณ์๋ก `HTMLResponse`๋ฅผ ์ ๋ฌํฉ๋๋ค. |
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} |
|
|
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} |
|
|
@ -63,13 +47,13 @@ |
|
|
|
|
|
|
|
|
์ด ๊ฒฝ์ฐ, HTTP ํค๋ `Content-Type`์ `text/html`๋ก ์ค์ ๋ฉ๋๋ค. |
|
|
์ด ๊ฒฝ์ฐ, HTTP ํค๋ `Content-Type`์ `text/html`๋ก ์ค์ ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
๊ทธ๋ฆฌ๊ณ ์ด๋ OpenAPI์ ๊ทธ๋๋ก ๋ฌธ์ํ ๋ฉ๋๋ค. |
|
|
๊ทธ๋ฆฌ๊ณ ์ด๋ OpenAPI์ ๊ทธ๋๋ก ๋ฌธ์ํ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
### `Response` ๋ฐํํ๊ธฐ { #return-a-response } |
|
|
### `Response` ๋ฐํํ๊ธฐ { #return-a-response } |
|
|
|
|
|
|
|
|
[์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ ์ฒ๋ผ, *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์๋ต์ ์ง์ ๋ฐํํ์ฌ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค. |
|
|
[์๋ต์ ์ง์ ๋ฐํํ๊ธฐ](response-directly.md){.internal-link target=_blank}์์ ๋ณธ ๊ฒ์ฒ๋ผ, *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์๋ต์ ์ง์ ๋ฐํํ์ฌ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
์์ ์์ ์ ๋์ผํ๊ฒ `HTMLResponse`๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค: |
|
|
์์ ์์ ์ ๋์ผํ๊ฒ `HTMLResponse`๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค: |
|
|
|
|
|
|
|
|
@ -77,7 +61,7 @@ |
|
|
|
|
|
|
|
|
/// warning | ๊ฒฝ๊ณ |
|
|
/// warning | ๊ฒฝ๊ณ |
|
|
|
|
|
|
|
|
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ ์ง์ ๋ฐํ๋ `Response`๋ OpenAPI์ ๋ฌธ์ํ๋์ง ์์ต๋๋ค(์๋ฅผ๋ค์ด, `Content-Type`์ด ๋ฌธ์ํ๋์ง ์์) ์๋ ๋ํํ ๋ฌธ์์์๋ ํ์๋์ง ์์ต๋๋ค. |
|
|
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ ์ง์ ๋ฐํ๋ `Response`๋ OpenAPI์ ๋ฌธ์ํ๋์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด, `Content-Type`์ด ๋ฌธ์ํ๋์ง ์์) ๊ทธ๋ฆฌ๊ณ ์๋ ๋ํํ ๋ฌธ์์๋ ํ์๋์ง ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
@ -87,54 +71,54 @@ |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
### OpenAPI์ ๋ฌธ์ํํ๊ณ `Response` ์ฌ์ ์ ํ๊ธฐ { #document-in-openapi-and-override-response } |
|
|
### OpenAPI์ ๋ฌธ์ํํ๊ณ `Response` ์ฌ์ ์ํ๊ธฐ { #document-in-openapi-and-override-response } |
|
|
|
|
|
|
|
|
ํจ์ ๋ด๋ถ์์ ์๋ต์ ์ฌ์ ์ํ๋ฉด์ ๋์์ OpenAPI์์ "๋ฏธ๋์ด ํ์
"์ ๋ฌธ์ํํ๊ณ ์ถ๋ค๋ฉด, `response_class` ๋งค๊ฒ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด์ `Response` ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
ํจ์ ๋ด๋ถ์์ ์๋ต์ ์ฌ์ ์ํ๋ฉด์ ๋์์ OpenAPI์์ "๋ฏธ๋์ด ํ์
"์ ๋ฌธ์ํํ๊ณ ์ถ๋ค๋ฉด, `response_class` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด์ `Response` ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
์ด ๊ฒฝ์ฐ `response_class`๋ OpenAPI *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋ฌธ์ํํ๋ ๋ฐ๋ง ์ฌ์ฉ๋๊ณ , ์ค์ ๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋ฐํํ `Response`๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. |
|
|
์ด ๊ฒฝ์ฐ `response_class`๋ OpenAPI *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋ฌธ์ํํ๋ ๋ฐ๋ง ์ฌ์ฉ๋๊ณ , ์ค์ ๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋ฐํํ `Response`๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
#### `HTMLResponse`์ง์ ๋ฐํํ๊ธฐ { #return-an-htmlresponse-directly } |
|
|
#### `HTMLResponse` ์ง์ ๋ฐํํ๊ธฐ { #return-an-htmlresponse-directly } |
|
|
|
|
|
|
|
|
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค: |
|
|
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค: |
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *} |
|
|
{* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *} |
|
|
|
|
|
|
|
|
์ด ์์ ์์, `generate_html_response()` ํจ์๋ HTML์ `str`๋ก ๋ฐํํ๋ ๋์ ์ด๋ฏธ `Response`๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค. |
|
|
์ด ์์ ์์ `generate_html_response()` ํจ์๋ HTML์ `str`๋ก ๋ฐํํ๋ ๋์ ์ด๋ฏธ `Response`๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค. |
|
|
|
|
|
|
|
|
`generate_html_response()`๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ์ผ๋ก์จ, ๊ธฐ๋ณธ์ ์ธ **FastAPI** ๊ธฐ๋ณธ ๋์์ ์ฌ์ ์ ํ๋ `Response`๋ฅผ ์ด๋ฏธ ๋ฐํํ๊ณ ์์ต๋๋ค. |
|
|
`generate_html_response()`๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ์ผ๋ก์จ, ๊ธฐ๋ณธ์ ์ธ **FastAPI** ๋์์ ์ฌ์ ์ํ๋ `Response`๋ฅผ ์ด๋ฏธ ๋ฐํํ๊ณ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
ํ์ง๋ง `response_class`์ `HTMLResponse`๋ฅผ ํจ๊ป ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, **FastAPI**๋ ์ด๋ฅผ OpenAPI ๋ฐ ๋ํํ ๋ฌธ์์์ `text/html`๋ก HTML์ ๋ฌธ์ํ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. |
|
|
ํ์ง๋ง `response_class`์ `HTMLResponse`๋ฅผ ํจ๊ป ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, **FastAPI**๋ ์ด๋ฅผ OpenAPI ๋ฐ ๋ํํ ๋ฌธ์์์ `text/html`์ HTML๋ก ๋ฌธ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค: |
|
|
|
|
|
|
|
|
<img src="/img/tutorial/custom-response/image01.png"> |
|
|
<img src="/img/tutorial/custom-response/image01.png"> |
|
|
|
|
|
|
|
|
## ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต๋ค { #available-responses } |
|
|
## ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต๋ค { #available-responses } |
|
|
|
|
|
|
|
|
๋ค์์ ์ฌ์ฉํ ์ ์๋ ๋ช๊ฐ์ง ์๋ต๋ค ์
๋๋ค. |
|
|
๋ค์์ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์๋ต๋ค์
๋๋ค. |
|
|
|
|
|
|
|
|
`Response`๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๋ฐํ ํ ์ ์์ผ๋ฉฐ, ์ง์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. |
|
|
`Response`๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๋ฐํํ ์ ์์ผ๋ฉฐ, ์ง์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|
|
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|
|
|
|
|
|
|
|
`from starlette.responses import HTMLResponse`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. |
|
|
`from starlette.responses import HTMLResponse`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
**FastAPI**๋ ๊ฐ๋ฐ์์ธ ์ฌ๋ฌ๋ถ์ ํธ์๋ฅผ ์ํด `starlette.responses`๋ฅผ `fastapi.responses`๋ก ์ ๊ณต ํ์ง๋ง, ๋๋ถ๋ถ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต์ Starlette์์ ์ง์ ๊ฐ์ ธ์ต๋๋ค. |
|
|
**FastAPI**๋ ๊ฐ๋ฐ์์ธ ์ฌ๋ฌ๋ถ์ ํธ์๋ฅผ ์ํด `starlette.responses`๋ฅผ `fastapi.responses`๋ก ๋์ผํ๊ฒ ์ ๊ณตํ์ง๋ง, ๋๋ถ๋ถ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต์ Starlette์์ ์ง์ ๊ฐ์ ธ์ต๋๋ค. |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
### `Response` { #response } |
|
|
### `Response` { #response } |
|
|
|
|
|
|
|
|
๊ธฐ๋ณธ `Response` ํด๋์ค๋ ๋ค๋ฅธ ๋ชจ๋ ์๋ต ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค ์
๋๋ค. |
|
|
๊ธฐ๋ณธ `Response` ํด๋์ค์ด๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ์๋ต ํด๋์ค๊ฐ ์ด๋ฅผ ์์ํฉ๋๋ค. |
|
|
|
|
|
|
|
|
์ด ํด๋์ค๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
์ด ํด๋์ค๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค: |
|
|
๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค: |
|
|
|
|
|
|
|
|
* `content` - `str` ๋๋ `bytes`. |
|
|
* `content` - `str` ๋๋ `bytes`. |
|
|
* `status_code` - HTTP ์ํ์ฝ๋๋ฅผ ๋ํ๋ด๋ `int`. |
|
|
* `status_code` - HTTP ์ํ ์ฝ๋๋ฅผ ๋ํ๋ด๋ `int`. |
|
|
* `headers` - ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง `dict`. |
|
|
* `headers` - ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง `dict`. |
|
|
* `media_type` - ๋ฏธ๋์ด ํ์
์ ๋ํ๋ด๋ `str` ์: `"text/html"`. |
|
|
* `media_type` - ๋ฏธ๋์ด ํ์
์ ๋ํ๋ด๋ `str` ์: `"text/html"`. |
|
|
|
|
|
|
|
|
FastAPI (์ค์ ๋ก๋ Starlette)๊ฐ ์๋์ผ๋ก Content-Length ํค๋๋ฅผ ํฌํจ์ํต๋๋ค. ๋ํ `media_type`์ ๊ธฐ๋ฐํ์ฌ Content-Type ํค๋๋ฅผ ํฌํจํ๋ฉฐ, ํ
์คํธ ํ์
์ ๊ฒฝ์ฐ ๋ฌธ์ ์งํฉ์ ์ถ๊ฐ ํฉ๋๋ค. |
|
|
FastAPI(์ ํํ๋ Starlette)๊ฐ ์๋์ผ๋ก Content-Length ํค๋๋ฅผ ํฌํจ์ํต๋๋ค. ๋ํ `media_type`์ ๊ธฐ๋ฐํ์ฌ Content-Type ํค๋๋ฅผ ํฌํจํ๋ฉฐ, ํ
์คํธ ํ์
์ ๊ฒฝ์ฐ ๋ฌธ์ ์งํฉ์ ์ถ๊ฐํฉ๋๋ค. |
|
|
|
|
|
|
|
|
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} |
|
|
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} |
|
|
|
|
|
|
|
|
@ -154,37 +138,11 @@ FastAPI (์ค์ ๋ก๋ Starlette)๊ฐ ์๋์ผ๋ก Content-Length ํค๋๋ฅผ ํฌํจ |
|
|
|
|
|
|
|
|
์ด๋ ์์์ ์ค๋ช
ํ๋ฏ์ด **FastAPI**์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๋ต ํ์์
๋๋ค. |
|
|
์ด๋ ์์์ ์ค๋ช
ํ๋ฏ์ด **FastAPI**์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๋ต ํ์์
๋๋ค. |
|
|
|
|
|
|
|
|
### `ORJSONResponse` { #orjsonresponse } |
|
|
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|
|
|
|
|
|
|
|
<a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์ ์ฌ์ฉํ์ฌ ๋น ๋ฅธ JSON ์๋ต์ ์ ๊ณตํ๋ ๋์์
๋๋ค. ์์์ ์ค๋ช
ํ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
/// info | ์ ๋ณด |
|
|
|
|
|
|
|
|
|
|
|
์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด `orjson`์ ์ค์นํด์ผํฉ๋๋ค. ์: `pip install orjson`. |
|
|
|
|
|
|
|
|
|
|
|
/// |
|
|
|
|
|
|
|
|
|
|
|
### `UJSONResponse` { #ujsonresponse } |
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ JSON ์๋ต ํ์์
๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
/// info | ์ ๋ณด |
|
|
|
|
|
|
|
|
|
|
|
์ด ์๋ต์ ์ฌ์ฉํ๋ ค๋ฉด `ujson`์ ์ค์นํด์ผํฉ๋๋ค. ์: `pip install ujson`. |
|
|
|
|
|
|
|
|
|
|
|
/// |
|
|
|
|
|
|
|
|
|
|
|
/// warning | ๊ฒฝ๊ณ |
|
|
ํ์ง๋ง ์๋ต ๋ชจ๋ธ ๋๋ ๋ฐํ ํ์
์ ์ ์ธํ ๊ฒฝ์ฐ, ํด๋น ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํ๋ ๋ฐ ์ง์ ์ฌ์ฉ๋๋ฉฐ, ์ฌ๋ฐ๋ฅธ JSON ๋ฏธ๋์ด ํ์
์ ์๋ต์ด `JSONResponse` ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ๋ฐํ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
`ujson` ์ ์ผ๋ถ ์์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด Python ๋ด์ฅ ๊ตฌํ๋ณด๋ค ๋ ์๊ฒฉํฉ๋๋ค. |
|
|
์ด ๋ฐฉ์์ด ์ต์์ ์ฑ๋ฅ์ ์ป๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค. |
|
|
|
|
|
|
|
|
/// |
|
|
|
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} |
|
|
|
|
|
|
|
|
|
|
|
/// tip | ํ |
|
|
|
|
|
|
|
|
|
|
|
`ORJSONResponse`๊ฐ ๋ ๋น ๋ฅธ ๋์์ผ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
@ -192,7 +150,7 @@ FastAPI (์ค์ ๋ก๋ Starlette)๊ฐ ์๋์ผ๋ก Content-Length ํค๋๋ฅผ ํฌํจ |
|
|
|
|
|
|
|
|
HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 307(์์ ๋ฆฌ๋๋ ์
)์ผ๋ก ์ค์ ๋ฉ๋๋ค. |
|
|
HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 307(์์ ๋ฆฌ๋๋ ์
)์ผ๋ก ์ค์ ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
`RedirectResponse`๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
`RedirectResponse`๋ฅผ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค: |
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial006_py310.py hl[2,9] *} |
|
|
{* ../../docs_src/custom_response/tutorial006_py310.py hl[2,9] *} |
|
|
|
|
|
|
|
|
@ -205,7 +163,7 @@ HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 30 |
|
|
|
|
|
|
|
|
์ด ๊ฒฝ์ฐ, *๊ฒฝ๋ก ์ฒ๋ฆฌ* ํจ์์์ URL์ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
์ด ๊ฒฝ์ฐ, *๊ฒฝ๋ก ์ฒ๋ฆฌ* ํจ์์์ URL์ ์ง์ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
์ด ๊ฒฝ์ฐ, ์ฌ์ฉ๋๋ `status_code`๋ `RedirectResponse`์ ๊ธฐ๋ณธ๊ฐ์ธ `307` ์
๋๋ค. |
|
|
์ด ๊ฒฝ์ฐ, ์ฌ์ฉ๋๋ `status_code`๋ `RedirectResponse`์ ๊ธฐ๋ณธ๊ฐ์ธ `307`์
๋๋ค. |
|
|
|
|
|
|
|
|
--- |
|
|
--- |
|
|
|
|
|
|
|
|
@ -215,31 +173,25 @@ HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 30 |
|
|
|
|
|
|
|
|
### `StreamingResponse` { #streamingresponse } |
|
|
### `StreamingResponse` { #streamingresponse } |
|
|
|
|
|
|
|
|
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋๋ ์ผ๋ฐ ์ ๋๋ ์ดํฐ/์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐ์ ์๋ต ๋ณธ๋ฌธ์ ์คํธ๋ฆฌ๋ฐ ํฉ๋๋ค. |
|
|
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋๋ ์ผ๋ฐ ์ ๋๋ ์ดํฐ/์ดํฐ๋ ์ดํฐ(`yield`๊ฐ ์๋ ํจ์)๋ฅผ ๋ฐ์ ์๋ต ๋ณธ๋ฌธ์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. |
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} |
|
|
|
|
|
|
|
|
|
|
|
#### ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ `StreamingResponse` { #using-streamingresponse-with-file-like-objects } |
|
|
|
|
|
|
|
|
|
|
|
<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> ๊ฐ์ฒด(์: `open()`์ผ๋ก ๋ฐํ๋ ๊ฐ์ฒด)๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น file-like ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต(iterate)ํ๋ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. |
|
|
{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} |
|
|
|
|
|
|
|
|
์ด ๋ฐฉ์์ผ๋ก, ํ์ผ ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋จผ์ ์ฝ์ด๋ค์ผ ํ์ ์์ด, ์ ๋๋ ์ดํฐ ํจ์๋ฅผ `StreamingResponse`์ ์ ๋ฌํ์ฌ ๋ฐํํ ์ ์์ต๋๋ค. |
|
|
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ |
|
|
|
|
|
|
|
|
์ด ๋ฐฉ์์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง, ๋น๋์ค ์ฒ๋ฆฌ ๋ฑ์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} |
|
|
`async` ์์
์ `await`์ ๋๋ฌํ์ ๋๋ง ์ทจ์๋ ์ ์์ต๋๋ค. `await`๊ฐ ์์ผ๋ฉด ์ ๋๋ ์ดํฐ(`yield`๊ฐ ์๋ ํจ์)๋ ์ ๋๋ก ์ทจ์๋ ์ ์๊ณ , ์ทจ์๊ฐ ์์ฒญ๋ ํ์๋ ๊ณ์ ์คํ๋ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
1. ์ด๊ฒ์ด ์ ๋๋ ์ดํฐ ํจ์์
๋๋ค. `yield` ๋ฌธ์ ํฌํจํ๊ณ ์์ผ๋ฏ๋ก "์ ๋๋ ์ดํฐ ํจ์"์
๋๋ค. |
|
|
์ด ์์ ์์ ๋ ์ด๋ค `await`๋ ํ์ํ์ง ์์ผ๋ฏ๋ก, ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ทจ์๋ฅผ ์ฒ๋ฆฌํ ๊ธฐํ๋ฅผ ์ฃผ๊ธฐ ์ํด `await anyio.sleep(0)`๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
|
|
2. `with` ๋ธ๋ก์ ์ฌ์ฉํจ์ผ๋ก์จ, ์ ๋๋ ์ดํฐ ํจ์๊ฐ ์๋ฃ๋ ํ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ซํ๋๋ก ํฉ๋๋ค. ์ฆ, ์๋ต ์ ์ก์ด ๋๋ ํ ๋ซํ๋๋ค. |
|
|
|
|
|
3. ์ด `yield from`์ ํจ์๊ฐ `file_like`๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต(iterate)ํ๋๋ก ํฉ๋๋ค. ๋ฐ๋ณต๋ ๊ฐ ๋ถ๋ถ์ ์ด ์ ๋๋ ์ดํฐ ํจ์(`iterfile`)์์ ์์ฑ๋ ๊ฒ์ฒ๋ผ `yield` ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
์ด๋ ๊ฒ ํ๋ฉด "์์ฑ(generating)" ์์
์ ๋ด๋ถ์ ์ผ๋ก ๋ค๋ฅธ ๋ฌด์ธ๊ฐ์ ์์ํ๋ ์ ๋๋ ์ดํฐ ํจ์๊ฐ ๋ฉ๋๋ค. |
|
|
๋๊ท๋ชจ ๋๋ ๋ฌดํ ์คํธ๋ฆผ์์๋ ๋์ฑ ์ค์ํฉ๋๋ค. |
|
|
|
|
|
|
|
|
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด `with` ๋ธ๋ก ์์์ ํ์ผ์ ์ด ์ ์์ด, ์์
์ด ์๋ฃ๋ ํ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ซํ๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. |
|
|
/// |
|
|
|
|
|
|
|
|
/// tip | ํ |
|
|
/// tip | ํ |
|
|
|
|
|
|
|
|
์ฌ๊ธฐ์ ํ์ค `open()`์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ `async`์ `await`๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ ์ผ๋ฐ `def`๋ก ์ ์ธํฉ๋๋ค. |
|
|
`StreamingResponse`๋ฅผ ์ง์ ๋ฐํํ๋ ๋์ , [๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ](./stream-data.md){.internal-link target=_blank}์์์ ์คํ์ผ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๋ ํธ๋ฆฌํ๋ฉฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ทจ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
JSON Lines๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ค๋ฉด, [JSON Lines ์คํธ๋ฆฌ๋ฐ](../tutorial/stream-json-lines.md){.internal-link target=_blank} ํํ ๋ฆฌ์ผ์ ํ์ธํ์ธ์. |
|
|
|
|
|
|
|
|
/// |
|
|
/// |
|
|
|
|
|
|
|
|
@ -268,9 +220,9 @@ HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 30 |
|
|
|
|
|
|
|
|
`Response`๋ฅผ ์์๋ฐ์ ์ฌ์ฉ์ ์ ์ ์๋ต ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
`Response`๋ฅผ ์์๋ฐ์ ์ฌ์ฉ์ ์ ์ ์๋ต ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
์๋ฅผ ๋ค์ด, ํฌํจ๋ `ORJSONResponse` ํด๋์ค์์ ์ฌ์ฉ๋์ง ์๋ ์ค์ ์ผ๋ก <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์ ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. |
|
|
์๋ฅผ ๋ค์ด, [`orjson`](https://github.com/ijl/orjson){.external-link target=_blank}์ ์ผ๋ถ ์ค์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. |
|
|
|
|
|
|
|
|
๋ง์ฝ ๋ค์ฌ์ฐ๊ธฐ ๋ฐ ํฌ๋งท๋ JSON์ ๋ฐํํ๊ณ ์ถ๋ค๋ฉด, `orjson.OPT_INDENT_2` ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
๋ค์ฌ์ฐ๊ธฐ ๋ฐ ํฌ๋งท๋ JSON์ ๋ฐํํ๊ณ ์ถ๋ค๋ฉด, orjson ์ต์
`orjson.OPT_INDENT_2`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
`CustomORJSONResponse`๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ `Response.render(content)` ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ๋ด์ฉ์ `bytes`๋ก ๋ฐํํ๋ ๊ฒ์
๋๋ค: |
|
|
`CustomORJSONResponse`๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ `Response.render(content)` ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ๋ด์ฉ์ `bytes`๋ก ๋ฐํํ๋ ๊ฒ์
๋๋ค: |
|
|
|
|
|
|
|
|
@ -292,13 +244,21 @@ HTTP ๋ฆฌ๋๋ ์
์๋ต์ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฝ๋๋ 30 |
|
|
|
|
|
|
|
|
๋ฌผ๋ก JSON ํฌ๋งทํ
๋ณด๋ค ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ ๊ฒ์
๋๋ค. ๐ |
|
|
๋ฌผ๋ก JSON ํฌ๋งทํ
๋ณด๋ค ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ ๊ฒ์
๋๋ค. ๐ |
|
|
|
|
|
|
|
|
|
|
|
### `orjson` ๋๋ ์๋ต ๋ชจ๋ธ { #orjson-or-response-model } |
|
|
|
|
|
|
|
|
|
|
|
์ฑ๋ฅ์ด ๋ชฉ์ ์ด๋ผ๋ฉด, `orjson` ์๋ต์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค [์๋ต ๋ชจ๋ธ](../tutorial/response-model.md){.internal-link target=_blank}์ ์ฌ์ฉํ๋ ํธ์ด ๋ ๋์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
์๋ต ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด FastAPI๋ ์ค๊ฐ ๋จ๊ณ(์: `jsonable_encoder`๋ก์ ๋ณํ) ์์ด Pydantic์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํฉ๋๋ค. ์ด๋ฐ ์ค๊ฐ ๋จ๊ณ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. |
|
|
|
|
|
|
|
|
|
|
|
๊ทธ๋ฆฌ๊ณ ๋ด๋ถ์ ์ผ๋ก Pydantic์ JSON ์ง๋ ฌํ๋ฅผ ์ํด `orjson`๊ณผ ๋์ผํ Rust ๊ธฐ๋ฐ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฏ๋ก, ์๋ต ๋ชจ๋ธ๋ง์ผ๋ก๋ ์ด๋ฏธ ์ต์์ ์ฑ๋ฅ์ ์ป๊ฒ ๋ฉ๋๋ค. |
|
|
|
|
|
|
|
|
## ๊ธฐ๋ณธ ์๋ต ํด๋์ค { #default-response-class } |
|
|
## ๊ธฐ๋ณธ ์๋ต ํด๋์ค { #default-response-class } |
|
|
|
|
|
|
|
|
**FastAPI** ํด๋์ค ๊ฐ์ฒด ๋๋ `APIRouter`๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์๋ต ํด๋์ค๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. |
|
|
**FastAPI** ํด๋์ค ์ธ์คํด์ค ๋๋ `APIRouter`๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ ์๋ต ํด๋์ค๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. |
|
|
|
|
|
|
|
|
์ด๋ฅผ ์ ์ํ๋ ๋งค๊ฐ๋ณ์๋ `default_response_class`์
๋๋ค. |
|
|
์ด๋ฅผ ์ ์ํ๋ ๋งค๊ฐ๋ณ์๋ `default_response_class`์
๋๋ค. |
|
|
|
|
|
|
|
|
์๋ ์์ ์์ **FastAPI**๋ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ๊ธฐ๋ณธ์ ์ผ๋ก `JSONResponse` ๋์ `ORJSONResponse`๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|
|
์๋ ์์ ์์ **FastAPI**๋ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ JSON ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก `HTMLResponse`๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|
|
|
|
|
|
|
|
{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} |
|
|
{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} |
|
|
|
|
|
|
|
|
|