Heroku - 没有名为wsgi的模块

时间:2012-07-17 23:31:27

标签: django heroku gunicorn

我跟随Heroku支持中心的Django入门指南,但是当我尝试在Heroku或工头上启动它时,我收到以下错误:

ImportError: No module named wsgi

这是我的procfile:

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'

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

6 个答案:

答案 0 :(得分:18)

这是一个老问题,但我正在回应它,因为我最近遇到了这个确切的问题而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

答案 1 :(得分:4)

您的项目目录中似乎没有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模块。

答案 2 :(得分:1)

刚遇到这个问题;我发现我的Procfile有Windows格式EOL编码;切换到UNIX EOL - 和voilà,工作。

答案 3 :(得分:1)

刚刚遇到此错误和上述问题。

发现设置文件在ALLOWED_HOSTS的行中有语法错误。以上描述有助于指明我的方​​向(至少查看设置)。

认为这可能有助于其他人......

答案 4 :(得分:0)

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

WSGI_APPLICATION = 'myproject.wsgi.application'

需要更改为

WSGI_APPLICATION = 'myproject_django.wsgi.application'

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

答案 5 :(得分:0)

我也有此错误,其他解决方案也没有解决。 问题的根源是我通过apt-get安装了gunicorn。为了解决此问题,我通过apt移除了gunicorn,然后运行pip install gunicorn