Arch/config.py

86 lines
2.6 KiB
Python

import os
from datetime import timedelta
from dotenv import load_dotenv
# Cargar variables de entorno desde archivo .env
load_dotenv()
class Config:
"""Configuración base para la aplicación."""
# Configuración de Flask
SECRET_KEY = os.environ.get('SECRET_KEY') or 'clave-secreta-predeterminada'
STORAGE_PATH = os.environ.get('STORAGE_PATH') or 'storage'
# Configuración de sesión
SESSION_TYPE = 'filesystem'
SESSION_FILE_DIR = os.path.join(STORAGE_PATH, 'sessions')
SESSION_PERMANENT = True
PERMANENT_SESSION_LIFETIME = timedelta(hours=8)
# Configuración de carga de archivos
MAX_CONTENT_LENGTH = 100 * 1024 * 1024 # 100MB límite global
UPLOAD_FOLDER = os.path.join(STORAGE_PATH, 'projects')
# Configuración de caché
CACHE_TYPE = 'SimpleCache'
CACHE_DEFAULT_TIMEOUT = 300
# Configuración de logging
LOG_DIR = os.path.join(STORAGE_PATH, 'logs')
@staticmethod
def init_app(app):
"""Inicialización adicional de la aplicación."""
# Asegurar que existen directorios necesarios
os.makedirs(Config.SESSION_FILE_DIR, exist_ok=True)
os.makedirs(Config.LOG_DIR, exist_ok=True)
class DevelopmentConfig(Config):
"""Configuración para entorno de desarrollo."""
DEBUG = True
class TestingConfig(Config):
"""Configuración para entorno de pruebas."""
TESTING = True
STORAGE_PATH = 'test_storage'
WTF_CSRF_ENABLED = False # Deshabilitar CSRF para pruebas
class ProductionConfig(Config):
"""Configuración para entorno de producción."""
DEBUG = False
TESTING = False
@classmethod
def init_app(cls, app):
Config.init_app(app)
# Configuración adicional para producción
import logging
from logging.handlers import RotatingFileHandler
# Configurar handler para errores
file_handler = RotatingFileHandler(
os.path.join(cls.LOG_DIR, 'arch.log'),
maxBytes=10 * 1024 * 1024, # 10MB
backupCount=10
)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
app.logger.info('ARCH inicializado')
# Diccionario con las configuraciones disponibles
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}