Impossible d'utiliser les variables d'environnement pour les paramètres de Django
En essayant de trouver un endroit pour stocker et sauvegarder des paramètres au-delà de settings.py et la base de données, j'ai utilisé un environnement.json pour les variables d'environnement. - Je importer dans ces settings.py.
Mon problème est que lorsque je tente de modifier ou de stocker de nouvelles valeurs dans mon environnement, env
settings.py
ne remarque pas le changement - peut-être parce que le temps et le nombre de fois settings.py est lu par Django.
Est-il un moyen que je serais capable d'utiliser mes variables d'environnement de la façon dont je le veux, comme a tenté ci-dessous?
# settings.py
import json
with open('/home/dotcloud/environment.json') as f:
env = json.load(f)
EMAIL_HOST = env.get('EMAIL_PORT', '500')
# views.py
import json
def site_configuration(request):
with open('/home/dotcloud/environment.json') as f:
env = json.load(f)
if request.method == 'POST':
os.environ['EMAIL_PORT'] = request.POST['email_port']
return render(request, ...)
# python manage.py shell demo
>>> import json
>>> with open('/home/dotcloud/environment.json') as f:
... env = json.load(f)
...
>>> project_settings.EMAIL_PORT
'500'
>>> env['EMAIL_PORT']
Traceback (most recent call last):
File "<console>", line 1, in <module>
KeyError: 'EMAIL_PORT'
>>> env['EMAIL_PORT'] = "123"
>>> env['EMAIL_PORT']
'123'
>>> project_settings.EMAIL_PORT
'500'
>>> project_settings.EMAIL_PORT == env['EMAIL_PORT']
False'
Et si non, comment pourrais-je stocker changeant les paramètres sont récupérés par settings.py
quelque part dans mon projet Django?
source d'informationauteur Kiwi
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être regarder dans
foreman
(GitHub) ouhoncho
(GitHub). Ces deux recherchez un.env
fichier dans votre répertoire courant à partir de laquelle la charge locale des variables d'environnement.Mon
.env
ressemble à ceci pour la plupart des projets (j'utilise dj-base de données-url de la base de données de configuration):Dans votre
settings.py
fichier, vous pouvez charger ces paramètres à partir deos.environ
comme ceci:Si il y a des paramètres requis, vous pouvez
assert
leur présence avant d'essayer de les définir:J'ai été en utilisant cette méthode de traitement des paramètres locaux pour les derniers projets que j'ai commencé et je pense que cela fonctionne vraiment bien. Une mise en garde est à jamais commettre votre
.env
à la source de contrôle. Ce sont des paramètres locaux qui existent uniquement pour la configuration en cours et doit être recréé pour un environnement différent.Je vois que la question a été modifiée légèrement, la réponse d'origine sont encore en dessous mais celui-ci est un peu différent réponse:
Tout d'abord, assurez-vous d'utiliser le droit settings.py (
print 'This file is being loaded'
devrait faire l'affaire).Seconde, personnellement, je déconseillerais l'utilisation des fichiers json pour la config, car il est moins dynamique que les fichiers Python, mais il devrait fonctionner indépendamment.
Mon recommandé moyen de faire quelque chose comme ceci:
base_settings.py
fichier avec les paramètres standardsettings.py
qui seront vos paramètres par défaut de l'importation. Ce fichier doit avoir unefrom base_settings import *
en haut à hériter les paramètres de base.dotcloud_settings.py
par exemple, il suffit d'ajouter lefrom dotcloud_settings import settings
(oubase_settings
) et de définir la variable d'environnementDJANGO_SETTINGS_MODULE
àdotcloud_settings
ouyour_project.dotcloud_settings
en fonction de votre configuration.Notez que vous devez être très prudent avec l'importation de Django modules à partir de ces fichiers de paramètres. Si aucun module n'a
from django.conf import settings
il cessera de l'analyse de vos paramètres à partir de ce point.Que l'utilisation des fichiers json, à peu près le même principe, bien sûr:
django.conf.settings
iciFaire toutes les variables à l'intérieur de votre fichier json global de votre fichier de paramètres:
importation json
avec open('/home/dotcloud/environnement.json') as f:
env = json.charge(f)
# Un peu de bidouille à faire toutes les variables à l'intérieur de notre env mondiale
globals().mise à jour(env)
Peu importe si, je vous recommande de tourner autour et de laisser les paramètres d'importation de fichier ce module à la place.
Aussi, Django n'écoute pas les variables d'environnement par défaut (en plus de l'
DJANGO_SETTINGS_MODULE
façon à ce que pourrait être le problème.