2016-07-29 10 views
0

Hintergrund

Ich versuche, meine Einstellungen von Umgebung zu spalten folgenden these instructions gefunden.Django-Einstellungen Modul von nicht

Nun möchte Ich mag einfach wie so meinen Test-Befehl ausführen:

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

derzeit die folgende Zeile

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

in diesen Dateien verfügbar ist

manage.py 
wsgi.py 

und so i entfernt es (da es stattdessen von der Befehlszeile gelesen werden soll).

Ich habe auch einen settings Ordner in meinem bx App und hinzugefügt, um die Dateien

__init__.py 
base.py 
local.py 

zu.


Hinweise

Anmerkung: die run Datei ist dies:

#!/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] 


Problem

, wenn ich den Befehl

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

ich diesen Fehler

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

in serializers.py:10 bekommen, haben wir diese

from bx.settings import DOMAIN 

so ersetzt i bx.settings mit

from django.conf import settings 
from settings import DOMAIN 

und stattdessen bekam ich diesen Fehler :

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

Debuggen

der seltsame Teil ist, dass, wenn ich nach from django.conf import settings einen Haltepunkt setzen, und geben Sie die folgenden:

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

Ich bin verwirrt, warum es keine Einstellungen hier als Modul zu erkennen?


Update

Ich bemerkte, dass meine Vorlagen Verzeichnis geändert.In meinen Einstellungen, die ich

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

jedoch bemerken den Unterschied im Wert der settings.TEMPLATES[0]['DIRS'] zwischen der alten Art und Weise und neue Art und Weise Datei haben:

alte Art und Weise:

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

neue Art und Weise :

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

Warum ist das der Fall? und wie mache ich (programmatisch) den neuen Weg das gleiche Ergebnis wie das alte?

+0

Sie importieren die Einstellungen nicht direkt, sondern sie so Zugang von 'django.conf Import Einstellungen' dann' settings.DOMAIN'. –

Antwort

1

Sobald Sie Einstellungen von django.conf importiert haben, müssen Sie nicht erneut aus den Einstellungen importieren; Sie haben bereits das Einstellungsobjekt, Sie können direkt auf settings.DOMAIN verweisen.

+0

das ist interessant .. aber warum hat es vorher funktioniert, als ich 'von bx.settings importieren DOMAIN' hatte? behandelte es "bx.settings" als Modul und nicht als Objekt? und wenn ja ... warum? – abbood

+0

Nein, das hat nichts damit zu tun und ich bin mir nicht sicher, worüber du verwirrt bist. Bevor Sie DOMAIN direkt vom Modul importiert haben; Jetzt versuchen Sie jedoch, das Modul zu importieren, und verweisen Sie dann in einer import-Anweisung erneut auf dieses Modul. –

+0

ok ich habe ein update zu meiner frage gemacht (re templates) .. letztes update ich verspreche es! – abbood

1

from settings import DOMAIN versucht, Modul settings von PYTHONPATH zu laden, nicht von dem Modul, das Sie bereits importiert haben.

könnten Sie tun nur die folgenden: DOMAIN = settings.DOMAIN