2010-04-18 3 views
7

Ich habe gerade eine django app auf virtualenv eingerichtet, die Bereitstellung lief reibungslos mit einem Fabric-Skript, aber jetzt funktioniert die .wsgi nicht, ich habe jede Variante im Internet aber ausprobiert kein Glück. Meine .wsgi Datei ist:django + mod_wsgi auf virtualenv funktioniert nicht

import os 
import sys 
import django.core.handlers.wsgi 

# put the Django project on sys.path 
root_path = os.path.abspath(os.path.dirname(__file__) + '../') 
sys.path.insert(0, os.path.join(root_path, 'kcdf')) 
sys.path.insert(0, root_path) 

os.environ['DJANGO_SETTINGS_MODULE'] = 'kcdf.settings' 

application = django.core.handlers.wsgi.WSGIHandler() 

Ich erhalte immer den gleichen Fehler:

[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] mod_wsgi (pid=16938): Exception occurred processing WSGI script '/home/kcdfweb/webapps/kcdf.web/releases/current/kcdf/apache/kcdf.wsgi'. 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] Traceback (most recent call last): 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 230, in __call__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self.load_middleware() 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 33, in load_middleware 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  for middleware_path in settings.MIDDLEWARE_CLASSES: 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/utils/functional.py", line 269, in __getattr__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self._setup() 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 40, in _setup 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self._wrapped = Settings(settings_module) 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 75, in __init__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e) 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] ImportError: Could not import settings 'kcdf.settings' (Is it on sys.path? Does it have syntax errors?): No module named kcdf.settings 

meine virtuelle Umgebung ist auf/home/user/webapps/kcdfweb meine app/home/user/Webapps /kcdf.web/releases/current/project_name meine wsgi Datei home/user/webapps/kcdf.web/releases/Strom/project_name/apache/project_name.wsgi

Antwort

1

Sie müssen das Verzeichnis hinzuzufügen, die zwei bis aus Ihre wsgi-Datei, also statt:

root_path = os.path.abspath(os.path.dirname(__file__) + '../') 

sollten Sie

root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../', '../')) 

haben ... als wsgi Datei in einem Verzeichnis ist apache genannt, unter Ihrem Projektordner.

+0

versucht, dass es nicht funktioniert hat, könnte sich lohnen, unter Hinweis darauf, dass, wenn ich erstellt eine Probe django Projekt außerhalb des virtualenv und versuchte, es zu laufen Ich habe: jwesonga @ KCDF: ~/Tester $ export DJANGO_SETTINGS_MODULE = tester.settings jwesonga @ kcdf: ~/tester $ django-admin.py runserver Fehler: Konnte die Einstellungen 'tester.settings' nicht importieren (Ist es auf sys.path? Hat es Syntaxfehler?): Kein Modul namens tester.settings – jwesonga

0

Wenn Sie ein virtualenv verwenden, müssen Sie es innerhalb des WSGI-Skripts aktivieren, um die Pfade korrekt einzurichten.

root_path = os.path.abspath(os.path.dirname(__file__) + '../') 
activate_this = os.path.join(root_path, "bin/activate_this.py") 
execfile(activate_this, dict(__file__=activate_this)) 
+1

Die Verwendung von activate_this.py in mod_wsgi wird abgeraten, da es mit sys.prefix fiedelt, was technisch Probleme mit Code verursachen kann. Lesen Sie "http://code.google.com/p/modwsgi/wiki/VirtualEnvironments". –

+0

Auch activate_this ist nicht notwendig. Alles, was Sie wirklich tun müssen, ist den Aufruf von site.addsitedir() auf dem Virtuellenv site-packages dir. –

+3

Nein, site.addsitedir() ist nicht immer ausreichend, besonders wenn Sie beim Erstellen der virtuellen Umgebung keine --o-site-packages verwendet haben. Dies liegt daran, dass site.addsitedir() neue Verzeichnisse am Ende von sys.path hinzufügt und somit alles in der Standard-Python-Installation Vorrang hat. Der Zweck des Skripts besteht darin, sys.path so neu zu ordnen, dass neue Verzeichnisse am Anfang stehen und Vorrang haben. Lesen Sie die Dokumentation auf der Seite mod_wsgi. –

0

Haben Sie in Ihrem "KCDF" Verzeichnis eine Datei __init__.py haben? Ohne dass Ihre Einstellungsdatei nicht importiert werden kann.

Sie sollten auch site.addsitedir() auf dem Site-Packages-Verzeichnis von virtualenv aufrufen, wenn Sie erwarten, dass Sie Zeug aus dem virtualenv importieren können. Details finden Sie unter the mod_wsgi docs. Wenn es Ihre Einstellungen nicht einmal importieren kann, glaube ich nicht, dass dies Ihr aktuelles Problem ist.

7

Ich würde empfehlen, dass Sie die docs für die Verwendung von Virtualenv mit mod_wsgi betrachten. Sie bieten ein paar alternative Ansätze zum Einklinken in Ihr virtualenv, die für Sie besser funktionieren könnten.