webentwicklung-frage-antwort-db.com.de

Apache mit virtualenv und mod_wsgi: ImportError: Kein Modul mit dem Namen 'Django'

Ich versuche ein kleines Django-Projekt mit der folgenden Apache-Konfiguration bereitzustellen:

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 folgendes 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 MEDIA-Dateien bereitzustellen.

Ich habe auch die Berechtigungen überprüft und versucht, 755 rekursiv zu verwenden, dann 777 im Site-Package-Verzeichnis meiner virtualenv. Es hat nicht funktioniert.

Beim Versuch, die Wurzel meiner Website zu erreichen, bekomme ich Folgendes:

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

Ich vermutete, dass es sich um ein Problem mit Python-Pfad handelte, da Django in meinem virtualenv installiert ist. Aber ich habe die relevanten Python-Pfade zum python-path-Attribut von WSGIDaemonProcess hinzugefügt, damit ich nicht verstehe, warum es nicht funktioniert.

Ich denke auch, ich könnte das relevante Verzeichnis mit meinem site-Modul zu meinem Python-Pfad in meiner Datei wsgi.py hinzufügen , aber ich würde gerne verstehen, warum die von mir getestete Apache-Konfiguration nicht ausreicht. Habe ich etwas verpasst?

8
vmonteco

Es fehlt eine WSGIProcessGroup-Direktive oder eine entsprechende Option in WSGIScriptAlias, sodass Ihre Anwendung nicht in der Daemon-Prozessgruppe ausgeführt wird, in der Sie die virtuelle Umgebung festgelegt haben. 

Siehe mod_wsgi-Daemon-Modus verwenden

Ich würde auch empfehlen, sicherzustellen, dass die Anwendungsgruppe auf '% {GLOBAL}' gesetzt ist, wenn dies die einzige Anwendung ist, die Sie in der Daemon-Prozessgruppe ausführen.

Verwenden Sie also:

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

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

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

Sehen:

19

Mein Repräsentant ist nicht über 50, also kann ich nicht kommentieren, aber ich möchte meine Entdeckung teilen.

Wenn Sie in WSGIDaemonProcess Python 3.5 verwenden, müssen Sie genau wie @ graham-dumpleton mit angeben 

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

explizit setzen.

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

python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages

genau wie das, was der Fragesteller tat.

Sehr seltsam.

4
Valorad

Für mich bestand das Problem darin, dass ich Mod wsgi für Python2 installiert hatte. Ich musste es für python3 neu installieren:

Sudo apt-get install libapache2-mod-wsgi-py3
0
Marijus