Официантка на Heroku дает ошибку

Я пытаюсь переключиться с Gunicorn на официантку на Heroku. В журналах я получаю сообщение об ошибке от Waitress:

Error: Bad module 'cardisle'

В моем профиле у меня есть:

web: waitress-serve --port=$PORT cardisle.wsgi:application

Если я удалю .wsgi расширение, я получаю другую ошибку:

Error: Bad object name 'application'

Я попытался изменить имя объекта на wsgifunc также, поскольку это находится в доке Официантки, но не повезло.

Любая помощь будет оценена. У меня есть файл wsgi.py со следующим:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cardisle.settings")
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

4 ответа

Решение

Вот ужасный факт о официантке: она скрывает от вас информацию.

Если вы посмотрите на источник, "Плохой модуль" - это код "Произошла ошибка при импорте приложения из модуля wsgi".

Чтобы увидеть ошибку, попробуйте:

  1. вход в динамо с heroku run bash
  2. перейти к каталогу с wsgi.py в нем (с cd)
  3. открывая раковину с python
  4. Бег import wsgi

Когда я нажал эту ошибку и сделал это, я получил:

~/proj/proj $ python

Python 2.7.9 (default, Dec 11 2014, 17:18:51) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wsgi

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "wsgi.py", line 36, in <module>
    application = get_wsgi_application()
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
    django.setup()
  File "/app/.heroku/python/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/apps/config.py", line 86, in create
    module = import_module(entry)
  File "/app/.heroku/python/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)

ImportError: No module named debug_toolbar

Что гораздо более полезная ошибка. В моем случае я установил для DJANGO_SETTINGS_MODULE значение "local" в производстве (к которому не предъявлялись соответствующие требования), поэтому импорт не удался.

Точная природа вашей проблемы будет отличаться, но я упомяну случай, который разочаровал меня, когда я начал:

Если вы работаете web: waitress-serve --port=$PORT cardisle.wsgi:applicationвам может потребоваться изменить переменную среды PYTHONPATH, чтобы PYTHONPATH+cardisle.wsgi был полностью сформированным существующим путем на рассматриваемой машине.

Сегодня вечером я открою пиар для официантки, которая пытается всплыть из-за ошибки импорта. Удачи в противном случае!

Файл wsgi.py должен находиться в каталоге cardisle. Официантка пытается импортировать cardisle.wsgi.

Я думаю, что нашел ответ. Если ваш проект выложен так (как они есть по умолчанию):

cardisle/
  cardisle/
    wsgi.py
  app1/
  app2/
  app3/

Попробуйте этот Procfile вместо:

web: waitress-serve --port=$PORT cardisle.cardisle.wsgi:application

Я думал об этом, потому что пример проекта Дэйва Холла имеет другую структуру:

projectname/
  wsgi.py
  apps/
    app1/
    app2/
    app3/

Который имеет wsgi.py файл на более высоком уровне. Вы, вероятно, следовали его руководству, но, насколько я могу судить, макет Django по умолчанию не совсем так работает.

Попробуй использовать:

cardisle:wsgi.application

Не carlisle"."wsgi":"application

Попробуйте изменить файл WSGI следующим образом (для Django 1.7):

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

У меня была та же ошибка, потому что раньше мой Procfile был настроен так, как описано в руководстве Heroku:

 from django.core.wsgi import get_wsgi_application
 from dj_static import Cling

 application = Cling(get_wsgi_application())

И это было причиной проблемы для меня.

Другие вопросы по тегам