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()