web-dev-qa-db-fra.com

mod_wsgi: ImportError: aucun module nommé 'encodings'

J'utilise Apache 2.2.15 sur CentOS 6.5. J'essaie de configurer une application Django avec mod_wsgi. J'utilise un environnement virtuel et mod_wsgi a été configuré avec --with-python=/path/to/virtualenv/bin/python3.4.

J'ai ajouté ceci à mon httpd.conf:

WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>

Dans wsgi.py, j'ai ajouté

sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")

Le problème est que lorsque j'essaie d'ouvrir l'application dans mon navigateur, elle se charge indéfiniment. Voici le journal des erreurs Apache:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

Ce qui est intéressant, c’est que, tant dans l’installation système de Python (2.6) que dans la version de l’environnement virtuel (3.4), import encodings fonctionne correctement! J'ai essayé d'utiliser l'exemple de script WSGI de la page de vérification de votre installation de mod_wsgi pour confirmer quelle version de Python est utilisée par Apache, mais j'obtiens le même ImportError.

Quelqu'un a-t-il une suggestion pour les prochaines étapes? J'ai parcouru les docs mais je ne sais pas où aller à partir de maintenant.

15
tao_oat

Donc, avec l'aide de mes amis (SysAdmins, par exemple), nous avons pu comprendre cela hier soir. J'apprends mieux par exemple, alors supposons que vous utilisez Apache avec mod_wsgi en tant que groupe Linux Apache avec l'utilisateur flipperpa. Supposons que vous hébergez dans/home/my_project avec wsgi.py dans my_project/wsgi.py.

Au niveau supérieur (ls -l /):

drwxr-xr-x.  47 root root  4096 Jul  9 09:43 home

Dans le répertoire personnel (ls -l/home):

drwxrwsr-x   7 flipper        Apache 4096 Jul 29 10:22 my_project

C'était la clé. La minuscule "s" signifie que le bit setgid du groupe Apache est activé et que le bit d'exécution est activé. Le dernier "x", bien sûr, signifie que tout le monde peut exécuter.

Vérifiez vos autorisations en bas de l'arbre; cela a fait l'affaire pour nous.

4
FlipperPA

Le problème a été causé par SELinux. Ce que j'ai fait était ceci:

  • déplacé les fichiers du projet dans/home/admin/myproject
  • autorisations modifiées comme dans la réponse de FlipperPA
  • et surtout, je pense, définissez le httpd_enable_homedirs SELinux booléen sur on à l'aide de setsebool -P httpd_enable_homedirs on.

Le guide SELinux sur le wiki CentOS a été très utile. Par exemple, pour déboguer, vous pouvez exécuter setenforce Permissive afin que SELinux n'applique pas ses règles, mais continue d'écrire dans le journal. Rappelez-vous juste pour setenforce Enforcing encore après!

2
tao_oat

Sous Windows, j'ai résolu ce problème en mettant le répertoire Lib de mon installation Python directement sur PYTHONPATH. Cela est nécessaire même si, si vous exécutez Python directement dans le même shell, le package d'encodages n'est pas nécessaire:

set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.AMD64\Lib;%PYTHONPATH%
c:\Apache24\bin\httpd.exe

Veillez également à utiliser la version correcte de mod_wsgi. J'ai téléchargé le mien à partir de la page Unofficial Binaries et l'ai choisi pour correspondre au Python (64 bits 3.4 dans l'exemple ci-dessus). Mon site Web fonctionne correctement avec Python après la modification ci-dessus dans le fichier .bat qui démarre Apache. 

Notez que ma version de Python, WinPython , est installée en décompressant l’installation et en la plaçant dans le lecteur C :. Ainsi, il n'est pas installé dans le registre de la manière habituelle de Windows, ce qui devrait minimiser les considérations d'interaction du registre.

0
Lars Ericson