web-dev-qa-db-fra.com

Apache avec virtualenv et mod_wsgi: ImportError: Aucun module nommé 'Django'

J'essaie de servir un petit projet Django avec la configuration Apache suivante:

Configuration de l'hôte virtuel Apache:

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

J'ai aussi le wsgi.py suivant:

import os
from Django.core.wsgi import get_wsgi_application

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

Je n'ai aucun problème pour servir des fichiers STATIC et des fichiers MEDIA.

J'ai également vérifié les autorisations et essayé d'utiliser récursivement 755, puis 777 dans le répertoire site-package de virtualenv. Ça n'a pas marché.

Mais lorsque j'essaie d'atteindre la racine de mon site, j'obtiens ce qui suit:

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

J'ai deviné qu'il s'agissait d'un problème lié au chemin Python depuis l'installation de Django dans virtualenv. Mais j’ai ajouté les chemins python appropriés à l’attribut python-path de WSGIDaemonProcess afin que je ne comprenne pas pourquoi cela ne fonctionne pas.

Je suppose aussi que je pourrais ajouter le répertoire approprié à mon chemin Python dans mon fichier wsgi.py en utilisant le module site , mais j'aimerais comprendre pourquoi la configuration Apache que j'ai essayée ne suffit pas. Ai-je manqué quelque chose?

8
vmonteco

Il manque une directive WSGIProcessGroup ou une option équivalente sur WSGIScriptAlias; votre application n'est donc pas en cours d'exécution dans le groupe de processus démon dans lequel vous avez défini l'environnement virtuel. 

Voir Utilisation du mode démon mod_wsgi

Je vous recommanderais également de vous assurer que le groupe d'applications est défini sur '% {GLOBAL}' s'il s'agit de la seule application que vous exécutez dans le groupe de processus daemon.

Donc utiliser:

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

Il vaut également mieux utiliser python-home pour l’environnement virtuel.

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

Voir:

19
Graham Dumpleton

Mon représentant n’a pas plus de 50 ans, je ne peux donc pas en parler, mais j’aimerais partager ma découverte.

Dans WSGIDaemonProcess, si vous utilisez Python 3.5, vous devez définir exactement comme @ graham-dumpleton, avec 

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

définir explicitement.

Cependant, si vous utilisez Python 3.4 (ou une version plus ancienne de Python telle que 2.7 à ma connaissance), vous devrez le configurer comme suit:

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

tout comme ce que le demandeur a fait.

Vraiment bizarre.

4
Valorad

Pour moi le problème était que j'avais le mod wsgi installé pour python2. Je devais le réinstaller pour python3:

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