11

我正在尝试从 Gunicorn 切换到 Heroku 上的 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()
4

5 回答 5

13

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

如果您查看源代码,“Bad Module”是“从 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 设置为“本地”(没有适当的要求),因此导入失败。

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

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

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

于 2015-05-16T22:02:37.177 回答
0

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

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 布局并不像那样工作。

于 2014-08-12T08:22:00.043 回答
0

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

这给我带来了一个问题。

于 2015-02-24T02:11:35.833 回答
0

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

于 2014-04-11T00:57:24.923 回答
0

尝试使用:

cardisle:wsgi.application

不是carlisle"."wsgi":"application

于 2020-10-07T14:35:00.093 回答