【问题标题】:Apache with virtualenv and mod_wsgi : ImportError : No module named 'django'具有 virtualenv 和 mod_wsgi 的 Apache:ImportError:没有名为“django”的模块
【发布时间】:2016-12-09 23:09:10
【问题描述】:

我正在尝试使用以下 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>

我也有以下 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 中。但是我在WSGIDaemonProcesspython-path 属性中添加了相关的python 路径,所以我不明白为什么它不起作用。

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

【问题讨论】:

  • this 也为您解决问题吗?

标签: django apache mod-wsgi pythonpath


【解决方案1】:

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

Using mod_wsgi daemon mode

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

因此使用:

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,则需要完全按照 @graham-dumpleton 所说的进行设置,使用

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

    明确设置。

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

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

    就像提问者所做的那样。

    真的很奇怪。

    【讨论】:

    • 如果使用 Python 3.4 或 2.7,您仍应使用python-home。我知道使用设置python-path 的非首选方式没有问题,但这根本不是你应该做的。 python-home 选项长期以来一直是设置虚拟环境位置的最佳方式。这么久,即使是具有古老 mod_wsgi 版本的 Linux 发行版也应该仍然可以工作。即使文档可能仍未更新也是如此。 :-)
    • @graham-dumpleton 感谢您的建议。但就我而言,我使用的是 python 3.4,设置是你提到的“python-home”方式。但是,我的站点无法访问,因为 Apache 不断发送错误“导入错误:没有名为“站点”的模块”。只要我将它配置为“非首选方式”,像提问者一样使用“:”,这个问题就解决了。是的,对于 Python 3.5,您应该使用“python-home”方式,否则 [ImportError : No module named 'django'] 问题会出现。
    • 这意味着您的 mod_wsgi 实际上并未针对该版本的 Python 编译。您不能强制 mod_wsgi 使用与编译时不同的 Python 版本。使用python-path 的问题之一是,当您做错事情并试图强制 mod_wsgi 使用与 mod_wsgi 编译的不同 Python 版本的虚拟环境时,它不会显示。当使用python-home 时,它会正确地失败,从而告诉你你做错了什么。
    • 使用记录在案的检查来确定为什么 Python 版本 mod_wsgi 编译。如果它不是您要使用的 Python 版本,您必须卸载 mod_wsgi 并从一个包安装以获得正确的版本,或者从源代码编译以确保是正确的版本。不要使用python-path 来解决它,因为它稍后会以奇怪的方式失败。 modwsgi.readthedocs.io/en/develop/user-guides/…
    【解决方案3】:

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

    sudo apt-get install libapache2-mod-wsgi-py3
    

    【讨论】:

      【解决方案4】:

      我的问题是我在 python 3.9 版上运行libapache2-mod-wsgi-py3。当我将python版本回滚到3.7时,没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2016-06-15
        • 2017-10-18
        • 2019-11-13
        • 2017-04-21
        • 2018-11-24
        • 2012-12-19
        相关资源
        最近更新 更多