2016-08-04 60 views
6

我想成为一个小Django项目具有以下Apache配置:跟Apache的virtualenv和mod_wsgi的:导入错误:没有模块名为“Django的

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> 

我也有以下wsgi.py:

import os 
from django.core.wsgi import get_wsgi_application 

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

我没有问题,为静态文件和媒体文件。

我也检查了权限,并尝试递归地使用755,然后777到我的virtualenv的站点包目录。它没有工作。

但是,试图达到我的网站的根我得到以下时:

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

我猜测,这是一个Python的路径相关的问题,因为Django是安装在我的virtualenv。但我添加了相关的Python路径到WSGIDaemonProcesspython-path属性,所以我不明白为什么它不起作用。

我也猜我可能add the relevant directory to my Python path in my wsgi.py by using the site module,但我想了解为什么我尝试的Apache配置是不够的。我错过了什么?

回答

15

由于缺少WSGIProcessGroup指令或WSGIScriptAlias的等效选项,因此您的应用程序实际上并未在您设置虚拟环境的守护程序进程组中运行。

Using mod_wsgi daemon mode

我还建议确保应用程序组设置为“%{}全球”如果这是你的守护进程组中运行的唯一应用程序。

这样使用:

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

而且最好使用python-home虚拟环境。

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

参见:

2

我代表不超过50个,所以我不能发表评论,但我想与大家分享我的发现。

在WSGIDaemonProcess,如果你正在使用Python 3.5,你需要设置完全一样@格雷厄姆邓普尔顿说,与

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

明确设置。但是,如果您使用的是Python 3.4(或某些较旧版本的Python,如2。7据我所知),你必须将其配置为

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

就像提问者所做的一样。

真的很奇怪。

+1

如果使用Python 3.4或2.7,你应该仍然使用''python-home''。我知道使用非首选设置“python-path”的方式没有问题,但它不是你应该做的。 ''python-home''选项是长时间设置虚拟环境位置的最佳方式。只要有古老mod_wsgi版本的Linux发行版仍然可以工作。即使文档可能尚未更新,情况也是如此。 :-) –

+0

@ graham-dumpleton感谢您的建议。但就我而言,我正在使用python 3.4,并且该设置是您提到的“python-home”方式。但是,我的网站无法访问,因为Apache不断发送错误“导入错误:无模块名为'站点'”。只要我将它配置为“非首选方式”,就像提问者那样使用“:”,这个问题就解决了。是的,对于Python 3.5,您应该使用“python-home”方式,或者[ImportError:没有名为'django'的模块]问题会上升。 – Valorad

+0

这意味着您的mod_wsgi实际上并未针对该版本的Python进行编译。您不能强制mod_wsgi使用不同于其编译的Python版本。使用''python-path''的问题之一是,当你做错了事情并且试图强制mod_wsgi使用一个不同于python版本的虚拟环境而不是mod_wsgi被编译时,它不会显示出来。当使用''python-home''时,它会错误地正确告诉你你做错了什么。 –

相关问题