import os from datetime import timedelta from dotenv import load_dotenv # Cargar variables de entorno desde archivo .env load_dotenv() # Directorio base donde se ejecuta la aplicación basedir = os.path.abspath(os.path.dirname(__file__)) class Config: """Configuración base.""" # Seguridad SECRET_KEY = os.environ.get("SECRET_KEY") or "clave-secreta-por-defecto" BCRYPT_LOG_ROUNDS = 12 WTF_CSRF_ENABLED = True # Sesión SESSION_TYPE = "filesystem" SESSION_FILE_DIR = os.path.join(basedir, "flask_session") SESSION_PERMANENT = True PERMANENT_SESSION_LIFETIME = timedelta(days=1) SESSION_USE_SIGNER = True # Caché CACHE_TYPE = "SimpleCache" CACHE_DEFAULT_TIMEOUT = 300 # Almacenamiento STORAGE_PATH = os.environ.get("STORAGE_PATH") or os.path.join(basedir, "storage") MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50 MB # Configuración de la aplicación APP_NAME = "Arch" ADMIN_EMAIL = os.environ.get("ADMIN_EMAIL") or "admin@example.com" ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD") or "admin" @staticmethod def init_app(app): """Inicialización adicional de la aplicación.""" os.makedirs(Config.SESSION_FILE_DIR, exist_ok=True) class DevelopmentConfig(Config): """Configuración para desarrollo.""" DEBUG = True TESTING = False class TestingConfig(Config): """Configuración para pruebas.""" TESTING = True DEBUG = True WTF_CSRF_ENABLED = False BCRYPT_LOG_ROUNDS = 4 # más rápido para pruebas STORAGE_PATH = os.path.join(basedir, "test_storage") class ProductionConfig(Config): """Configuración para producción.""" DEBUG = False TESTING = False # Override secret key in production SECRET_KEY = os.environ.get("SECRET_KEY") # Opciones de seguridad más estrictas SESSION_COOKIE_SECURE = True SESSION_COOKIE_HTTPONLY = True REMEMBER_COOKIE_SECURE = True REMEMBER_COOKIE_HTTPONLY = True @staticmethod def init_app(app): Config.init_app(app) # Verificar SECRET_KEY if app.config["SECRET_KEY"] == "clave-secreta-por-defecto": import warnings warnings.warn("SECRET_KEY no configurada para producción!") # Mapeo de configuraciones config = { "development": DevelopmentConfig, "testing": TestingConfig, "production": ProductionConfig, "default": DevelopmentConfig, }