728x90

fastapi에는 spring의 Interceptor와 같이 api호출 후 전/후처리를 할 수 있는 기능이 있습니다.

middleware를 적용하면 되는데

 

먼저 middleware/middleware.py를 생성해줍니다

from fastapi import Request
from chatterbot.utils import get_logger
import time

logger = get_logger(__name__)


class Middleware:
    def __init__(
            self,
            some_attribute: str,
    ):
        self.some_attribute = some_attribute

    async def __call__(self, request: Request, call_next):
        logger.debug("")
        logger.debug(" ******************** start ******************** ")
        logger.debug(" ***** request path : {} ".format(request.url.path))

        start_time = time.time()
        response = await call_next(request)
        process_time = time.time() - start_time
        response.headers["X-Process-Time"] = str(process_time)

        logger.debug(" ***** process_time : {} ".format(process_time))
        logger.debug(" ******************** end ******************** ")
        logger.debug("")

        return response

소스코드를 보시면 __call__함수가 있고, 그 안에서 
1. start_time 찍기
2. call_nest(request)호출
3. process_time찍기
순으로 실행을 하는데 이 과정을거쳐서 호출된 요청의 process_time을 찍을 수 있습니다.

 

await call_nest(reques)로 사용자가 요청하기 전에 전처리를 하고
응답값을 받아온 후에 후처리를 로직을 넣어서 구서을 하시면 됩니다.

 

 

이렇게 작성한 middleware를 router에 add해야하는데
main.py 소스에 아래부분을 추가하면 됩니다.

 

from middleware.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware

app = FastAPI()

middleware = Middleware(some_attribute="some_attribute_here_if_needed")
app.add_middleware(BaseHTTPMiddleware, dispatch=middleware)

+ Recent posts