WSGI/Django-settings-Modul: kein Import möglich

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :-)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dein Projekt liegt nicht wirklich unter

Code: Alles auswählen

'/path/to/myproject'
?!
Damit dürfte sich die Frage dann auch erledigt haben ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da wir schon mal beim Thema imports sind: Ich frage mich gerade wie man am besten imports in django projekten gestalten? Absolut oder relativ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

ice2k3 hat geschrieben:Dein Projekt liegt nicht wirklich unter

Code: Alles auswählen

'/path/to/myproject'
?!
Doch, tut es. Wie sonst sollte denn der import von myproject.settings funktionieren?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dauerbaustelle hat geschrieben:
ice2k3 hat geschrieben:Dein Projekt liegt nicht wirklich unter

Code: Alles auswählen

'/path/to/myproject'
?!
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... ;)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Setzt doch mal das in die settings.py:

Code: Alles auswählen

import os, sys
print os.getcwd()
print sys.path

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Stimmen Datei/Verzeichnisrechte?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :-(
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Die Benutzerrechte der Dateien in myapp?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

ice2k3 hat geschrieben:Als Pfad sollte normalerweise der Überordner des Projektes angegeben werden.

Code: Alles auswählen

sys.path.append('/path/to')
Oder ist das inzwischen korrigiert?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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'>
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

In der settings vom Tutorial sind folgende Dinge anders:

Code: Alles auswählen

ROOT_URLCONF = 'mysite.urls'

Code: Alles auswählen

INSTALLED_APPS = (
    ...
    'mysite.polls',
)
``mysite`` ist in diesem Fall dein ``myproject``
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dauerbaustelle hat geschrieben:Vielleicht habe ich auch in meinen Settings Murks gemacht? Ihr könnt ja mal reinschauen.
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()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Antworten