File size: 1,194 Bytes
6fadbbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import time
from typing import List
from fastapi import Request
from fastapi.routing import APIRoute
from starlette.middleware.base import BaseHTTPMiddleware
from utils.logger import Logger

logger = Logger.get_logger(__name__)


class LogIncomingRequest(BaseHTTPMiddleware):
    def __get_request_handler(_, req: Request):  # type: ignore
        # get controller from request
        routes: List[APIRoute] = req.app.routes
        for route in routes:
            if route.path_regex.match(req.url.path) and req.method in route.methods:
                return route.endpoint.__name__ if hasattr(route.endpoint, '__name__') else 'fastapi_core'

    async def dispatch(self, request: Request, call_next):
        func_name = self.__get_request_handler(request)
        request.state.func_name = func_name

        logger.info('{} - start'.format(func_name))
        start_time = time.time()

        response = await call_next(request)

        process_time = (time.time() - start_time) * 1000
        formatted_process_time = '{0:.2f}'.format(process_time)
        logger.info('{} - end in time (ms): {}'.format(func_name,
                    formatted_process_time))
        return response