使用virtualenv和mod_wsgi的Apache:ImportError:没有名为'django'的模块

vmo*_*eco 11 apache django mod-wsgi pythonpath

我正在尝试使用以下Apache配置为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>
Run Code Online (Sandbox Code Playgroud)

我也有以下wsgi.py:

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

我没有问题来提供STATIC文件和MEDIA文件.

我还检查了权限并尝试递归使用755,然后777到我的virtualenv的site-package目录.它没用.

但是当我试图访问我的网站的根目录时,我得到以下内容:

from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
Run Code Online (Sandbox Code Playgroud)

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

我也猜测我可以通过使用site模块将相关目录添加到我的wsgi.py中的Python路径中,但我想了解为什么我尝试的Apache配置还不够.我错过了什么?

Gra*_*ton 21

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

请参阅使用mod_wsgi守护程序模式

我还建议确保应用程序组设置为'%{GLOBAL}',如果这是您在守护进程组中运行的唯一应用程序.

因此使用:

WSGIScriptAlias / /path/to/project/project/wsgi.py \
    process-group=project application-group=%{GLOBAL}
Run Code Online (Sandbox Code Playgroud)

也更适合python-home用于虚拟环境.

    WSGIDaemonProcess project python-path=/path/to/project \
        python-home=/path/to/Envs/venv
Run Code Online (Sandbox Code Playgroud)

看到:


Val*_*rad 5

我的代表未超过50岁,因此我无法发表评论,但我想分享我的发现。

在WSGIDaemonProcess中,如果您使用的是Python 3.5,则需要按照@ graham-dumpleton所说的进行设置,

python-home=/path/to/Envs/venv
Run Code Online (Sandbox Code Playgroud)

明确设置。

但是,如果您使用的是Python 3.4(或据我所知的某些旧版本的Python,如2.7),则必须将其配置为

python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages
Run Code Online (Sandbox Code Playgroud)

就像问问者所做的一样。

真奇怪。

  • 如果使用Python 3.4或2.7,则仍应使用python-home。我不知道使用非首选方式设置``python-path''会出现问题,但这根本不是您应该做的事情。长期以来,``python-home''选项一直是设置虚拟环境位置的最佳方法。如此之久,甚至具有古老mod_wsgi版本的Linux发行版也应该可以正常工作。即使文档可能仍未更新,也是如此。:-) (2认同)
  • 这意味着您的 mod_wsgi 实际上并未针对该版本的 Python 进行编译。您不能强制 mod_wsgi 使用与编译时不同的 Python 版本。使用 python-path 的问题之一是,当你做错事并试图强制 mod_wsgi 使用与 mod_wsgi 编译时不同的 Python 版本的虚拟环境时,它不会显示出来。当使用“python-home”时,它会正确失败,从而告诉您做错了什么。 (2认同)

Mar*_*jus 5

对我来说,问题是我为 python2 安装了 mod wsgi。我不得不为python3重新安装它:

sudo apt-get install libapache2-mod-wsgi-py3
Run Code Online (Sandbox Code Playgroud)