2017-06-15 1 views
2

Django s'attend à ce que vous utilisiez des variables d'environnement dans settings.py pour s'adapter à plusieurs environnements (par exemple local, heroku, AWS).Paramètres Django: déclenchez KeyError, augmentez ImproperlyConfigured ou utilisez les valeurs par défaut?

Je suppose que je devrais définir -par exemple- le nom d'utilisateur du DB dans une variable d'environnement DB_USERNAME. Comment dois-je le lire?

import os 
DB_USERNAME = os.environ['DB_USERNAME'] 
DB_USERNAME = os.environ.get('DB_USERNAME') 
DB_USERNAME = os.environ.get('DB_USERNAME', 'john') 

Dois-je capturer l'KeyError et élever moi-même ImproperlyConfigured? Je préfère faire arrêter l'application plutôt que de l'exécuter en utilisant des paramètres incorrects (par défaut, les gens oubliant de définir une variable, etc).

Dans le cas des valeurs par défaut, il peut même arriver que John existe à la fois loaclly et à distance, mais avec des autorisations différentes. Ça n'a pas l'air très robuste.

+0

Ne pensez-vous pas son une mauvaise idée d'avoir votre nom de DB dans votre système d'exploitation variable env? –

+0

son nom d'utilisateur db pas le nom db –

Répondre

2

Je suggérerais une approche différente de ce que vous faites.

J'utilise le processus suivant:

  1. Créer un fichier .env ou .ini avec vos variables d'environnement dans ce:

    DB_USERNAME=myDB 
    A_NUMBER=1 
    ALLOWED_HOSTS=localhost, 127.0.0.1, my_host 
    DEBUG=False 
    MY_DJANGO_KEY=no_peeking_this_is_secret 
    
  2. Utilisez decouple.config -qui fera votre vie easier- à lire vous .env/.ini fichier:

    sur settings.py:

    from decouple import Csv, config 
    
    DEBUG = config('DEBUG', cast=bool, default=True) 
    A_NUMBER = config('A_NUMBER') # No cast needed! 
    ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv(), default='') 
    ... 
    

Cela vous permettra d'avoir plusieurs .env ou .ini fichiers pour chacun de vos configurations possibles et vous ne serez pas à vous soucier de mélanger des autorisations etc.

Enfin, je tendre à utiliser les valeurs par défaut avec les plus faibles tolérances possibles (ex. regarde mes hôtes autorisés par défaut qui est une chaîne vide).
Mais s'il existe une variable très importante qui doit être réglé correctement, alors:

  • La méthode config() soulèvera un UndefinedValueError si une variable est définie et aucun défaut sont définis.

  • On peut donc créer un bloc try:... except: de prévoir que:

    try: 
        SUPER_IMPORTANT_VAR = config('SUPER_IMPORTANT_VAR') 
    except UndefinedValueError: 
        print('Hey!! You forgot to set SUPER_IMPORTANT_VAR!!') 
    
+0

merci! plutôt que de mélanger les permissions (liées à l'exemple de mon utilisateur jean), j'étais préoccupé par le fait que les erreurs par défaut masquaient de vraies erreurs. Si vous utilisez default = '' dans les hôtes autorisés, le site ne fonctionnera pas et vous remarquerez, mais cela devrait-il être plus explicite en élevant une erreur ImproperlyConfigured err? Je pense à une URL redis, un préfixe de cache, une taille de pagination, ou quelque chose qui pourrait ne pas être utilisé plus tard. –

+0

Si vous avez quelque chose que vous voulez absolument être une variable set, alors vous pouvez faire: SUPER_IMPORTANT_VAR = config ('SUPER_IMPORTANT_VAR') 'qui, si la variable est indéfinie, déclenchera un' UndefinedValueError'! Je vais éditer ma réponse :) –

+0

ah je vois! oui, je voulais me concentrer sur le rendre robuste, échouer tôt et éviter un comportement inattendu ou des erreurs accidentelles plutôt que l'origine de cette valeur. –