模块 'main' 没有属性 application -- Google App Engine Python with Django

Module 'main' has no attribute application -- Google App Engine Python with Django

我 运行 解决这个问题已经有一段时间了,只是找不到任何解决方案。我正在使用 Google App Engine 来 运行 通过 PyCharm 创建的带有 Django 1.5(通过 GAE SDK)的默认 Python 2.7 应用程序。我可以成功上传应用程序,但在访问实际页面时,出现服务器错误。然后,检查 Google App Engine 中的日志,我看到了这个:

ImportError: <module 'main' from '/base/data/home/apps/s~eloquent-ratio-109701/1.388053784931450315/main.pyc'> has no attribute application

在互联网上搜索了一段时间后,我找到了一些 post 解决这个问题的方法,但尝试它们似乎并没有解决我的问题。例如:This 问题通过在以下行中将 "application" 替换为 "app" 得到解决:

application = django.core.handlers.wsgi.WSGIHandler()
util.run_wsgi_app(application)

事实上,我之前曾 运行 遇到过同样的问题,这个解决方案过去为我提供了修复,但是当时我 运行 使用了一个单独的应用程序,它是不是通过 GAE。

我查看了 1.5 版的 Django 文档 here,但那里的代码和建议似乎与我目前在我的项目中的内容没有冲突。

我阅读了更多有关此类问题的信息,并看到另一个 post 建议检查应用程序的 wsgi.py 文件以确保它被命名为 'application' 或 'app',这样就可以在应用程序的其余部分使用相同的名称。但是,在检查这些设置后,我发现那里也使用了 'application':

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

settings.py 中甚至有一行使用相同的命名法来声明 WSGI 应用程序:

WSGI_APPLICATION = 'Chimera.wsgi.application'

我真的很难调试这个。我觉得它真的很愚蠢,我就是看不到它,但不幸的是我不是特别擅长这种东西——我在这个领域还是有点新手。

有人知道我可以尝试什么来解决这个问题吗?

更新:我开始逐行更改和测试,最终我发现 GAE 日志根据 app.yaml 下 "script" 的输入而变化。因此,如果我在 "main.app" 和 "main.application" 之间更改 "handlers" 下的脚本,它会调整日志输出以分别引用 "app" 或 "application"。所以 app.yaml 文件中的那一行告诉应用程序要查找什么,但我仍然不明白为什么找不到它。不确定我还能更改什么来测试它。我希望我对实际的内部工作原理有更多的了解,这样我就可以弄清楚为什么应用程序对属性感到困惑。它是在实例化之前尝试 运行 还是什么?

源代码如下:

main.py

import os, sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'Chimera.settings'

from google.appengine.ext.webapp import util

from django.conf import settings

settings._target = None

import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

def main():
    application = django.core.handlers.wsgi.WSGIHandler()

    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

app.yaml

application: eloquent-ratio-109701
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.application

libraries:
- name: django
  version: 1.5

wsgi.py

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Chimera.settings")

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

来自 GAE 的完整日志:

Traceback (most recent call last):
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 302, in _LoadHandler
raise err
ImportError: <module 'main' from '/base/data/home/apps/s~eloquent-ratio-109701/1.388053784931450315/main.pyc'> has no attribute application

谢谢你帮我。

根据@DanielRoseman 的评论,我发现在 main() 函数中声明应用会导致问题,因为 app 属性只能在 main() 函数级别访问,因为它是成员main() 的变量而不是全局变量。虽然默认的应用程序文件是由 PyCharm 以这种方式构建的,但它似乎是不正确的。我不确定这是否是兼容性问题,但无论如何,将应用程序声明移到 main() 函数之外会调整范围,从而允许项目的其他部分访问它,从而解决我的问题。

谢谢@DanielRoseman 的评论。

在您的 main.py 文件(即 main 模块)中 applicationmain() 函数中的一个变量,而不是 main 的一个属性模块。基本上你不需要 main() 函数。

GAE 对使用 Django 有一些特定的支持,我强烈建议您阅读 Django Support documentation and the Django App example