Valider les paramètres d'environnement Python avant de lancer l'application
Différenciez les paramètres manquants et vides, analysez les ports et les booléens explicitement, et signalez les erreurs de configuration sans révéler les secrets.
Dans ce guide
La réponse courte
Lisez les paramètres d'environnement sous forme de chaînes, validez-les une fois avant de démarrer le travail de l'application, puis convertissez chaque paramètre selon un contrat explicite. Une valeur manquante, une valeur vide ou une valeur invalide peut nécessiter des réponses différentes. Ni os.getenv ni configparser ne définissent la priorité de configuration de votre application ni ne chargent automatiquement un fichier .env.
Analyser un port avec un contrat déclaré
L'exemple suivant de la bibliothèque standard accepte une chaîne ou None. Il utilise int pour la conversion en entier décimal et vérifie la plage inclusive 1 à 65535. Les messages fixes identifient le problème sans reproduire la valeur fournie. La validation de plage ne prouve pas que le port est disponible ni que le processus a les permissions nécessaires pour l'associer.
Interpréter les booléens de manière explicite
bool('false') est True car une chaîne non vide est vraie. À la place, normalisez une représentation textuelle prise en charge et recherchez-la dans une carte explicite. Vous pouvez accepter true, yes, on et 1 comme vrai, et false, no, off et 0 comme faux ; rejetez les autres chaînes plutôt que de permettre silencieusement une fonctionnalité.
ConfigParser.getboolean(section, option) propose de telles conversions pour les options dans un objet ConfigParser. Il ne convertit pas automatiquement une chaîne obtenue via os.getenv. Ce sont des interfaces distinctes.
def parse_port(raw):
if raw is None:
raise ValueError("PORT is missing")
if not isinstance(raw, str):
raise TypeError("PORT must be text")
if not raw.strip():
raise ValueError("PORT is empty")
try:
port = int(raw)
except ValueError:
raise ValueError("PORT must be an integer") from None
if not 1 <= port <= 65535:
raise ValueError("PORT is outside 1..65535")
return port
for sample in ("8080", None, "", "wrong", "65536"):
try:
print(parse_port(sample))
except ValueError as error:
print(error)Charger la configuration avant le démarrage
Gather les paramètres et validez-les avant de vous connecter aux bases de données, d'ouvrir une socket d'écoute ou de lancer des tâches en arrière-plan. Renvoyez une erreur de configuration claire au superviseur de processus. Attraper chaque erreur et continuer avec des valeurs par défaut supposées peut masquer un déploiement corrompu.
Après validation, conservez un objet de configuration avec les valeurs converties. Lire et parser à plusieurs reprises une valeur d'environnement à chaque requête est plus difficile à raisonner et peut entraîner des parties différentes de l'application utilisant des politiques différentes.
Définir la priorité dans votre propre application
Si une application utilise des arguments en ligne de commande, des variables d'environnement et un fichier INI, définissez quelle source l'emporte. Une politique possible est un argument fourni explicitement, puis une variable d'environnement présente, puis une option de fichier, puis une valeur par défaut documentée. Il s'agit d'un choix d'application, non d'un ordre intégré imposé par configparser.
ConfigParser peut lire des fichiers et effectuer des conversions d'options, mais il ne fusionne pas automatiquement l'environnement système ou les arguments en ligne de commande. Ne décrivez pas un fichier .env comme déjà chargé à moins qu'un lanceur ou une bibliothèque explicite ne l'ait chargé.
Signaler le nom du paramètre sans sa valeur secrète
Enregistrez le nom du paramètre et la catégorie d'erreur, comme DATABASE_URL est manquant, sans inclure la chaîne de connexion. Un jeton peut apparaître dans une URL, pas seulement dans un paramètre dont le nom contient PASSWORD. Évitez de déverser toutes les variables d'environnement lors du diagnostic du démarrage.
Pour un paramètre non secret, décidez séparément si l'affichage de sa valeur est approprié. L'exemple de parseur utilise des messages d'erreur fixes pour rendre cette distinction claire.
Comprendre ce que modifie la configuration du processus
os.environ représente l'environnement actuel du processus et est capturé lors de l'importation de os. Modifier cette variable change ce processus et peut affecter les processus enfants qu'il lance ; elle ne reconfigure pas un processus étranger déjà en cours d'exécution. Redémarrez ou reconfigurez explicitement le service concerné lorsque vous modifiez ses paramètres de déploiement.
Le comportement du système d'exploitation varie, notamment en ce qui concerne la casse des noms sous Windows. L'interface d'environnement en bytes est disponible uniquement là où os.supports_bytes_environ le permet. Utilisez l'interface chaîne normale pour la configuration ordinaire de l'application, sauf si une exigence de plateforme documentée l'exige.
Séparer une variable absente d'une variable vide
Sans argument par défaut, os.getenv('PORT') retourne None lorsque PORT est absente. Si la variable existe avec une valeur vide, elle retourne une chaîne vide. Vérifiez ces états séparément lorsqu'ils ont des significations différentes. Par exemple, un port optionnel absent peut utiliser une valeur par défaut, tandis qu'une variable requise explicitement vide devrait produire une erreur de configuration.
Évitez de choisir une valeur par défaut avec raw ou default_value à moins que cette politique ne traite intentionnellement toutes les chaînes vides comme absentes. Lisez un paramètre une seule fois dans une variable locale afin que le traitement, le rapport d'erreur et le démarrage ultérieur de l'application utilisent la même valeur.
Lire le résultat illustratif correctement
En suivant les entrées fournies, on obtient 8080, puis PORT est manquant, PORT est vide, PORT doit être un entier, et PORT est en dehors de 1..65535. Ce sont les résultats attendus de la logique affichée, non un rapport d'un test de déploiement exécuté. int accepte également certaines formes textuelles comme l'espace autour ; ajoutez une règle lexicale plus stricte si votre contrat d'application en a besoin.
Pour le processus réel, importez os et passez os.getenv('PORT') à la fonction. Gardez toute politique de choix d'une valeur par défaut optionnelle en dehors du parseur, afin de savoir clairement si une variable requise manquante doit arrêter le démarrage.
Points à vérifier
- Les paramètres manquants, vides, malformés ou hors plage ont des résultats explicites.
- L'application définit la priorité des sources plutôt que de supposer que le parseur fusionne les sources.
- La conversion booléenne n'utilise pas bool sur une chaîne brute d'environnement.
- Les diagnostics identifient le paramètre sans afficher les identifiants.
Champ d’application
Ce guide couvre la configuration du processus à l'aide de bibliothèques standard. Il n'implémente pas de chargeur de fichier .env, ne vérifie pas la disponibilité des ports réseau ni les autorisations de déploiement. Les exigences spécifiques à l'application peuvent nécessiter une validation supplémentaire.