Arch/config.py

96 lines
2.4 KiB
Python

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,
}