import os from pathlib import Path import environ BASE_DIR = Path(__file__).resolve().parent.parent.parent env = environ.Env() env_file = BASE_DIR / '.env' if os.path.exists(env_file): environ.Env.read_env(env_file) SECRET_KEY = env.str('SECRET_KEY', 'this-is-the-default-secret-key') DEBUG = env.bool('DEBUG', False) CORS_ORIGIN_WHITELIST = env.str('CORS_ORIGIN_WHITELIST', 'http://localhost:8000').split(',') CSRF_TRUSTED_ORIGINS = env.str('CSRF_TRUSTED_ORIGINS', 'http://localhost:8000').split(',') DATABASE_URL = env.db_url('DATABASE_URL', 'sqlite:///db.sqlite3') REDIS_HOST = env.str('REDIS_HOST', 'redis') REDIS_PORT = env.str('REDIS_PORT', 6379) PAGE_SIZE = env.int('PAGE_SIZE', 20) ALLOWED_HOSTS = env.str('ALLOWED_HOSTS', '*').split(',') CELERY_BROKER_URL = env.str('CELERY_BROKER_URL', 'redis://172.17.0.1:6379/0') S3_ENABLED = env.bool('S3_ENABLED', False) AWS_S3_HOST = env.str('S3_HOST', '') AWS_ACCESS_KEY_ID = env.str('S3_ACCESS_KEY_ID', '') AWS_SECRET_ACCESS_KEY = env.str('S3_SECRET_ACCESS_KEY', '') AWS_STORAGE_BUCKET_NAME = env.str('S3_STORAGE_BUCKET_NAME', '') AWS_S3_ENDPOINT_URL = env.str('S3_ENDPOINT_URL', '') # Compatibilidad con Garage (ver docker-compose.yml/garage.toml, S3 # self-hosted para desarrollo local): a diferencia de AWS S3, exige indicar # la región a mano y no soporta el estilo de direccionamiento "virtual" # (bucket como subdominio) por defecto. AWS_S3_REGION_NAME = env.str('S3_REGION_NAME', '') AWS_S3_USE_SSL = env.bool('S3_USE_SSL', True) AWS_S3_ADDRESSING_STYLE = env.str('S3_ADDRESSING_STYLE', 'auto') ITEMS_PER_PAGE = env.int('ITEMS_PER_PAGE', 20) EMAIL_BACKEND = env.str('EMAIL_BACKEND', 'django.core.mail.backends.console.EmailBackend') EMAIL_HOST = env.str('EMAIL_HOST', '') EMAIL_HOST_USER = env.str('EMAIL_HOST_USER', '') EMAIL_HOST_PASSWORD = env.str('EMAIL_HOST_PASSWORD', '') EMAIL_PORT = env.int('EMAIL_PORT', 587) DEFAULT_FROM_EMAIL = env.str('DEFAULT_FROM_EMAIL', 'webmaster@localhost') # A dónde se remite al usuario en el aviso de cambio de email (ver # EmailUpdateForm) por si el cambio no lo ha hecho él. SUPPORT_EMAIL = env.str('SUPPORT_EMAIL', 'soporte@localhost') # Nombre mostrado en el navbar, el y los emails de aviso de la # cuenta (ver EmailUpdateForm/StyledPasswordChangeForm/AccountDeleteForm). SITE_NAME = env.str('SITE_NAME', 'Crochet') LOG_LEVEL = env.str('LOG_LEVEL', 'INFO') # Limitación de peticiones (ver crochet/views.py: login, registro, # recuperación de contraseña y verificación en dos pasos) con # django-ratelimit. Usa el cache framework de Django (settings.CACHES, # "default" por defecto: LocMemCache si no se configura otra cosa) para # contar peticiones; LocMemCache es propio de cada proceso, así que con # más de un worker/instancia en producción el límite real es "por # proceso", no global — configura ahí un backend compartido (Redis, # Memcached) si eso te importa. RATELIMIT_ENABLE = env.bool('RATELIMIT_ENABLE', True) # Cabeceras/cookies de seguridad para servir por HTTPS en producción. Todo # esto viene desactivado por defecto porque en desarrollo local se sirve # por HTTP plano (activarlo ahí dejaría la app inaccesible o el navegador # descartando las cookies de sesión/CSRF). Actívalo en el .env de # producción una vez la app esté detrás de HTTPS de verdad. SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', False) SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', False) CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', False) # En segundos; 0 desactiva HSTS. Empieza bajo (p. ej. 3600) para probar en # producción antes de subirlo a un valor largo (p. ej. 31536000 = 1 año): # un valor largo con la configuración equivocada deja el dominio # inaccesible por HTTPS durante ese tiempo para quien ya lo haya recibido. SECURE_HSTS_SECONDS = env.int('SECURE_HSTS_SECONDS', 0) SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool('SECURE_HSTS_INCLUDE_SUBDOMAINS', False) SECURE_HSTS_PRELOAD = env.bool('SECURE_HSTS_PRELOAD', False)