2011-08-03 2 views
0

J'essaie de personnaliser l'intégration des applications dans un projet Django générique. La question est de savoir comment les fichiers de configuration des applications peuvent être importés dans le projet settings.py, afin de garder les paramètres spécifiques de l'application bien séparés de ceux de Django. Par exemple:Problème d'espaces de noms dans settings.py

settings.py

# Django configuration settings... 
DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': 'cms' 
} 
# a bunch of other settings 

# apps overridings and new settings 
from settings_myapp import * 

settings_myapp.py

from settings import DATABASES 

DATABASES['cms'] = { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': 'cms' 
} 

Jusqu'à présent, si bon. Lors de l'exécution dans les paramètres Django, le dictionnaire DATABASE reflète les modifications apportées par l'application. Mais que faire si l'application veut ajouter un nouveau nom dans l'espace de nom externe? Ajout NEW_SETTING = True dans myapp_settings et deux déclarations d'impression à la fin de settings.py, je reçois ceci:

$ python settings.py 
{'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'default'}} 
Traceback (most recent call last): 
    File "settings.py", line 8, in <module> 
    from settings_myapp import * 
    File "~/settings_myapp.py", line 1, in <module> 
    from settings import DATABASES 
    File "~/settings.py", line 10, in <module> 
    print NEW_SETTING 
NameError: name 'NEW_SETTING' is not defined 

Comment puis-je éviter l'importation circulaire et obtenir la chose faite?

Je pense qu'il me manque un concept de base de Python ici, j'ai donné le contexte de Django de toute façon parce que j'apprécierais aussi différentes solutions pour atteindre la cible des paramètres séparés.

Répondre

1

C'est l'un de ces cas où execfile('settings_myapp.py') dans le fichier principal settings pourrait être une bonne idée, puisque ce que vous voulez vraiment faire, c'est exécuter du code dans le contexte actuel.

Il suffit de sortir le import de settings_myapp.py et il devrait fonctionner correctement. Edit: voulait ajouter que execfile() a été supprimé de Python 3; utiliser exec(open(fn).read()).

+0

+1 Votre solution a pour effet de fusionner les espaces de noms, résolvant parfaitement le problème que j'ai proposé. – Paolo

Questions connexes