import os from dotenv import load_dotenv from functools import lru_cache from typing import Any, Literal from pydantic import model_validator from pydantic_settings import BaseSettings, SettingsConfigDict from core.path_conf import BASE_PATH load_dotenv() class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=f"{BASE_PATH}/.env", env_file_encoding="utf-8", extra="ignore", case_sensitive=True, ) ENVIRONMENT: Literal["dev", "pro"] API_BASE_URL: str API_BASE_URL_VATO: str API_BASE_URL_ACCESS_TOKEN: str # DATABASE_TYPE: Literal['mysql', 'postgresql'] # DATABASE_HOST: str # DATABASE_PORT: int # DATABASE_USER: str # DATABASE_PASSWORD: str # MODEl NER NER_MODEL_DIR: str = "app/ner/models/ner" TASK_NAME: str = "token-classification" ACCELERATOR: str = "ort" DEVICE: str = "cpu" TRUNCATE: bool = True MAX_LENGTH: int = 512 # FastAPI FASTAPI_API_V1_PATH: str = "/api/v1" FASTAPI_TITLE: str = "FastAPI" FASTAPI_VERSION: str = "0.0.1" FASTAPI_DESCRIPTION: str = "FastAPI" FASTAPI_DOCS_URL: str = "/docs" FASTAPI_REDOC_URL: str = "/redoc" FASTAPI_OPENAPI_URL: str | None = "/openapi" FASTAPI_STATIC_FILES: bool = True DATABASE_ECHO: bool = False DATABASE_POOL_ECHO: bool = False DATABASE_SCHEMA: str = "fba" DATABASE_CHARSET: str = "utf8mb4" CORS_ALLOWED_ORIGINS: list[str] = [ "http://127.0.0.1:8000", "http://localhost:5173", ] CORS_EXPOSE_HEADERS: list[str] = [ "X-Request-ID", ] MIDDLEWARE_CORS: bool = True MIDDLEWARE_ACCESS: bool = True DATETIME_TIMEZONE: str = "Asia/Ho_Chi_Minh" DATETIME_FORMAT: str = "%Y-%m-%d %H:%M:%S" UPLOAD_READ_SIZE: int = 1024 UPLOAD_IMAGE_EXT_INCLUDE: list[str] = ["jpg", "jpeg", "png", "gif", "webp"] UPLOAD_IMAGE_SIZE_MAX: int = 5 * 1024 * 1024 # 5 MB UPLOAD_VIDEO_EXT_INCLUDE: list[str] = ["mp4", "mov", "avi", "flv"] UPLOAD_VIDEO_SIZE_MAX: int = 20 * 1024 * 1024 # 20 MB TRACE_ID_REQUEST_HEADER_KEY: str = "X-Request-ID" # 日志 LOG_CID_DEFAULT_VALUE: str = "-" LOG_CID_UUID_LENGTH: int = 32 # 日志 correlation_id 长度,必须小于等于 32 LOG_STD_LEVEL: str = "INFO" LOG_ACCESS_FILE_LEVEL: str = "INFO" LOG_ERROR_FILE_LEVEL: str = "ERROR" LOG_STD_FORMAT: str = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | " " {correlation_id} | {message}" ) LOG_FILE_FORMAT: str = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | " " {correlation_id} | {message}" ) LOG_ACCESS_FILENAME: str = "fba_access.log" LOG_ERROR_FILENAME: str = "fba_error.log" OPERA_LOG_PATH_EXCLUDE: list[str] = [ "/favicon.ico", "/docs", "/redoc", "/openapi", ] @model_validator(mode="before") @classmethod def check_env(cls, values: Any) -> Any: if values.get("ENVIRONMENT") == "pro": values["FASTAPI_OPENAPI_URL"] = None values["FASTAPI_STATIC_FILES"] = False return values @lru_cache def get_settings() -> Settings: return Settings() settings = get_settings()