【问题标题】:Waitress on Heroku giving errorHeroku上的女服务员给出错误
【发布时间】:2014-05-14 08:02:33
【问题描述】:

我正在尝试在 Heroku 上从 Gunicorn 切换到 Waitress。在日志中,我不断收到来自服务员的错误:

Error: Bad module 'cardisle'

在我的 procfile 中,我有:

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

如果我删除 .wsgi 扩展名,我会得到一个不同的错误:

Error: Bad object name 'application'

我也尝试将对象名称更改为 wsgifunc,因为它在 Waitress 文档中,但没有运气。

任何帮助将不胜感激。我有一个带有以下内容的 wsgi.py 文件:

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

【问题讨论】:

  • +1 我有这个确切的问题。

标签: django heroku procfile waitress


【解决方案1】:

尝试使用:

cardisle:wsgi.application

不是carlisle"."wsgi":"application

【讨论】:

    【解决方案2】:

    这是一个关于女服务员的可怕事实:它向你隐瞒信息。

    如果您查看source,“Bad Module”是“从 wsgi 模块导入您的应用程序失败”的代码。

    要查看错误,尝试:

    1. 使用heroku run bash 登录到测功机
    2. 导航到包含 wsgi.py 的目录(带有cd
    3. python打开一个shell
    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 设置为“本地”(没有相应的要求),因此导入失败。

    您的问题的确切性质会有所不同,但我会提到一个刚开始时让我感到沮丧的案例:

    如果您正在运行web: waitress-serve --port=$PORT cardisle.wsgi:application,您可能需要更改您的 PYTHONPATH 环境变量,以便 PYTHONPATH+cardisle.wsgi 是相关机器上的完整路径。

    今晚我将为服务员打开一个 PR,试图冒泡导入错误。否则祝你好运!

    【讨论】:

    • 我向服务员提出了拉取请求,要求将异常信息添加到错误输出中,维护者喜欢它。我们每个人都做到了!
    【解决方案3】:

    尝试像这样修改你的 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())
    

    这给我带来了麻烦。

    【讨论】:

      【解决方案4】:

      我想我找到了答案。如果您的项目是这样布局的(默认情况下):

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

      试试这个 Procfile:

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

      我想到这个是因为 Dave Hall 的示例项目有不同的布局:

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

      其中有更高级别的wsgi.py 文件。您可能按照他的教程进行了操作,但据我所知,默认的 Django 布局并不像那样工作。

      【讨论】:

        【解决方案5】:

        wsgi.py 文件应该在 cardisle 目录中。女服务员正在尝试导入 cardisle.wsgi。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-17
          • 2017-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-12
          • 1970-01-01
          • 2015-05-07
          相关资源
          最近更新 更多