导入错误:找不到名为django.core.wsgi的模块。Apache + VirtualEnv + AWS + WSGI。

61
我正在尝试将我的网站发布到亚马逊的EC2实例上,但我一直收到500错误。我真的不知道为什么。
//日志文件
    [Sun Feb 17 23:12:48.066802 2013] mod_wsgi (pid=2102): Target WSGI script '/srv/www/app/poka/apache/wsgi.py' cannot be loaded as Python module.
    [Sun Feb 17 23:12:48.066840 2013] mod_wsgi (pid=2102): Exception occurred processing WSGI script '/srv/www/app/poka/apache/wsgi.py'.
    [Sun Feb 17 23:12:48.066864 2013] Traceback (most recent call last):
    [Sun Feb 17 23:12:48.066889 2013] File "/srv/www/mysite/poka/apache/wsgi.py", line 26, in <module>
    [Sun Feb 17 23:12:48.066920 2013] from django.core.wsgi import get_wsgi_application
    [Sun Feb 17 23:12:48.066945 2013] ImportError: No module named django.core.wsgi

//Apache配置文件

    WSGIScriptAlias / /srv/www/app/mysite/apache/wsgi.py

    WSGIDaemonProcess mysite python-path=/srv/www/app/mysite:/home/ec2-user/.virtualenvs/mysite-main/lib/python2.7/site-packages
    WSGIProcessGroup mysite

    <Directory /srv/www/app/mysite/apache/>
    <Files wsgi.py>
    Order deny,allow
    Allow from all
    </Files>
    </Directory>

    <Directory /srv/www/app/mysite/apache/>
    Order deny,allow
    Allow from all
    </Directory>

    <Directory /home/ec2-user/app/mysite/static>
    Order deny,allow
    Allow from all
    </Directory>

    <Directory /home/ec2-user/app/mysite/media>
    Order deny,allow
    Allow from all
    </Directory>

//wsgi.py

    import os
    import sys
    import site

    site.addsitedir('/home/ec2-user/.virtualenvs/mysite-main/lib/python2.7/site-packages')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

    path = '/srv/www/app/mysite'

    if path not in sys.path:
        sys.path.append(path)

https://dev59.com/O5Xfa4cB1Zd3GeqPfHNP#45944655 看起来很相关。 - mlvljr
12个回答

52

我知道这是一个旧的帖子,但我刚遇到了同样的问题,并且我认为这并不是由于缺少软件包所致。因为Django核心发行版已经包含了正确的wsgi处理程序。

问题在于当执行wsgi.py时,它缺少来自虚拟环境的site-packages安装包。(如果您已激活虚拟环境并运行了pip install django,则一切都很好。您有必要的Django包)。

就我而言,我通过修改我的Path/to/Project/Project/wsgi.py文件中的sys.path来解决了这个问题。

您需要将项目目录和虚拟环境的site-packages添加到sys.path列表中。 这是我的项目中包含的wsgi.py文件(谈论用django-admin.py start-project创建的wsgi.py)... 我不得不对其进行修改才能使其与Apache一起使用。

# =====================
# wsgi.py file begin 

import os, sys
# add the hellodjango project path into the sys.path
sys.path.append('<PATH_TO_MY_DJANGO_PROJECT>/hellodjango')

# add the virtualenv site-packages path to the sys.path
sys.path.append('<PATH_TO_VIRTUALENV>/Lib/site-packages')

# poiting to the project settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hellodjango.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

# wsgi.py file end
# ===================

请确保:

  1. 您将mod_wsgi添加到Apache模块目录中 mod_wsgi必须根据您的操作系统、Apache和Python版本编译

  2. 已将加载模块命令添加到您的httpd.conf以加载mod_wsgi模块 LoadModule wsgi_module modules/mod_wsgi.so

  3. 在您的httpd.conf或任何包含在其中的conf中配置了Django特定内容

基于文档如何使用Django与Apache和mod_wsgi

WSGIScriptAlias / <PATH_TO_PROJECT>/hellodjango/hellodjango/wsgi.py
WSGIPythonPath <PATH_TO_PROJECT>:<PATH_TO_VIRTUALENV>/Lib/site-packages

<Directory <PATH_TO_PROJECT>/hellodjango/hellodjango> 
  <Files wsgi.py>
    Order deny,allow
    Require all granted
  </Files>
</Directory>

希望这可以帮到你,对我有效。


7
在我的情况下,更新了 wsgi.py 后似乎解决了问题,但是我的 site-packages 路径不同(lib 中没有大写字母 L): lib/python3.6/site-packages。您的路径可能不同,例如,如果您使用不同的 Python 版本,因此建议检查此项。另外,我不确定 PATH_TO_PROJECT/hellodjango 是什么意思。它是否应该是 settings.py 所在的目录? - miyalys
太完美了!!在许多回答都说同样的事情,即当前虚拟环境中未安装Django之后,终于有了有价值的东西。 - coda
请按照以下步骤定位site-packages - https://dev59.com/yHVD5IYBdhLWcg3wAGiD - Robert Ranjan

30

我也遇到了同样的问题。我的libapache2-mod-wsgi是Python 2.x而不是Python 3.x。

在这里找到了解决方案:https://dev59.com/4mw15IYBdhLWcg3wtNyO#28118284

感谢@nima

$ sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ sudo apt-get install libapache2-mod-wsgi-py3

在你复制/粘贴这些命令之前,请注意@alxs的警告: 如果服务器上运行着使用WSGI和Apache的Python 2项目,则上述命令将有效地关闭它们。


1
来自评论:您好,链接是分享知识的好方法,但如果它们在未来失效了,它们并不会真正回答问题。在您的答案中添加回答问题的链接的基本内容。如果内容过于复杂或过大而无法适应此处,请描述所提出解决方案的一般思路。请记得始终保留原解决方案网站的链接引用。请参阅:如何撰写良好的答案? - sɐunıɔןɐqɐp

7

请将以下内容添加到Apache配置文件中:

WSGIPythonHome /home/ec2-user/.virtualenvs/mysite-main

它没有起作用...但是我执行了"ldd mod_wsgi.so",它指向Python 2.6,但我的虚拟环境是Python 2.7... - abisson

4

我刚刚也遇到了类似的错误。原来我们的Django代码是在Python 3.5上开发的,但由于某些原因,部署服务器的人使用Python 2.7设置了virtualEnv。我们重新使用Python 3.5进行部署,一切正常了。

以下是我收到的错误信息:

$ python serviceStartup.py 
Traceback (most recent call last):
  File "serviceStartup.py", line 10, in <module>
    from django.core.wsgi import get_wsgi_application
ImportError: No module named django.core.wsgi

希望这能帮到遇到类似错误信息的人!

1
在Debian中安装了WSGI和libapache2-mod-wsgi后,我遇到了这个错误。当使用Python 3时,正确的软件包是libapache2-mod-wsgi-py3。 - datagutten

4

对我来说,这意味着服务器上没有安装Django。 通过以下方式进行修复:

pip install Django

一般来说,请确保您已安装所需组件:

pip install -r requirements.txt

如果使用虚拟环境,请在安装要求之前激活该环境。


12
这会违背使用 virtualenv 的初衷。 - kjyv
往往不是那么简单:考虑共享的开发或者暂存服务器的例子,多个Django项目分支必须在各自的虚拟主机上运行——每个虚拟主机都能在虚拟环境中良好运行。 - fiacre
在Amazon ec2上遇到了同样的问题,我已经在Ubuntu用户名下安装了Django,但由于某种原因,它需要在root下安装才能被Apache2检测到。 - Alex Stewart
@kjyv pip 也可以安装到虚拟环境中... - Zags

1
你已经做得非常好了,朋友。只需要给Apache用户访问项目和虚拟环境目录的权限即可。
例如:
sudo chown -R www-data:www-data /home/ubuntu/projects
sudo chown -R www-data:www-data /home/ubuntu/virtualenv

这解决了我的问题,出现了 ImportError: No module named django.core.wsgi (virtualenvs文件夹) 和 ImportError: No module named <project-name>.settings (项目文件夹)。

0

运行以下命令:

$ sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ sudo apt-get install libapache2-mod-wsgi-py3

0

乍一看,我很抱歉我的英语。我也遇到了这个问题,并通过将'wsgi.py'文件更改为以下内容来解决它:

import os
import django
from django.core.handlers.wsgi import WSGIHandler

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eisentask.settings.production") django.setup(set_prefix=False)
application = WSGIHandler()

0

嗨,我在Ubuntu 20.04服务器上遇到了同样的问题。我通过安装apache2-dev来解决它。

sudo apt-get install apache2-dev

mod_wsgi文档中,重要的是安装apache2apache2-dev两个组件。

0
如果有人使用 AWS Lightsail bitnami,并且遇到“Python在Apache看不到的目录中安装软件包”的问题。
解决方法是:软件包被安装在“/home/bitnami/.local/lib/python3.8/site-packages/”中,而Apache在“/opt/bitnami/python/lib/python3.8/site-packages/”中查找。
我遵循的临时解决方案是使用以下命令将软件包复制到Apache目录中:“cp -r /home/bitnami/.local/lib/python3.8/site-packages/* /opt/bitnami/python/lib/python3.8/site-packages/”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接