2010-04-18 4 views
7

Ho appena finito di configurare un'applicazione django su virtualenv, l'implementazione è avvenuta senza problemi con uno script di fabric, ma ora .wsgi non funziona, ho provato ogni variante su Internet ma senza fortuna. Il mio file .wsgi è:django + mod_wsgi su virtualenv non funziona

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() 

continuo a ricevere lo stesso errore:

[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 

mio ambiente virtuale è in/home/utente/webapps/kcdfweb mia app è/home/user/webapps /kcdf.web/releases/current/project_name mia casa di file WSGI/user/webapps/kcdf.web/releases/corrente/nome_progetto/apache/project_name.wsgi

risposta

1

è necessario aggiungere la directory che è due su da il tuo file wsgi, quindi anziché:

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

si dovrebbe avere

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

... come il file WSGI è in una directory chiamata apache, sotto la cartella del progetto.

+0

provato che non ha funzionato, potrebbe essere la pena di notare che quando ho creato un progetto Django di esempio al di fuori del virtualenv e provato a farlo funzionare ho ottenuto: jwesonga @ KCDF: ~/tester $ export DJANGO_SETTINGS_MODULE = tester.settings jwesonga @ kcdf: ~/tester $ django-admin.py runserver Errore: Impossibile importare le impostazioni 'tester.settings' (È su sys.path? Ha errori di sintassi?): Nessun modulo denominato tester.settings – jwesonga

0

Se si utilizza un virtualenv, è necessario attivarlo all'interno dello script WSGI per impostare correttamente i percorsi.

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

L'uso di activate_this.py in mod_wsgi è sconsigliato perché fa armeggiare con sys.prefix che tecnicamente potrebbe causare problemi con qualche codice. Leggi "http://code.google.com/p/modwsgi/wiki/VirtualEnvironments". –

+0

Inoltre, activate_questo non è necessario. Tutto quello che devi fare è chiamare site.addsitedir() nella directory dei siti del sito virtualenv. –

+3

No, site.addsitedir() non è sempre sufficiente, specialmente se non si sono utilizzati --no-site-packages durante la creazione dell'ambiente virtuale. Questo perché site.addsitedir() aggiunge nuove directory alla fine di sys.path e quindi qualsiasi cosa nell'installazione standard di Python ha ancora la precedenza. Lo scopo dello script è di riordinare sys.path in modo che le nuove directory vadano all'inizio e abbiano la precedenza. Vai a leggere la documentazione di cui al sito mod_wsgi. –

0

Avete un file __init__.py nella directory "KCDF"? Senza che il tuo file delle impostazioni non possa essere importato.

Inoltre, si dovrebbe chiamare site.addsitedir() nella directory dei siti del sito virtualenv, se si prevede di poter importare materiale dal virtualenv. Vedi the mod_wsgi docs per i dettagli. Anche se non può nemmeno importare le tue impostazioni, non penso che questo sia il tuo problema attuale.

7

Si consiglia di guardare lo docs per l'utilizzo di Virtualenv con mod_wsgi. Offrono alcuni approcci alternativi per l'aggancio al tuo virtualenv che potrebbe funzionare meglio per te.