81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
import logging
|
|
|
|
from fastapi import FastAPI
|
|
from injectable import load_injection_container
|
|
|
|
from app.config import get_settings
|
|
from app.util.logging import HandlerFactory
|
|
|
|
|
|
class KarlApplication:
|
|
from starlette.types import Receive, Scope, Send
|
|
def __init__(self) -> None:
|
|
self._set_logging()
|
|
_app = FastAPI(title="Karl", version="0.1.0")
|
|
self._set_middlewares(_app)
|
|
self._set_routes(_app)
|
|
self._set_events(_app)
|
|
self._init_services()
|
|
|
|
self._app = _app
|
|
|
|
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
|
await self._app.__call__(scope, receive, send)
|
|
|
|
def _set_logging(self):
|
|
settings = get_settings()
|
|
logging.addLevelName(5, "TRACE")
|
|
logging.Logger.trace = lambda s, msg, *args, **kwargs: s.log(5, msg, *args, **kwargs)
|
|
logging.basicConfig(level=settings.logging.level,
|
|
handlers=HandlerFactory.create(HandlerFactory.Target.ALL, handler_prefix='karl.',
|
|
file_path=settings.logging.path))
|
|
|
|
loggers = (
|
|
"uvicorn",
|
|
"uvicorn.access",
|
|
"uvicorn.error",
|
|
"fastapi",
|
|
"asyncio",
|
|
"starlette",
|
|
)
|
|
external_handlers = HandlerFactory.create(HandlerFactory.Target.ALL, file_path=settings.logging.path)
|
|
for logger_name in loggers:
|
|
logging_logger = logging.getLogger(logger_name)
|
|
logging_logger.handlers = external_handlers
|
|
logging_logger.propagate = False
|
|
|
|
def _set_middlewares(self, app: FastAPI):
|
|
from app.web.middlewares import LoggingMiddleware
|
|
app.add_middleware(LoggingMiddleware)
|
|
|
|
def _set_routes(self, app: FastAPI):
|
|
from app.core.router import router as core_router
|
|
app.include_router(core_router)
|
|
from app.api.v1 import router as api_v1_router
|
|
app.include_router(api_v1_router, prefix="/api/v1", tags=["v1"])
|
|
pass
|
|
|
|
def _set_events(self, app: FastAPI):
|
|
pass
|
|
|
|
def _init_services(self):
|
|
logger = logging.getLogger(__name__)
|
|
load_injection_container()
|
|
|
|
|
|
def run():
|
|
return KarlApplication()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
|
|
settings = get_settings()
|
|
uvicorn.run(
|
|
"app.main:run",
|
|
factory=True,
|
|
host=settings.app.host,
|
|
port=settings.app.port,
|
|
reload=settings.app.reload,
|
|
log_config=None,
|
|
)
|