Dans le développement logiciel moderne, la gestion des configurations est une problématique centrale. Les applications Python, qu’il s’agisse de scripts simples ou de projets complexes comme des API Flask ou Django, nécessitent souvent des paramètres spécifiques : clés API, identifiants de bases de données, URLs de services externes, etc. Stocker ces informations directement dans le code source est une pratique risquée, tant pour des raisons de sécurité que de flexibilité.
C’est ici que les fichiers .env entrent en jeu, offrant une solution élégante pour gérer les variables d’environnement. Cet article va vous expliquer le fonctionnement des fichiers .env en Python, les outils associés comme python-dotenv, et les bonnes pratiques pour les intégrer efficacement dans vos projets.
Qu’est-ce qu’un fichier .env ?
Un fichier .env (abréviation de « environnement ») est un fichier texte simple utilisé pour stocker des variables d’environnement sous forme de paires clé-valeur. Il est généralement placé à la racine d’un projet et n’a pas d’extension spécifique au-delà de .env. Voici un exemple typique de contenu :
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
API_KEY=xyz123456789
DEBUG_MODE=true
Ces variables peuvent ensuite être lues par une application pour configurer son comportement sans modifier le code source. L’idée est de séparer la configuration du code. Je vous avais déjà parlé de ces fichiers dans mes articles liés à Laravel. La maîtrise du fichier .env est indispensable pour installer Laravel sur un serveur Linux ou encore pour utiliser un SMTP externe en PHP pour assurer la délivrabilité de ses mails.
Mais comment Python accède-t-il à ces variables ? Par défaut, Python peut lire les variables d’environnement définies au niveau du système via le module intégré os. Cependant, les fichiers .env ne sont pas chargés automatiquement par le système d’exploitation. C’est là qu’interviennent des bibliothèques comme python-dotenv, qui simplifient leur intégration dans vos projets.
Installer python-dotenv
La bibliothèque python-dotenv est l’outil de référence pour charger les variables d’un fichier .env dans l’environnement Python. Elle est facile à installer via pip :
pip install python-dotenv
Une fois installée, voici comment l’utiliser dans Python, par exemple pour le fichier de configuration à la base de données de votre projet :
# database.py
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from dotenv import load_dotenv
# Charger les variables d'environnement depuis le fichier .env
load_dotenv()
# Charger les informations de connexion depuis les variables d'environnement
DB_HOST = os.getenv("DB_HOST", "localhost")
DB_PORT = os.getenv("DB_PORT", "3306") # Valeur par défaut si non spécifiée
DB_USER = os.getenv("DB_USERNAME", "user")
DB_PASSWORD = os.getenv("DB_PASSWORD", "password")
DB_NAME = os.getenv("DB_DATABASE", "db_name")
# Construire l'URL de connexion à la base de données
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
# Créer l'engine SQLAlchemy
engine = create_engine(SQLALCHEMY_DATABASE_URL, echo=False)
# Configurer la session
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Déclarer une base pour les modèles ORM
Base = declarative_base()
J’aurai l’occasion de revenir sur l’utilisation d’une base de données avec Python et SQLAlchemy dans un futur article, car ce n’est pas le sujet ici. C’est vraiment pour l’exemple.
La syntaxe d’un fichier .env
La syntaxe d’un fichier .env est relativement simple. Chaque ligne du fichier contient une variable d’environnement sous la forme NOM=VALEUR. Les variables sont bien évidemment libres dont vous faites ce que vous voulez. Voici quelques règles essentielles à respecter :
- Pas d’espaces autour du signe
=
:API_KEY=12345
est correct, tandis queAPI_KEY = 12345
peut poser problème. - Les valeurs contenant des espaces ou des caractères spéciaux doivent être entre guillemets : SECRET_KEY= »Ma clé secrète avec espaces ».
- Les commentaires commencent par un # et ne sont pas interprétés : # Clé API pour l’accès au service externe API_KEY=123456789
- Les variables booléennes sont généralement stockées sous forme de chaînes (true ou false) et doivent être interprétées correctement dans le code.
Histoire de vous donner un exemple concret car c’est mieux. Pour correspondre à l’exemple Python présenté précédemment, voici un fichier .env
:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=zonetuto_db
DB_USERNAME=root
DB_PASSWORD=SuP3rpASS!
Dans le script Python, ces variables seront chargées grâce à dotenv et accessibles via os.getenv()
.
La sécurité et la gestion des fichiers .env
Un aspect crucial des fichiers .env est leur sécurité. Comme ils contiennent des informations sensibles (clés API, mots de passe, identifiants de bases de données), ils ne doivent jamais être inclus dans un système de contrôle de version comme Git. Il faut donc exclure le fichier .env du suivi de Git. Pour cela, ajoutez simplement la ligne suivante à votre fichier .gitignore à la racine de votre projet qui utilise Git :
.env
Cela empêchera Git de suivre les modifications de ce fichier, évitant ainsi toute fuite accidentelle d’informations sensibles.
Surcharge des variables .env dans le code Python
Il est possible de définir des valeurs par défaut directement dans le code, ce qui permet d’assurer un fonctionnement même si certaines variables sont absentes du fichier .env.
DB_HOST = os.getenv("DB_HOST", "localhost") # Si DB_HOST n’est pas défini, "localhost" est utilisé
Cela garantit que l’application ne plante pas en cas d’absence de certaines variables essentielles.
Utilisation de plusieurs fichiers .env en Python avec dotenv
Dans certains projets, il peut être utile de disposer de plusieurs fichiers .env
, par exemple :
.env
: Fichier par défaut.env.development
: Fichier spécifique au développement.env.production
: Fichier spécifique à la production
La bibliothèque dotenv
permet de charger un fichier .env
spécifique en fonction du contexte. Par exemple :
from dotenv import load_dotenv
import os
# Charger un fichier spécifique
env_file = ".env.development" if os.getenv("ENV") == "development" else ".env.production"
load_dotenv(env_file)
Cela permet d’avoir des configurations adaptées sans devoir modifier le code.
L’utilisation des fichiers .env
en Python est une solution efficace pour gérer les configurations et sécuriser les informations sensibles. Grâce à python-dotenv
, vous pouvez facilement intégrer ces fichiers dans vos projets et adopter des pratiques sécurisées comme l’exclusion de .env
dans Git. En appliquant ces bonnes pratiques, vous optimisez la gestion de vos paramètres de configuration, garantissez la flexibilité de votre code et renforcez la sécurité de vos applications.