| """Application implementation - ASGI.""" |
|
|
| import os |
|
|
| from fastapi import FastAPI, Request |
| from fastapi.exceptions import RequestValidationError |
| from fastapi.middleware.cors import CORSMiddleware |
| from fastapi.responses import JSONResponse |
| from fastapi.staticfiles import StaticFiles |
| from loguru import logger |
|
|
| from app.config import config |
| from app.models.exception import HttpException |
| from app.router import root_api_router |
| from app.utils import utils |
|
|
|
|
| def exception_handler(request: Request, e: HttpException): |
| return JSONResponse( |
| status_code=e.status_code, |
| content=utils.get_response(e.status_code, e.data, e.message), |
| ) |
|
|
|
|
| def validation_exception_handler(request: Request, e: RequestValidationError): |
| return JSONResponse( |
| status_code=400, |
| content=utils.get_response( |
| status=400, data=e.errors(), message="field required" |
| ), |
| ) |
|
|
|
|
| def get_application() -> FastAPI: |
| """Initialize FastAPI application. |
| |
| Returns: |
| FastAPI: Application object instance. |
| |
| """ |
| instance = FastAPI( |
| title=config.project_name, |
| description=config.project_description, |
| version=config.project_version, |
| debug=False, |
| ) |
| instance.include_router(root_api_router) |
| instance.add_exception_handler(HttpException, exception_handler) |
| instance.add_exception_handler(RequestValidationError, validation_exception_handler) |
| return instance |
|
|
|
|
| app = get_application() |
|
|
| |
| cors_allowed_origins_str = os.getenv("CORS_ALLOWED_ORIGINS", "") |
| origins = cors_allowed_origins_str.split(",") if cors_allowed_origins_str else ["*"] |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=origins, |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| task_dir = utils.task_dir() |
| app.mount( |
| "/tasks", StaticFiles(directory=task_dir, html=True, follow_symlink=True), name="" |
| ) |
|
|
| public_dir = utils.public_dir() |
| app.mount("/", StaticFiles(directory=public_dir, html=True), name="") |
|
|
|
|
| @app.on_event("shutdown") |
| def shutdown_event(): |
| logger.info("shutdown event") |
|
|
|
|
| @app.on_event("startup") |
| def startup_event(): |
| logger.info("startup event") |
|
|