【问题标题】:ImportError: No module named django.core.wsgi for uwsgiImportError: No module named django.core.wsgi for uwsgi
【发布时间】:2012-12-21 02:49:49
【问题描述】:

我在我的 Django(version =1.4) 项目中使用 uwsgi,但是如果我运行会出现错误

uwsgi --ini django.ini
从 django.core.wsgi 导入 get_wsgi_application ImportError:没有名为 django.core.wsgi 的模块

但我可以按如下方式导入 django.core.wsgi:

>>> import django.core.wsgi

django.ini 文件:

[uwsgi] chdir=/path/to/my/app 模块=app.wsgi:应用程序 大师=真 真空=真 最大请求数=5000 套接字=127.0.0.1:9000

wsgi.py

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

【问题讨论】:

  • 你有本地的django.py 文件吗?

标签: python django uwsgi


【解决方案1】:

如果您在 sudo apt-get install gunicorn(venv) pip install gunicorn 上都安装了 gunicorn,请使用 sudo apt-get remove gunicorn 并重新启动您的虚拟环境。这样,它对我有用。

【讨论】:

  • 它工作正常,我也先使用 apt-get install gunicorn 安装,然后使用 pip 安装。我删除了 sudo apt-get remove。它工作正常。谢谢
  • 哇,这对我有用,谢谢!我使用 pip3 install gunicorn 而不是 sudo apt-get install gunicorn 重新安装了 Gunicorn
【解决方案2】:

错误ImportError: No module named django.core.wsgi一般出现在uwsgi尝试读取wsgi.py文件的时候,到了下面一行:

from django.core.wsgi import get_wsgi_application

找不到这些模块是因为没有安装 Django,或者如果安装了它,它不在 PYTHONPATH 中。

如果你的项目在 virtualenv 中,而 Django 只安装在这个 virtualenv 中,不知何故 Django 模块的路径不在PYTHONPATH 中,因此 Python 找不到它。

如果好奇,可以在wsgi.py文件中插入如下代码,查看PYTHONPATH:

import os
print '===== sys.path / PYTHONPATH ====='
for k in sorted(os.environ.keys()):
    v = os.environ[k]
    print ('%-30s %s' % (k,v[:70]))

如果您运行安装在 virtualenv 中的本地版本的 uwsgi,那么路径将设置正确,但如果您运行全局版本的 uwsgi,通​​常不会正确设置 PYTHONPATH。

你可以告诉 uWSGI 到 virtualenv 的路径,它会找出正确的 PYTHONPATH。只需使用--virtualenv 命令行参数,例如:

uwsgi --http :8001 --module wsgi --virtualenv /home/jdoe/myvirtualenv

(以下参数与--virtualenv完全相同:--venv、--home、-H)

令人惊讶的是,设置 $VIRTUAL_ENV 对 PYTHONPATH 没有影响

奇怪的是,如果你不使用 --virtualenv 参数,环境变量$VIRTUAL_ENV 将被正确设置。通过插入 wsgi.py 进行测试:

print os.environ['VIRTUAL_ENV']

这将打印:

/home/jdoe/myvirtualenv

但是 PYTHONPATH 没有设置正确,并且不包含来自 virtualenv 的任何内容。

我无法解释这是为什么。

【讨论】:

  • --virtualenv 是关键!感谢您的完美分析@mads-skjern
【解决方案3】:

如果您使用 virtualenv,请尝试将 home 添加到 django.ini:

home=/path/to/venv/

通过网络浏览器进行测试:

uwsgi --ini django.ini --protocol=http

【讨论】:

  • “django.ini”在哪里?
  • doc
  • 接收:没有名为“编码”的模块
【解决方案4】:

在我的例子中,我为 Python3 安装了 Django 应用程序和其他所有东西,但 uwsgi 使用的是 Python2。运行uwsgi的时候检查一下log是用Python2还是Python3,如果不一致就重新安装uwsgi。在 uwsgi 启动日志中查找类似于以下行的行。

Python version: 3.4.3 (default, Oct 14 2015, 20:31:36) [GCC 4.8.4] VS Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2]

【讨论】:

    【解决方案5】:

    由于您接受了提到virtualenv 的答案,因此您似乎使用了它。在这种情况下,请确保 django 已安装在您的 virtualenv 目录中(例如 venv)。

    你可以从virtualenv下的pip单独安装它,或者手动创建一个符号链接(如果你在类Unix系统上)到venv的站点包

    ln -s /usr/path_to_django venv/lib/python2.7/site-packages/django
    

    【讨论】:

      【解决方案6】:

      我收到此错误是因为我在 virtualbox 的共享文件夹中创建了不允许符号链接的虚拟环境。我收到了一些错误,但似乎一切正常,所以我继续,直到我收到这个错误。当我重新创建我的虚拟环境,确保没有错误并将 uwsgi 指向该文件夹时,问题就解决了。

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2013-06-27
        • 2015-05-08
        • 2013-08-13
        • 2019-04-03
        • 2015-02-27
        • 1970-01-01
        • 2017-09-16
        • 2015-09-10
        相关资源
        最近更新 更多