2016-07-29 1 views
0

background

J'essaie de diviser mes paramètres par environnement en suivant these instructions.Module de paramètres Django non trouvé

Maintenant, je voudrais simplement exécuter ma commande de test comme ceci:

./run ./manage.py test --settings=bx.settings.local 

actuellement la ligne suivante

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bx.settings") 

est disponible dans ces fichiers

manage.py 
wsgi.py 

et je supprimé (car il est censé être lu à partir de la ligne de commande à la place).

J'ai aussi créé un dossier settings dans mon application et bx ajouté les fichiers

__init__.py 
base.py 
local.py 

à elle.


notes

Note: le fichier run est la suivante:

#!/usr/bin/env bash 
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 
docker run \ 
    --env "PATH=/beneple/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \ 
    --link beneple_db:db \ 
    -v $DIR:/beneple \ 
    -t -i --rm \ 
    beneple/beneple \ 
    [email protected] 


problème

quand je lance la commande

./run ./manage.py test --settings=bx.settings.local 

Je reçois cette erreur

File "/beneple/bx/org/serializers.py", line 10, in <module> 
    from bx.settings import DOMAIN 
ImportError: cannot import name DOMAIN 

à serializers.py:10, nous avons obtenu cette

from bx.settings import DOMAIN 

donc je remplacé bx.settings avec

from django.conf import settings 
from settings import DOMAIN 

et à la place que j'ai eu cette erreur :

File "/beneple/bx/org/serializers.py", line 12, in <module> 
    from settings import DOMAIN 
ImportError: No module named settings 

débogage

la partie étrange est que si je mets un point d'arrêt après from django.conf import settings et tapez:

ipdb> print(settings) 
<Settings "bx.settings.local"> 
ipdb> settings.DOMAIN 
'http://localhost:8000' 

Je suis confus pourquoi il ne reconnaît pas les paramètres ici en tant que module?


mise à jour

J'ai remarqué que mon répertoire de modèles changé.Dans mes fichier de paramètres que j'ai

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
.. 
TEMPLATES = [{ 
    'DIRS': [os.path.join(BASE_DIR, 'templates')],.. 

remarquer cependant la différence de la valeur de settings.TEMPLATES[0]['DIRS'] entre l'ancienne et nouvelle façon:

ancienne:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bx.settings") 
['/beneple/templates'] 

nouvelle façon :

./run ./manage.py test --settings=bx.settings.local 
['/beneple/bx/templates'] 

pourquoi est-ce le cas? et comment puis-je (par programmation) rendre la nouvelle manière sortie le même résultat que l'ancien?

+0

Vous ne pas importer les paramètres directement, mais leur accès comme celui-ci de 'Settings' import django.conf puis' settings.DOMAIN'. –

Répondre

1

Une fois que vous avez importé les paramètres de django.conf, vous ne devez plus les importer depuis les paramètres; vous avez déjà l'objet settings, vous pouvez simplement vous référer à settings.DOMAIN directement.

+0

c'est intéressant ... mais alors pourquoi cela a-t-il fonctionné avant quand j'avais '' de bx.settings import DOMAIN'? A-t-il traité 'bx.settings' comme un module plutôt qu'un objet? et si oui .. pourquoi? – abbood

+0

Non ça n'a rien à voir avec ça et je ne suis pas sûr de ce que vous êtes confus. Avant d'importer le DOMAIN directement depuis le module; mais maintenant vous essayez d'importer le module, puis référencez ce module à nouveau dans une instruction import. –

+0

ok j'ai fait une mise à jour à ma question (re templates) .. dernière mise à jour je promets! – abbood

1

from settings import DOMAIN essaie de charger le module settings depuis PYTHONPATH, pas depuis le module que vous avez déjà importé.

Vous pouvez simplement faire ce qui suit: DOMAIN = settings.DOMAIN