Добавлена возможность регистрировать прикладные апи
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import time
|
||||
from collections.abc import Iterable
|
||||
|
||||
from fastapi import FastAPI, Request
|
||||
|
||||
from app_runtime.core.service_container import ServiceContainer
|
||||
from app_runtime.http.base import HttpRouteRegistrar
|
||||
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HttpApplicationAppFactory:
|
||||
def create(self, registrars: Iterable[HttpRouteRegistrar], services: ServiceContainer) -> FastAPI:
|
||||
app = FastAPI(title="PLBA Application API")
|
||||
self._register_middleware(app)
|
||||
for registrar in registrars:
|
||||
registrar.register(app, services)
|
||||
return app
|
||||
|
||||
def _register_middleware(self, app: FastAPI) -> None:
|
||||
@app.middleware("http")
|
||||
async def track_request(request: Request, call_next): # type: ignore[no-untyped-def]
|
||||
started = time.monotonic()
|
||||
response = await call_next(request)
|
||||
duration_ms = int((time.monotonic() - started) * 1000)
|
||||
response.headers["X-Response-Time-Ms"] = str(duration_ms)
|
||||
LOGGER.info(
|
||||
"Application HTTP request handled: method=%s path=%s status=%s duration_ms=%s",
|
||||
request.method,
|
||||
request.url.path,
|
||||
response.status_code,
|
||||
duration_ms,
|
||||
)
|
||||
return response
|
||||
Reference in New Issue
Block a user