Django .env: Configuraciones distintas por ambiente y variables de entorno

Video thumbnail

Vamos a hablar un poco sobre cómo puedes tener configuraciones distintas en Django. Para entrar un poco en contexto: nosotros instalamos Django Tailwind para poder utilizar Tailwind CSS desde Django, con la ventaja principal de que luego vamos a poder purgar el CSS y no tener toda la librería completa en el proyecto, especialmente si no la estamos utilizando al 100%.

Eso es justo lo que buscamos, y por eso no usamos la opción de la CDN.

Ahora, en algunas instalaciones, quiero personalizar la configuración NPM_BIN_PATH, aunque, puede ser cualquier otra; es importante que, dependiendo del ambiente, puede que tengas que configurar la configuracion anterior o inclusive no incluirla.

Opción 1: Configurar según el sistema operativo

Una primera opción —la que menos me gusta— es configurar tu entorno preguntando por el sistema operativo:

import platform
***
if platform.system() == "Windows":
    NPM_BIN_PATH = "C:/Users/andre/.config/herd/bin/nvm/v23.11.0/npm.cmd"


Esto podría servirme porque solo en Windows tengo que especificar la ruta del NPM. En Mac simplemente no se ejecuta esta línea y todo feliz.

Peeero… si estás trabajando en un equipo, por ejemplo, con cinco personas donde tres usan Windows, podrías tener problemas. Cada quien puede tener Node instalado en lugares distintos (aunque usen Herd), o algunos podrían tenerlo globalmente. Así que preguntar solo por el sistema operativo es muy limitado.

Podría ser útil si necesitas desactivar un servicio en Windows, por ejemplo, pero no es una solución escalable ni flexible.

Opción 2: Usar variables de entorno (la mejor)

La mejor solución es utilizar variables de entorno.

Solo tienes que crear un archivo .env en tu proyecto, como este que ya tengo acá:

djangoshopping\.env

Y agregas tus configuraciones:

NPM_BIN_PATH="C:/Users/andre/.config/herd/bin/nvm/v23.11.0/npm.cmd"

También, las puedes exportar desde la terminal, en Windows: 

NPM_BIN_PATH="C:/Users/andre/.config/herd/bin/nvm/v23.11.0/npm.cmd"

En MacOS/Linux:

export NPM_BIN_PATH="<RUTE>"

Y a nivel de las configuraciones, ya no es un valor fino si no, indicamos que la obtenga de las variables de entorno:

djangoshopping\djangoshopping\settings.py

import os
***
- NPM_BIN_PATH = "C:/Users/andre/.config/herd/bin/nvm/v23.11.0/npm.cmd"
+ NPM_BIN_PATH = os.environ.get('NPM_BIN_PATH', None)

En mi caso particular, en Windows defino la variable, pero en Mac no, porque ya lo tengo globalmente y Django Tailwind lo reconoce automáticamente.

Y esto es extremadamente útil si trabajas en equipo:
Cada persona puede configurar su variable .env según su entorno sin romper nada para los demás.

Por ejemplo, si alguien se llama "Pepito" y su ruta de Herd es distinta, puede configurarla sin afectar a nadie.

Si alguien tiene Node instalado globalmente, simplemente no define la variable.
Y si usan Laragon u otro entorno, basta con definir la ruta correspondiente al npm.

Más configuraciones con variables

Otra ventaja es que puedes usar este mismo enfoque para definir otras configuraciones específicas por entorno.
En vez de tener valores fijos en el código, usas os.environ.get(...), y listo.

Conclusión

Así que ya sabes:

  1. Configurar por sistema operativo funciona, pero es limitado.
  2. Usar variables de entorno es más limpio, escalable y profesional.
  3. Te permite tener un entorno flexible, especialmente en proyectos compartidos.

Acepto recibir anuncios de interes sobre este Blog.

Hablamos sobre como definir variables de entorno en Django.

- Andrés Cruz

In english