de hecho, es recomendable poner en .gitignore, que ignore el .env
.gitignore
.env
Cuando despliegas una aplicación Python en distintos entornos, necesitas que ciertos valores cambien según dónde corra el código. Las variables de entorno resuelven este problema y te permiten separar configuración sensible del código fuente, algo clave si trabajas con Flask, Django o cualquier servidor WSGI.
¿Por qué usar variables de entorno en lugar de hardcodear valores?
Imagina que tienes una variable llamada APP_MODE. En tu máquina debería valer local, pero en producción debería ser production. Si dejas ese valor escrito directamente en el código y lo subes al repositorio, vas a tener conflictos cada vez que ejecutes la aplicación en un entorno distinto.
La solución es mantener esos valores fuera del código y leerlos desde el sistema operativo o desde un archivo de configuración local.
¿Qué es una variable de entorno? Es un valor tipo string que vive en el sistema operativo y que tu aplicación puede leer en tiempo de ejecución. Sirve para guardar configuración que cambia entre servidores.
¿Cómo se crea una variable de entorno con export en Linux?
En una terminal Linux usas el comando export seguido del nombre de la variable y su valor [01:00]. Por ejemplo:
bash export APP_MODE=local
Con eso defines APP_MODE en la sesión actual. Recuerda que las variables de entorno solo aceptan strings, así que no intentes guardar enteros, listas ni diccionarios directamente.
¿Cómo leo esa variable desde Python?
Python incluye la librería os por defecto, así que no necesitas instalar nada extra. Para obtener el valor usas os.environ.get y le pasas la key que definiste:
python import os
app_mode = os.environ.get("APP_MODE") print(app_mode)
Si ejecutas la aplicación con un servidor como Gunicorn y abres el navegador, verás el mensaje impreso en la terminal. Y aquí viene un detalle interesante: si el valor aparece dos veces, no es un error. Pasa porque tu servidor tiene dos workers, es decir, dos procesos de Python corriendo en paralelo aceptando requests [02:10].
¿Cómo usar un archivo .env con python-dotenv?
Definir variables con export cada vez que abres una terminal es engorroso. Por eso existe el archivo .env, donde concentras toda tu configuración local en un solo lugar [02:40].
Un .env típico se ve así:
APP_MODE=local SECRET=super_secret
Para leerlo desde Python necesitas instalar la librería python-dotenv:
bash pip install python-dotenv
La versión que se instala es la 1.0. Guárdala en tu requirements.txt para que cualquiera que clone el proyecto pueda replicar el entorno.
Luego, en tu código importas la función y le pasas la ruta del archivo:
python from dotenv import load_dotenv
load_dotenv(".env")
Esto inyecta todas las variables del archivo en el entorno del proceso, sin que tengas que ejecutar export manualmente. Después puedes leerlas con os.environ.get igual que antes.
¿Para qué sirve python-dotenv? Es una librería que carga variables desde un archivo
.enval entorno de ejecución de Python, evitando que tengas que exportarlas a mano en cada sesión.
¿Por qué no debo subir el archivo .env al repositorio?
El .env suele contener información delicada: contraseñas de base de datos, claves de API, secretos de autenticación con servicios como Facebook Login. Si lo subes a Git, expones esos datos a todo el equipo y, peor aún, al público si el repositorio es abierto.
La regla práctica:
.env a tu .gitignore desde el primer commit..env.example con las llaves pero sin los valores reales.¿Qué casos reales resuelve un archivo .env?
Una vez que dominas el flujo, las aplicaciones son muchas. Algunos ejemplos directos:
APP_MODE para cambiar comportamiento entre entornos.Esto te permite proteger la información crítica de tu aplicación y controlar quién tiene acceso a qué.
¿Qué pasa si defino la misma variable con export y en el .env?
Este es justo el experimento que vale la pena hacer tú mismo. Crea una variable usando export en la terminal, luego define la misma variable en tu .env con un valor distinto y observa cuál toma prioridad cuando ejecutas la aplicación.
Entender ese orden de precedencia te va a ahorrar horas de debugging cuando una variable no tome el valor que esperas.
¿Qué variables sueles guardar en tu .env y cuáles dejas en el sistema operativo? Cuéntame tu setup en los comentarios.
Cuando despliegas una aplicación Python en distintos entornos, necesitas que ciertos valores cambien según dónde corra el código. Las variables de entorno resuelven este problema y te permiten separar configuración sensible del código fuente, algo clave si trabajas con Flask, Django o cualquier servidor WSGI.
Imagina que tienes una variable llamada APP_MODE. En tu máquina debería valer local, pero en producción debería ser production. Si dejas ese valor escrito directamente en el código y lo subes al repositorio, vas a tener conflictos cada vez que ejecutes la aplicación en un entorno distinto.
La solución es mantener esos valores fuera del código y leerlos desde el sistema operativo o desde un archivo de configuración local.
¿Qué es una variable de entorno? Es un valor tipo string que vive en el sistema operativo y que tu aplicación puede leer en tiempo de ejecución. Sirve para guardar configuración que cambia entre servidores.
En una terminal Linux usas el comando export seguido del nombre de la variable y su valor [01:00]. Por ejemplo:
bash export APP_MODE=local
Con eso defines APP_MODE en la sesión actual. Recuerda que las variables de entorno solo aceptan strings, así que no intentes guardar enteros, listas ni diccionarios directamente.
Python incluye la librería os por defecto, así que no necesitas instalar nada extra. Para obtener el valor usas os.environ.get y le pasas la key que definiste:
python import os
app_mode = os.environ.get("APP_MODE") print(app_mode)
Si ejecutas la aplicación con un servidor como Gunicorn y abres el navegador, verás el mensaje impreso en la terminal. Y aquí viene un detalle interesante: si el valor aparece dos veces, no es un error. Pasa porque tu servidor tiene dos workers, es decir, dos procesos de Python corriendo en paralelo aceptando requests [02:10].
Definir variables con export cada vez que abres una terminal es engorroso. Por eso existe el archivo .env, donde concentras toda tu configuración local en un solo lugar [02:40].
Un .env típico se ve así:
APP_MODE=local SECRET=super_secret
Para leerlo desde Python necesitas instalar la librería python-dotenv:
bash pip install python-dotenv
La versión que se instala es la 1.0. Guárdala en tu requirements.txt para que cualquiera que clone el proyecto pueda replicar el entorno.
Luego, en tu código importas la función y le pasas la ruta del archivo:
python from dotenv import load_dotenv
load_dotenv(".env")
Esto inyecta todas las variables del archivo en el entorno del proceso, sin que tengas que ejecutar export manualmente. Después puedes leerlas con os.environ.get igual que antes.
¿Para qué sirve python-dotenv? Es una librería que carga variables desde un archivo
.enval entorno de ejecución de Python, evitando que tengas que exportarlas a mano en cada sesión.
El .env suele contener información delicada: contraseñas de base de datos, claves de API, secretos de autenticación con servicios como Facebook Login. Si lo subes a Git, expones esos datos a todo el equipo y, peor aún, al público si el repositorio es abierto.
La regla práctica:
.env a tu .gitignore desde el primer commit..env.example con las llaves pero sin los valores reales.Una vez que dominas el flujo, las aplicaciones son muchas. Algunos ejemplos directos:
APP_MODE para cambiar comportamiento entre entornos.Esto te permite proteger la información crítica de tu aplicación y controlar quién tiene acceso a qué.
Este es justo el experimento que vale la pena hacer tú mismo. Crea una variable usando export en la terminal, luego define la misma variable en tu .env con un valor distinto y observa cuál toma prioridad cuando ejecutas la aplicación.
Entender ese orden de precedencia te va a ahorrar horas de debugging cuando una variable no tome el valor que esperas.
¿Qué variables sueles guardar en tu .env y cuáles dejas en el sistema operativo? Cuéntame tu setup en los comentarios.
de hecho, es recomendable poner en .gitignore, que ignore el .env
.gitignore
.env
esta bueno lo del .env .Pero si tu equipo para correr el programa necesita esas conexiones ? como haces para pasarle esas variables sin que las puedan ver ?
a git se puede subir un env.example con las variables que la aplicación solicita para facilitar su uso
Muy buena clase. La librería dotenv ya la conocía y la apliqué en un proyecto. Les comparto el código como ejemplo: es un archivo donde configuro la URL de la base de datos.
config.py
from os import environ
from dotenv import load_dotenv
load_dotenv()
class Setting:
DB_USER: str = environ.get("DB_USER")
DB_PASSWORD: str = environ.get("DB_PASSWORD")
DB_HOST: str = environ.get("DB_HOST")
DB_PORT: int = environ.get("DB_PORT")
DB_NAME: str = environ.get("DB_NAME")
@property
def DATABASE_URL(self) -> str:
return f"postgresql://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
setting = Setting()
.env
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_HOST=127.0.0.1
DB_PORT=9090
DB_NAME=your_db_name
¿Por qué hoy es mejor usar un gestor de secretos en vez de depender solo de archivos .env?
Porque garantiza seguridad, rotación de claves, control de acceso y sincronización automática entre equipos y ambientes, evitando filtraciones y errores humanos.
Ahora usan herramientas centralizadas como:
Alfredo Olmedo
GUSTAVO CHIAPPE
Luis Martinez
ProfesorLEONARD CUENCA
Emilio Sala
juan jose cardona gil
Adrian Lazzarini
Agustín Alberto Leiva
Iván Ozono
Luis Martinez
Profesorde hecho, es recomendable poner en .gitignore, que ignore el .env
.gitignore
.env
esta bueno lo del .env .Pero si tu equipo para correr el programa necesita esas conexiones ? como haces para pasarle esas variables sin que las puedan ver ?
La mejor manera que puedes usar es un password manager, si no tienes uno puedes usar: https://share.doppler.com/
Hola, ¡excelentes preguntas! Saludos.
Primero, un poco de contexto y experiencia sobre las variables de entorno:
Como bien se menciona, el archivo .env jamás se comparte. Está diseñado solo para trabajar en tu entorno local: te permite tener una configuración fácil, centralizada y homogénea, que son acciones clave para tu desarrollo.
Ahora, el desafío surge cuando desarrollamos en equipo. El manejo de las variables de entorno se convierte en un verdadero dolor de cabeza.
Dado que el .env no puede subirse a Git, se populariza el uso del .env.example. Este archivo es una maqueta o esqueleto que lista solo los nombres de las variables que se usan. Sin embargo, a pesar de tener esta estructura, el equipo termina compartiendo las claves reales por medios inseguros como Telegram, Slack o incluso correo electrónico.
¿Por qué ocurre esto? Imagina que llega un nuevo integrante al equipo. Le dan acceso al repositorio de Git, pero, adivina qué, el archivo .env está vacío. El nuevo desarrollador, lamentablemente, debe preguntar: "Oigan, ¿me comparten las variables?", usando dichos medios.
Lo comento por experiencia propia: sé que no es el lineamiento correcto, pero a menudo es el más rápido para poder comenzar a trabajar, especialmente cuando el proyecto es "para ayer".
Por esa razón, existen tecnologías y soluciones dedicadas a esto, como la que menciona el compañero: un Gestor de Secretos como Doppler.
> Aquí un Resumen
Implementación con un Gestor de Secretos (Doppler) 🛠️
Doppler, este servicio actúa como una fuente única de verdad para tus variables de entorno, permitiendo que tu equipo y tu aplicación accedan a ellas de manera segura.
Conceptos Clave de Doppler
Proyecto-API-Python).dev para desarrollo, staging para pruebas, prod para producción).Implementación Práctica en Python
En lugar de leer el archivo .env localmente, usas una herramienta de CLI de Doppler o su SDK para inyectar las variables de entorno directamente en el proceso de tu aplicación.
Paso a Paso
dev.
DATABASE_URL=postgres://user:password@host:port/dbnameComo lo hacemos
**Ejemplo Practico**
Este comando INYECTA las variables del entorno 'dev' de Doppler
En el proceso de ejecución de tu script Python.
```Bash doppler run -- python app.py
```
```Python import os # Tu código lee la variable del entorno (ahora inyectada por Doppler)
db_connection_string = os.environ.get("DATABASE_URL") if db_connection_string: print("Conexión de DB obtenida de forma segura.")
# Código para conectarse a la base de datos... else: print("Error: DATABASE_URL no encontrada.")
# Nota: Si el desarrollador NO tiene permiso en Doppler, # la variable no se inyecta, y el programa no puede ejecutarse.
# Esto garantiza el control de acceso. ```
a git se puede subir un env.example con las variables que la aplicación solicita para facilitar su uso
pero una mejor practica es usar un archivo nombrado requirements.txt en el cual se agregan las dependencias y su versión asi
Python == 3.12.3
pip==24.3.1
Django==5.0.9
pillow==11.0.0
y luego para crear un nuevo en otro dispositivos se usa
pip install -r requirements.txt
Ambos consejos son correctos pero se refieren a cosas distintas:
.env.example es para mostrar qué variables de entorno necesita la app (API keys, URLs, etc.) sin exponer los valores reales del .envrequirements.txt es para listar las dependencias de Python del proyecto (Django, Pillow, etc.)Uno maneja configuración sensible y el otro las librerías. El entorno virtual (venv) es el espacio aislado donde se instalan esas dependencias con pip install -r requirements.txt.
Muy buena clase. La librería dotenv ya la conocía y la apliqué en un proyecto. Les comparto el código como ejemplo: es un archivo donde configuro la URL de la base de datos.
config.py
from os import environ from dotenv import load_dotenv load_dotenv() class Setting: DB_USER: str = environ.get("DB_USER") DB_PASSWORD: str = environ.get("DB_PASSWORD") DB_HOST: str = environ.get("DB_HOST") DB_PORT: int = environ.get("DB_PORT") DB_NAME: str = environ.get("DB_NAME") @property def DATABASE_URL(self) -> str: return f"postgresql://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" setting = Setting()
.env
DB_USER=your_db_user DB_PASSWORD=your_db_password DB_HOST=127.0.0.1 DB_PORT=9090 DB_NAME=your_db_name
¿Por qué hoy es mejor usar un gestor de secretos en vez de depender solo de archivos .env?
Porque garantiza seguridad, rotación de claves, control de acceso y sincronización automática entre equipos y ambientes, evitando filtraciones y errores humanos.
Ahora usan herramientas centralizadas como:
Sí, idealmente nunca usar .env files en production.