Heroku - 没有名为 wsgi 的模块

Posted

技术标签:

【中文标题】Heroku - 没有名为 wsgi 的模块【英文标题】:Heroku - No module named wsgi 【发布时间】:2012-07-16 22:52:33 【问题描述】:

我按照 Heroku 支持中心上的 Django 入门指南进行操作,但是当我尝试在 Heroku 或工头上启动它时出现以下错误:

ImportError: No module named wsgi

这是我的过程文件:

web: gunicorn testproject.wsgi -b 0.0.0.0:$PORT

这是我的 django 项目设置文件:

from datetime import date, timedelta
import os
oneyr = date.today() + timedelta(days=365)
PROJECT_DIR = os.path.dirname(__file__)

DEBUG = os.environ.get('DEBUG')
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

TIME_ZONE = 'Europe/London'
LANGUAGE_CODE = 'en-gb'
USE_I18N = False
USE_L10N = True

MEDIA_ROOT = os.path.join(PROJECT_DIR, 'static/')
MEDIA_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static/'),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'testproject.urls'

TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates')
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'gunicorn',
    'storages',
)

STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

有人知道为什么这个应用程序无法启动吗?

【问题讨论】:

对于初学者,您应该将您的 Procfile 更改为:web: gunicorn testproject.wsgi -b $PORT 假设 django 1.4 是 Heroku 教程中的内容。你的/testproject/testproject/ 目录中有wsgi.py 吗? 您能否将下面的答案标记为已接受的答案,因为它似乎对很多人都有效? 【参考方案1】:

这是一个老问题,但我仍然在回答它,因为我最近遇到了这个确切的问题,Intenex 的回答虽然有帮助但无法解决我的问题。

正如Intenex 所指出的,您可能缺少wsgi.py 文件。这可能是因为您使用 Django 1.3 或以前的版本创建了项目。使用 Django 1.4 创建项目会自动创建wsgi.py,就像manage.pysettings.py 一样。

与Intenex 指出的不同,这是您应该做的。假设您使用的是 Django 1.3 或更早版本,请在项目目录中创建 wsgi.py 文件(与 manage.py 等相同的目录)并将以下内容添加到您的 wsgi.py 文件中:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

请注意最后两条语句与 Intenex 的答案的区别。

有了这个,你应该能够在你的 Procfile 中运行foreman start

web: gunicorn mysite.wsgi

【讨论】:

你的回答让我知道了如何解决这个问题:在没有格式的 Procfile 中,我不得不将 web: gunicorn web_application.wsgi 更改为 web: gunicorn my_project.wsgi【参考方案2】:

您的项目目录中似乎没有 wsgi.py 模块文件。如果您使用 Django 1.3 或更早版本启动项目(使用 django-admin.py startproject 项目),则不会自动创建 wsgi 文件。您需要按照本指南自己创建它:

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/

按照指南,将其放入文件中,确保将“mysite”更改为您的项目名称:

import os

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

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

另外,由于我没有在您的设置中看到这一点,您需要确保您的项目目录包含在您的 Python 路径中,按照此处的最后一句话:https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#running-django-in-gunicorn-as-a-generic-wsgi-application

否则你会遇到和我一样的问题: Python app import error in Django with WSGI gunicorn

之后,一切都应该顺利进行。干杯!

旁注:您可能已经可以通过将 Procfile 更改为来运行 gunicorn:

web: python manage.py run_gunicorn

根据https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#using-gunicorn-s-django-integration,但我自己没有测试过,所以不确定。可能仍然需要 wsgi.py 模块。

【讨论】:

【参考方案3】:

刚刚遇到这个问题;我突然想到我的 Procfile 有 Windows 格式 EOL 编码;切换到 UNIX EOL - 瞧,工作了。

【讨论】:

使用您喜欢的编辑器(例如,Windows 上的 Notepad++),并更改“行尾编码”。【参考方案4】:

刚刚遇到这个错误和上面的问题。

发现设置文件在ALLOWED_HOSTS 的行中有语法错误。上面的描述帮助我指出了那个方向(至少看看设置)。

认为它可能会帮助其他人......

【讨论】:

【参考方案5】:

我遇到了这个错误,因为我手动将我的项目文件夹从 myproject 重命名为 myproject_django,但我没有修复设置文件中的所有引用。特别是,

WSGI_APPLICATION = 'myproject.wsgi.application'

需要改成

WSGI_APPLICATION = 'myproject_django.wsgi.application'

同样,该文件中有一些引用需要更改。只需进行搜索并仔细地逐一替换即可。

【讨论】:

【参考方案6】:

我也遇到了这个错误,其他解决方案都没有解决。 我的问题的根源是我通过 apt-get 安装了 gunicorn。为了解决这个问题,我通过 apt 删除了 gunicorn 并运行 pip install gunicorn

【讨论】:

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

ImportError:没有名为 django.core.wsgi 的模块

mod_wsgi:ImportError:没有名为“编码”的模块

Flask - WSGI - 没有名为“flask”的模块

无法启动 Gunicorn,ModuleNotFoundError:没有名为“myproject.wsgi”的模块

mod_wsgi 错误:ModuleNotFoundError:没有名为“django”的模块

ImportError:没有名为 django.core.wsgi 的模块 Apache + VirtualEnv + AWS + WSGI