2016-08-04 11 views
6

Ich versuche, ein wenig django Projekt mit der folgenden Apache-Konfiguration zu dienen:Apache mit virtualenv und mod_wsgi: Import: Kein Modul namens 'django'

Apache Virtualhost Konfiguration:

<VirtualHost *> 
    ServerName servername 

    [...] 

    <Directory "/path/to/project/project"> 
     <Files wsgi.py> 
      Require all granted 
     </Files> 
    </Directory> 

    WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages       
    WSGIScriptAlias//path/to/project/project/wsgi.py 

</VirtualHost> 

ich habe auch die folgenden wsgi.py:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") 
application = get_wsgi_application() 

ich habe kein Problem STATIC Dateien und Mediendateien zu dienen.

Ich überprüfte auch die Berechtigungen und versuchte, rekursiv 755, dann 777 zu meinem virtuosev Site-Paket-Verzeichnis zu verwenden. Es hat nicht funktioniert.

Aber wenn man versucht, die Wurzel meiner Website zu erreichen ich folgende erhalten:

from django.core.wsgi import get_wsgi_application 
ImportError: No module named 'django' 

Ich vermuten, dass es sich um ein Python-Pfad verwandtes Problem war, da django in meinem virtualenv installiert ist. Aber ich habe die relevanten Python-Pfade zum python-path Attribut hinzugefügt, so dass ich nicht verstehe, warum es nicht funktioniert.

Ich denke auch, ich könnte add the relevant directory to my Python path in my wsgi.py by using the site module, aber ich würde gerne verstehen, warum die Apache-Konfiguration, die ich versuchte, nicht genug ist. Habe ich etwas verpasst?

Antwort

15

Sie vermissen eine WSGIProcessGroup Direktive oder äquivalente Option unter WSGIScriptAlias, sodass Ihre Anwendung nicht in dieser Daemon-Prozessgruppe ausgeführt wird, in der Sie die virtuelle Umgebung festgelegt haben.

Siehe Using mod_wsgi daemon mode

würde ich empfehlen, auch sicherzustellen, Anwendungsgruppe festgelegt ist ‚% {GLOBAL}‘, wenn das ist die einzige Anwendung, die Sie in der Dämon-Prozess Gruppe ausgeführt werden.

So verwenden:

WSGIScriptAlias//path/to/project/project/wsgi.py \ 
    process-group=project application-group=%{GLOBAL} 

auch besser python-home für die virtuelle Umgebung zu verwenden.

WSGIDaemonProcess project python-path=/path/to/project \ 
     python-home=/path/to/Envs/venv 

See:

2

Mein rep ist nicht mehr als 50, so kann ich nicht kommentieren, aber ich möchte meine Entdeckung teilen.

In WSGIDaemonProcess, wenn Sie Python verwenden 3.5, müssen Sie genau wie @ graham-Dumpleton einzustellen sagen, mit

python-home=/path/to/Envs/venv 

explizit festgelegt.

Wenn Sie jedoch Python 3.4 (oder eine ältere Version von Python wie 2.7 soweit ich weiß), müssen Sie es als

wie genau das, was der Fragesteller tat.

Wirklich seltsam.

+1

Wenn Sie Python 3.4 oder 2.7 verwenden, sollten Sie immer noch '' python-home'' verwenden. Ich kenne keine Probleme mit der Verwendung der nicht bevorzugten Art, '' python-path'' zu setzen, aber es ist einfach nicht das, was Sie tun sollten. Die '' python-home''-Option war die beste Möglichkeit, den Standort der virtuellen Umgebung für eine lange Zeit festzulegen. So lange, dass selbst Linux-Distributionen mit alten mod_wsgi-Versionen noch funktionieren sollten. Dies ist auch dann der Fall, wenn die Dokumentation möglicherweise noch nicht aktualisiert wurde. :-) –

+0

@ graham-dumpleton Danke für deinen Rat. Aber in meinem Fall verwende ich Python 3.4, und die Einstellung war die "Python-Home" -Methode, wie Sie erwähnt haben. Meine Site kann jedoch nicht besucht werden, da Apache weiterhin den Fehler "Importfehler: Kein Modul namens 'Site'" sendet. Solange ich es auf "nicht bevorzugte Weise" konfiguriere, indem ich ":" wie der Fragesteller verwendete, wurde dieses Problem gelöst. Und ja, für Python 3.5 sollten Sie "python-home" verwenden, oder [ImportError: Kein Modul mit dem Namen 'django'] wird auftreten. – Valorad

+0

Das bedeutet, dass Ihr mod_wsgi nicht wirklich für diese Version von Python kompiliert wurde. Sie können mod_wsgi nicht zwingen, eine andere Python-Version zu verwenden, für die es kompiliert wurde. Eines der Probleme bei der Verwendung von '' python-path'' ist, dass es nicht so gut angezeigt wird, wenn Sie die falsche Sache machen und versuchen, mod_wsgi zu zwingen, eine virtuelle Umgebung für eine andere Python-Version zu verwenden als für mod_wsgi. Wenn Sie '' python-home'' verwenden, wird es stattdessen fehlschlagen und Ihnen sagen, dass Sie etwas falsch machen. –