【问题标题】:VirtualEnv apache2 server No module named 'django'VirtualEnv apache2 服务器没有名为“django”的模块
【发布时间】:2019-05-27 09:27:55
【问题描述】:

我正在/home/myname/myproject/venv 内部为我的 apache2 服务器运行一个虚拟环境

我用

激活我的虚拟环境
source venv/bin/activate

跑步

which django-admin

从我的虚拟环境中返回正确的文件。

跑步

 import django
 django.__file__

返回

/home/myname/myproject/venv/lib/python3.6/site-packages/django/__init__.py

跑步

pip freeze

返回所有我需要的包。

我的 apache2 配置文件也使用 python-path 参数指向 venv 目录

但是,在重新启动服务器后,我仍然收到 django 的 ModuleNotFoundError。

这里有什么问题?

编辑:apache2 配置文件

    Alias /static /home/myname/myproject/static
    <Directory /home/myname/myproject/static>
        Require all granted
    </Directory>

    Alias /media /home/myname/myproject/media
        <Directory /home/myname/myproject/media>
                Require all granted
        </Directory>

    <Directory /home/myname/myproject/myproj>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIScriptAlias / /home/myname/myproject/myproj/wsgi.py
    WSGIDaemonProcess myproject_app python-path=/home/myname/myproject python-home=/home/myname/myproject/venv/
    WSGIProcessGroup myproject_app
    WSGIApplicationGroup %{GLOBAL}

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')

application = get_wsgi_application()

【问题讨论】:

  • 您需要显示 Apache 配置。
  • 你确定你在重启你的apache服务器时激活了virtualenv?您可以添加到帖子wsgi.py 文件以及 Apache 配置吗?
  • 用配置更新了原帖
  • 也是的,我确保激活了 venv
  • @BrandonHimes 似乎并非如此。据我看你的代码。您确实指向 virtualenv 文件夹,但您在代码中的何处激活它?

标签: python django python-3.x apache mod-wsgi


【解决方案1】:

您需要将虚拟环境的激活添加到wsgi.py文件中。

import os
import sys

PROJECT_DIR = '/home/myname/myproject'
sys.path.insert(0, PROJECT_DIR)


def execfile(filename):
    globals = dict( __file__ = filename )
    exec( open(filename).read(), globals )

activate_this = os.path.join( PROJECT_DIR, 'venv/bin', 'activate_this.py' )
execfile( activate_this )

此代码应在django 导入之前。否则,无论何时重启Apache2,都需要手动激活虚拟环境。

注意:确保您在虚拟环境中安装了所有要求。

【讨论】:

  • 但是每当我重新启动服务器时,我都会手动激活虚拟环境,但仍然收到相同的错误。我不明白为什么我的 virtualenv 能识别 django 但 apache 却没有,即使它指向同一个 virtualenv
  • @BrandonHimes 您能否验证如果您应用上述更改,您的代码仍然会出错?问题不在于Apache2,而在于您的代码,您的代码应该如何知道它必须使用 virtualenv?
  • 是的,我添加了您的更改并收到相同的错误。
  • 你能添加来自/var/log/apache2/error.log的整个日志吗?
  • @BrandonHimes 可以添加激活虚拟环境的pip freeze 吗?
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2021-11-17
  • 2012-12-19
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多