django + virtualenv + gunicorn - 没有名为 django.core.wsgi 的模块?

Posted

技术标签:

【中文标题】django + virtualenv + gunicorn - 没有名为 django.core.wsgi 的模块?【英文标题】:django + virtualenv + gunicorn - No module named django.core.wsgi? 【发布时间】:2017-10-18 21:35:59 【问题描述】:

我的虚拟环境中安装了gunicorn

$ pip install gunicorn
Collecting gunicorn
  Using cached gunicorn-19.7.1-py2.py3-none-any.whl
Installing collected packages: gunicorn
Successfully installed gunicorn-19.7.1

但是当我尝试用它运行我的应用程序时:

$ gunicorn helloapp.wsgi
[2017-05-18 22:42:36 +0000] [1963] [INFO] Starting gunicorn 19.6.0
[2017-05-18 22:42:36 +0000] [1963] [INFO] Listening at: http://127.0.0.1:8000 (1963)
[2017-05-18 22:42:36 +0000] [1963] [INFO] Using worker: sync
[2017-05-18 22:42:36 +0000] [1967] [INFO] Booting worker with pid: 1967
[2017-05-18 22:42:36 +0000] [1967] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 557, in spawn_worker
    worker.init_process()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 136, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 384, in import_app
    __import__(module)
  File "/var/www/html/django-project/helloapp/helloapp/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ImportError: No module named django.core.wsgi
[2017-05-18 22:42:36 +0000] [1967] [INFO] Worker exiting (pid: 1967)
[2017-05-18 22:42:36 +0000] [1963] [INFO] Shutting down: Master
[2017-05-18 22:42:36 +0000] [1963] [INFO] Reason: Worker failed to boot.

我做错了什么?

这是我的应用结构:

有什么想法吗?

这是我的要求.txt:

appdirs==1.4.3
Django==1.11.1
gunicorn==19.7.1
packaging==16.8
pyparsing==2.2.0
pytz==2017.2
six==1.10.0

编辑:

(env) xxx@xxx-desktop:/var/www/html/django-project/helloapp$ which gunicorn
/var/www/html/django-project/helloapp/env/bin/gunicorn

(env) xxx@xxx-desktop:/var/www/html/django-project/helloapp$ which pip
/var/www/html/django-project/helloapp/env/bin/pip

【问题讨论】:

which gunicornwhich pippip freeze 的输出是什么...这些命令可能会遇到不同的 Python 或环境 @NickT 请看我上面的编辑。 你能分享你的wsgi文件的完整路径吗!? @DhiaTN 这是/var/www/html/django-project/helloapp/helloapp/wsgi.py 【参考方案1】:

我有同样的问题,我通过删除系统包管理器(apt-get 等)安装的 gunicorn 解决了这个问题。

apt-get 将 gunicorn 安装到 python2 的站点包pipDjango 安装到 python3 的站点包。所以 Gunicorn 和 Django 不在同一个站点包目录中。所以gunicorn找不到django。在同一个包目录中安装 Gunicorn 和 Django 应该可以解决问题。

【讨论】:

【参考方案2】:

/etc/systemd/system/gunicorn.service 中,确保您的工作目录指向您的应用目录。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

【讨论】:

【参考方案3】:

这个特定问题可能不是这种情况但是我遇到了类似的问题,并被谷歌引导到这里。所以我把这个答案放在这里,希望对其他人有用。

对我来说,问题是 gunicorn 是由 globally installed package 运行的,而不是安装在虚拟环境中的那个。要确保您是否是这种情况,只需运行 which gunicorn 并检查它是否来自您的 virtualenv bin 目录。如果它不是来自您的虚拟环境 bin 目录,请按照以下步骤操作:

    停用环境。 deactivate env 已卸载全局安装的 gunicron pip uninstall gunicorn 激活环境。 [我使用 virtualenvwrapper 进行 virtualenv 管理,我建议你这样做。 ] workon env

现在 gunicorn 应该可以正常工作了。

【讨论】:

【参考方案4】:

您实际上应该按如下方式运行它:

gunicorn helloapp.wsgi:application 
gunicorn的基本用法:

gunicorn [OPTIONS] APP_MODULE

其中APP_MODULE$(MODULE_NAME):$(VARIABLE_NAME) 模式

【讨论】:

你激活你的virtualenv了吗?因为它看起来没有找到 django 模块。 但奇怪的是它在我的生产服务器上工作。不在我的本地服务器上 检查这里可能是类似的问题***.com/a/14196195/5658350 在重新启动本地计算机后立即运行。不确定是 django 还是 python 问题。他们只是烦人! 没有必要明确指定“应用程序”。见docs.gunicorn.org/en/stable/run.html#django。这使得这个答案基本上没有答案。【参考方案5】:

目录错误:

检查您的当前目录然后cd 到正确的目录之前 打电话。

示例:

不正确:

~/project_name/main$ gunicorn3 --bind 0.0.0.0:8000 main.wsgi:application

正确:

~/project_name/main$ cd ..
~/project_name$ gunicorn3 --bind 0.0.0.0:8000 main.wsgi:application

【讨论】:

【参考方案6】:

我正在使用诗歌和 pyenv。就我而言,事实证明我正在运行的 gunicorn 实例引用的是系统级安装,而不是安装在虚拟环境中的那个。我通过运行which gunicorn 并将其与pyenv which gunicorn 的输出进行比较来解决这个问题。

为我解决的问题是在做什么

$(pyenv which gunicorn) &lt;app_name&gt;.wsgi:application --bind 0.0.0.0

【讨论】:

【参考方案7】:

正如此处和其他地方所指出的,错误消息指出的问题的根源是gunicorn 找不到 django 模块。那么问题就变成了为什么会这样,并且可能有许多不同的原因。在我的情况下,在没有 virtualenv 的 Ubuntu 仿生主机上,这是因为我安装了 python3-django 和 gunicorn(后者是一个 python2 包)。

解决方案是安装 python3-gunicorn,删除 gunicorn 并以 gunicorn3 运行 gunicorn。

【讨论】:

以上是关于django + virtualenv + gunicorn - 没有名为 django.core.wsgi 的模块?的主要内容,如果未能解决你的问题,请参考以下文章

Django 和 'virtualenv' - 正确的项目结构

django + virtualenv + gunicorn - 没有名为 django.core.wsgi 的模块?

Gunicorn + Django + Virtualenv + init.d 服务(CentOS)

如何使用 virtualenv 在 django 中启动一个新项目

Django—虚拟环境(virtualenv)

使用virtualenv Django 创建应用程序的前期配置