๋ฏธ๋ค์จ์ด¶
๋ฏธ๋ค์จ์ด๋ฅผ FastAPI ์์ฉ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
"๋ฏธ๋ค์จ์ด"๋ ํน์ ๊ฒฝ๋ก ์๋์ ์ํด ์ฒ๋ฆฌ๋๊ธฐ ์ , ๋ชจ๋ ์์ฒญ์ ๋ํด์ ๋์ํ๋ ํจ์์ ๋๋ค. ๋ํ ๋ชจ๋ ์๋ต์ด ๋ฐํ๋๊ธฐ ์ ์๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
- ๋ฏธ๋ค์จ์ด๋ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค๋ ์์ฒญ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ์์ฒญ ๋๋ ๋ค๋ฅธ ํ์ํ ์ฝ๋๋ฅผ ์คํ ์ํฌ ์ ์์ต๋๋ค.
- ์์ฒญ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ๋ก ์๋์ผ๋ก ์ ๋ฌํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ๋ก ์์ ์์ ์์ฑํ ์๋ต๋ฅผ ๋ฐ์ต๋๋ค.
- ์๋ต ๋๋ ๋ค๋ฅธ ํ์ํ ์ฝ๋๋ฅผ ์คํ์ํค๋ ๋์์ ํ ์ ์์ต๋๋ค.
- ์๋ต๋ฅผ ๋ฐํํฉ๋๋ค.
๊ธฐ์ ์ธ๋ถ์ฌํญ
๋ง์ฝ yield
๋ฅผ ์ฌ์ฉํ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋ฏธ๋ค์จ์ด๊ฐ ์คํ๋๊ณ ๋ ํ์ exit์ด ์คํ๋ฉ๋๋ค.
๋ง์ฝ (๋์ค์ ๋ฌธ์์์ ๋ค๋ฃฐ) ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ์๋ค๋ฉด, ๋ชจ๋ ๋ฏธ๋ค์จ์ด๊ฐ ์คํ๋๊ณ ๋ ํ์ ์คํ๋ฉ๋๋ค.
๋ฏธ๋ค์จ์ด ๋ง๋ค๊ธฐ¶
๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ํจ์ ์๋จ์ @app.middleware("http")
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฏธ๋ค์จ์ด ํจ์๋ ๋ค์ ํญ๋ชฉ๋ค์ ๋ฐ์ต๋๋ค:
request
.request
๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋call_next
ํจ์.- ์ด ํจ์๋
request
๋ฅผ ํด๋นํ๋ ๊ฒฝ๋ก ์์ ์ผ๋ก ์ ๋ฌํฉ๋๋ค. - ๊ทธ๋ฐ ๋ค์, ๊ฒฝ๋ก ์์
์ ์ํด ์์ฑ๋
response
๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด ํจ์๋
response
๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ์ถ๊ฐ๋กresponse
๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
ํ
์ฌ์ฉ์ ์ ์ ํค๋๋ 'X-' ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์์ ๋ณผ ์ ์๋ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๊ทธ๊ฒ๋ค์ CORS ์ค์ (CORS (Cross-Origin Resource Sharing))์ Starlette CORS ๋ฌธ์์ ๋ช
์๋ expose_headers
๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ํค๋๋ค์ ์ถ๊ฐํ์ฌ์ผํฉ๋๋ค.
๊ธฐ์ ์ ์ธ๋ถ์ฌํญ
from starlette.requests import request
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
FastAPI๋ ๊ฐ๋ฐ์์๊ฒ ํธ์๋ฅผ ์ํด ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ Starlette์์ ์ง์ ํ์๋์์ต๋๋ค.
response
์ ์ ๊ณผ ํ¶
๊ฒฝ๋ก ์๋์ ๋ฐ๊ธฐ ์ request
์ ํจ๊ป ์๋ํ ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ response
๋ํ ์์ฑ๋ ํ ๋ฐํ๋๊ธฐ ์ ์ ์ฝ๋๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์์ฒญ์ ์ํํ๊ณ ์๋ต์ ์์ฑํ๋๋ฐ ๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ X-Process-Time
๊ฐ์ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
๋ค๋ฅธ ๋ฏธ๋ค์จ์ด¶
๋ฏธ๋ค์จ์ด์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ ์๋ จ๋ ์ฌ์ฉ์ ์๋ด์: ํฅ์๋ ๋ฏธ๋ค์จ์ด์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ๋ถ๋ถ์์ ๋ฏธ๋ค์จ์ด์ ํจ๊ป CORS๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง์ ๋ํด ํ์ธํ ๊ฒ์ ๋๋ค.