web-dev-qa-db-fra.com

Heroku - Aucun module nommé wsgi

J'ai suivi le guide de démarrage de Django sur le centre d'assistance Heroku, mais le message d'erreur suivant s'affiche lorsque j'essaie de le démarrer sur Heroku ou avec un contremaître:

ImportError: No module named wsgi

Voici mon procfile:

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

Voici le fichier de configuration de mon projet 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', '[email protected]'),
)

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'

Quelqu'un at-il une idée pourquoi cette application ne démarre pas?

21
Hanpan

C’est une vieille question, mais j’y réponds néanmoins, j’ai fait face récemment à ce problème précis et à la réponse de Intenex bien que ce soit utile, j’ai été incapable de résoudre mon problème.

Comme le souligne Intenex , vous manquez probablement le fichier wsgi.py. Cela peut être dû au fait que vous avez créé votre projet avec Django 1.3 ou une version précédente. Créer un projet en utilisant Django 1.4 crée automatiquement le wsgi.py comme manage.py, settings.py

Contrairement à ce que Intenex a indiqué, voici ce que vous devez faire. En supposant que vous soyez sur Django version 1.3 ou antérieure, créez un fichier wsgi.py dans le répertoire du projet (même répertoire que manage.py etc.) et ajoutez les éléments suivants à votre fichier 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()

Notez la différence entre les deux dernières déclarations par rapport à la réponse d'Intenex.

Avec cela, vous devriez pouvoir exécuter foreman start avec les éléments suivants dans votre Procfile:

web: gunicorn mysite.wsgi

18
Arpit Rai

Il semble que vous n’ayez pas de fichier de module wsgi.py dans votre répertoire de projet. Si vous avez démarré votre projet (avec Django-admin.py startproject project) avec Django version 1.3 ou antérieure, le fichier wsgi n'a pas été créé automatiquement. Vous voudrez le créer vous-même en suivant ce guide:

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

Selon le guide, mettez ceci dans le fichier, en vous assurant de changer le mot "mysite" en nom de projet:

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()

De plus, comme je ne l'ai pas vu dans vos paramètres, vous devez vous assurer que le répertoire de votre projet est inclus dans votre chemin Python, comme indiqué dans la dernière phrase: https://docs.djangoproject.com/fr/ dev/howto/deployment/wsgi/gunicorn/# running-Django-in-gunicorn-as-generic-wsgi-application

Sinon, vous rencontrerez le même problème que celui que j'ai rencontré: Erreur d'importation d'application Python dans Django avec WSGI gunicorn

Après cela, tout devrait fonctionner sans problème. À votre santé!

Note: Vous êtes peut-être déjà capable de lancer gunicorn en changeant votre Procfile en:

web: python manage.py run_gunicorn

selon https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#using-gunicorn-s-Django-integration , mais je ne l'ai pas testé moi-même, donc je ne suis pas sûr . Peut-être encore besoin du module wsgi.py.

4
Intenex

Je viens de rencontrer ce problème; m'a appris que mon fichier Procfile avait l'encodage Windows Format EOL est passé à UNIX EOL - et voilà, ça a marché.

1
karlheinz_sch

Je suis tombé sur cette erreur et la question ci-dessus tout à l'heure. 

Le fichier de paramètres a trouvé une erreur de syntaxe dans la ligne pour ALLOWED_HOSTS. Les descriptions ci-dessus m'aident à m'orienter dans cette direction (au moins en regardant les paramètres). 

Je pensais que cela pourrait aider quelqu'un d'autre ...

1
Minnow

J'ai rencontré cette erreur car j'ai renommé manuellement mon dossier de projet de myproject à myproject_Django, mais je n'ai pas corrigé toutes les références du fichier de paramètres. En particulier,

WSGI_APPLICATION = 'myproject.wsgi.application'

devait être changé pour

WSGI_APPLICATION = 'myproject_Django.wsgi.application'

Encore une fois, il y a quelques références dans ce fichier qui doivent être changées. Il suffit de faire une recherche et de procéder à un remplacement soigneux, un par un.

0
Seth