Seite 1 von 2
WSGI/Django-settings-Modul: kein Import möglich
Verfasst: Donnerstag 19. November 2009, 13:55
von Dauerbaustelle
Hallo Jungens,
in einem django-settings-Modul habe ich einen Import drin (sowas wie "from localsettings import *" oder so). Der schlägt leider fehlt, wenn ich die Seite mit WSGI rennen lasse. Auf dem Developmentserver funktioniert es.
(Das heißt, die settings.py-Datei wird schon importiert, nur alle Imports, die ich daraus mache, schlagen fehl. Auch wenn ich die "force-relative"-Art nutze, also "from .localsettings import *" funktioniert es nicht.)
WSGI-Konfigurationsdatei folgt, sagt wenn ihr noch was braucht.
$ cat myproject.wsgi
Code: Alles auswählen
import os, sys
sys.path.append('/path/to/myproject')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Danke für alle Tipps :-)
Verfasst: Donnerstag 19. November 2009, 15:01
von ms4py
Dein Projekt liegt nicht wirklich unter
?!
Damit dürfte sich die Frage dann auch erledigt haben

Verfasst: Donnerstag 19. November 2009, 15:56
von jens
Da wir schon mal beim Thema imports sind: Ich frage mich gerade wie man am besten imports in django projekten gestalten? Absolut oder relativ?
Verfasst: Donnerstag 19. November 2009, 16:25
von Dauerbaustelle
ice2k3 hat geschrieben:Dein Projekt liegt nicht wirklich unter
?!
Doch, tut es. Wie sonst sollte denn der import von myproject.settings funktionieren?
Verfasst: Donnerstag 19. November 2009, 16:44
von apollo13
jens hat geschrieben:Da wir schon mal beim Thema imports sind: Ich frage mich gerade wie man am besten imports in django projekten gestalten? Absolut oder relativ?
Etwas genauer bitte?! meinst du mit absolut den Projektnamen inkludieren oder was?
Verfasst: Donnerstag 19. November 2009, 18:35
von ms4py
Dauerbaustelle hat geschrieben:ice2k3 hat geschrieben:Dein Projekt liegt nicht wirklich unter
?!
Doch, tut es. Wie sonst sollte denn der import von myproject.settings funktionieren?
Als Pfad sollte normalerweise der Überordner des Projektes angegeben werden. Außerdem ist der Pfad "/path/to" eigentlich nur als Beispiel gedacht und sollte nicht wirklich so angelegt werden...

Verfasst: Freitag 20. November 2009, 13:54
von Dauerbaustelle
ice2k3 hat geschrieben:Als Pfad sollte normalerweise der Überordner des Projektes angegeben werden. Außerdem ist der Pfad "/path/to" eigentlich nur als Beispiel gedacht und sollte nicht wirklich so angelegt werden... ;)
Puh, das ist mir schon klar. Das "/path/to" kommt im Übrigen von mir, das Django-Projekt ist auch im sys.path. Wie bereits mehrfach gesagt, der Import des settings-Module funktioniert einwandfrei, nur alle dort drin ausgeführten Imports schlagen fehl.
Verfasst: Freitag 20. November 2009, 14:03
von jens
Setzt doch mal das in die settings.py:
Verfasst: Freitag 20. November 2009, 14:45
von Dauerbaustelle
Der Pfad ist im sys.path, CWD ist /.
Hier mal der wichtige Teil von Traceback:
Code: Alles auswählen
ImportError: Could not import settings 'myproject.settings' (Is it on sys.path? Does it have syntax errors?): No module named localsettings
"localsettings.py" existiert aber :-)
Verfasst: Freitag 20. November 2009, 14:47
von jens
Stimmen Datei/Verzeichnisrechte?
Verfasst: Freitag 20. November 2009, 15:04
von Dauerbaustelle
Nahaain, verdammt! Danke!
Ich wollte den Inhalt der Datei vor Server-Mitbenutzern schützen, weil da Passwörter drin sind. Nun muss ich mir was suchen, das für den nginx/WSGI-Nutzer zu erlauben, aber für den Rest zu verbieten. Mal sehen. Vielleicht ändere ich einfach den Besitzer.
Verfasst: Montag 23. November 2009, 16:23
von Dauerbaustelle
Hm, jetzt hab ich das nochmal eine Weile lang debuggt, aber ich weiß immer noch nicht woran es liegt. Also "settings" funktioniert jetzt zu includen, aber im weiteren Verlauf der Ausführung der django-Skripte bricht es ab mit einem `ImportError`: "No module named myapp".
Code: Alles auswählen
$ ls -l
total 88
-rw-r--r-- 1 myuser myuser 55296 2009-11-23 16:14 db.sql
drwxr-xr-x 6 myuser myuser 4096 2009-11-23 16:13 myapp
-rw-r--r-- 1 myuser myuser 0 2009-11-23 16:13 __init__.py
-rwxr-xr-x 1 myuser myuser 542 2009-11-23 16:13 manage.py
-rw-r--r-- 1 myuser myuser 2486 2009-11-23 16:15 settings.py
-rw-r--r-- 1 myuser myuser 542 2009-11-23 16:13 urls.py
Der Projekt-Ordner hat rwxr-xr-x.
Es scheint, als füge django `myapp` nicht korrekt zum sys.path hinzu. "myapp" ist natürlich in der settings-Datei eingetragen.
Ich versteh's nicht :-(
Verfasst: Montag 23. November 2009, 16:27
von nemomuk
Die Benutzerrechte der Dateien in myapp?
Verfasst: Montag 23. November 2009, 17:08
von ms4py
ice2k3 hat geschrieben:Als Pfad sollte normalerweise der Überordner des Projektes angegeben werden.
Oder ist das inzwischen korrigiert?
Verfasst: Montag 23. November 2009, 18:03
von Dauerbaustelle
ice2k3 hat geschrieben:Oder ist das inzwischen korrigiert?
Es war noch nie falsch, es gab da nichts zu korrigieren. (Edit: Im ersten Post sollte das natürlich /path/to/ heißen. Tut mir Leid.)
SchneiderWeisse hat geschrieben:Die Benutzerrechte der Dateien in myapp?
Alle rw-r--r--, alle Unterordner rwxr-xr-x, __init__.py in myapp gibts auch.
Wenn ich die Django-Shell nutze, funktioniert das Importieren auch.
Code: Alles auswählen
$ python /path/to/myproject/manage.py shell
In [1]: import myapp
In [2]: myapp
Out[2]: <module 'myapp' from '/path/to/myproject/myapp/__init__.pyc'>
Verfasst: Montag 23. November 2009, 20:13
von jens
Dauerbaustelle hat geschrieben:Wenn ich die Django-Shell nutze, funktioniert das Importieren auch.
Startest du evtl. die shell mit einem anderen User, als hinterher von Apache?
Verfasst: Montag 23. November 2009, 20:48
von Dauerbaustelle
jens hat geschrieben:Startest du evtl. die shell mit einem anderen User, als hinterher von Apache?
Bei mir läuft Nginx mit mod_wsgi, aber ja, die WSGI-Prozesse laufen afaik unter dem nginx-User. Allerdings habe ich a) bei keinem anderen Django-Projekt diese Probleme und b) funktionieren die Imports in derShell mit jedem anderen Nutzer.
Vielleicht habe ich auch in meinen Settings Murks gemacht?
Ihr könnt ja mal reinschauen.
Verfasst: Montag 23. November 2009, 21:25
von ms4py
In der settings vom Tutorial sind folgende Dinge anders:
``mysite`` ist in diesem Fall dein ``myproject``
Verfasst: Dienstag 24. November 2009, 07:55
von jens
Vielleicht hilft dir das weiter:
http://code.djangoproject.com/ticket/11667 Ich weiß allerdings jetzt nicht, ob das importieren der settings mit abgedeckt ist...
Auf jeden Fall ist es IMHO dumm, das django an einigen Stellen keinen Vollständigen traceback hinterläßt. Siehe auch:
http://jensdiemer.de/de/Blog/23/django- ... me-foobar/
Dein
from geheim import * würde ich ehr ganz unten in die settings.py schreiben, damit man alle vorgaben "überschreiben" kann. Außerdem wäre, statt einem schlichten
print e, sowas hilfreicher:
Code: Alles auswählen
try:
from geheim import *
except ImportError, e:
import traceback
print traceback.format_exc()
Verfasst: Dienstag 24. November 2009, 11:45
von ms4py
Hier noch die Erklärung zu meiner Antwort oben:
http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango hat geschrieben:If you have been using the Django development server and have made use of the fact that it is possible when doing explicit imports, or when referencing modules in 'urls.py', to leave out the name of the site and use a relative module path, you will also need to add to sys.path the path to the site package directory itself.
sys.path.append('/usr/local/django')
sys.path.append('/usr/local/django/mysite')
Du kannst also entweder deine Settings korrigieren oder das WSGI.