导入错误:uwsgi找不到django.core.wsgi模块

26
我在我的Django(版本=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
module=app.wsgi:application
master=True
vacuum=True
max-requests=5000
socket=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 文件吗? - Martijn Pieters
6个回答

26

如果您在两个位置都安装了gunicorn,即sudo apt-get install gunicorn(venv) pip install gunicorn,请使用sudo apt-get remove gunicorn并重新启动您的虚拟环境。这种方法对我很有效。


它正在工作,我也是首先使用apt-get install gunicorn安装,然后使用pip安装。我删除了sudo apt-get remove。它运行良好。谢谢。 - Muthuraj S
2
哇,这对我有用,谢谢!我使用 pip3 install gunicorn 重新安装了 Gunicorn,而不是使用 sudo apt-get install gunicorn。 - Dominic M.

24

当uwsgi尝试读取wsgi.py文件并到达这行代码时,通常会出现错误ImportError: No module named django.core.wsgi

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]))
如果您运行安装在虚拟环境中的本地版本的uwsgi,则路径将被正确设置,但如果您运行全局版本的uwsgi,它通常不会正确设置PYTHONPATH。
您可以告诉uWSGI虚拟环境的路径,它将找到正确的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就是关键!感谢@mads-skjern的完美分析。 - Sarang

14
如果您使用 virtualenv,请尝试将 home 添加到 django.ini 中。
home=/path/to/venv/

通过Web浏览器进行测试:

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

2
“django.ini”在哪里? - rayashi
请查看文档 - sneawo
接收到:没有名为'encodings'的模块。 - Soham Navadiya

3
在我的情况下,我安装了Django应用程序和Python3的所有其他内容,但uwsgi正在使用Python2。只需在运行uwsgi时检查日志,查看是否使用Python2或Python3,并且如果不一致,则重新安装uwsgi。在uwsgi启动日志中查找类似于以下行的行。 Python version: 3.4.3 (default, Oct 14 2015, 20:31:36) [GCC 4.8.4]Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2]

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

0

既然你接受了提到 virtualenv 的答案,看起来你在使用它。在这种情况下,请确保 django 已经安装在你的 virtualenv 目录中(比如说 venv)。

你可以使用 pipvirtualenv 下单独安装它,或者手动创建一个符号链接(如果你使用类Unix系统)到 venv 的 site-packages 目录下。

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

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