模块';主要';没有属性应用程序--带有Django的Google应用程序引擎Python

模块';主要';没有属性应用程序--带有Django的Google应用程序引擎Python,django,python-2.7,google-app-engine,wsgi,importerror,Django,Python 2.7,Google App Engine,Wsgi,Importerror,我遇到这个问题已经有一段时间了,但在任何地方都找不到解决方案。我正在使用GoogleAppEngine运行一个默认的Python2.7应用程序,其中Django1.5(通过GAESDK)是通过PyCharm创建的。我可以成功上传应用程序,但在访问实际页面时,我收到一个服务器错误。然后,检查Google App Engine中的日志,我看到: ImportError: <module 'main' from '/base/data/home/apps/s~eloquent-ratio-109

我遇到这个问题已经有一段时间了,但在任何地方都找不到解决方案。我正在使用GoogleAppEngine运行一个默认的Python2.7应用程序,其中Django1.5(通过GAESDK)是通过PyCharm创建的。我可以成功上传应用程序,但在访问实际页面时,我收到一个服务器错误。然后,检查Google App Engine中的日志,我看到:

ImportError: <module 'main' from '/base/data/home/apps/s~eloquent-ratio-109701/1.388053784931450315/main.pyc'> has no attribute application
事实上,我以前也遇到过同样的问题,这个解决方案在过去为我提供了一个解决方案,但是当时我运行的是一个单独的应用程序,而不是通过GAE

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

我读了更多关于这类问题的文章,看到另一篇文章建议检查应用程序的wsgi.py文件,以确保它分别命名为“application”或“app”,这样就可以在应用程序的其余部分使用相同的名称。然而,在检查这些设置时,我看到“应用程序”也在那里使用:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
settings.py中甚至有一行使用相同的术语来声明WSGI应用程序:

WSGI_APPLICATION = 'Chimera.wsgi.application'
我真的很难调试这个。我觉得这真的很愚蠢,我就是看不出来,但不幸的是,我不是特别擅长这类东西——我在这一领域还是有点新手

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

更新:我开始逐行进行更改和测试,最终发现GAE日志会根据app.yaml下“脚本”的输入进行更改。因此,如果我在“handlers”下的“main.app”和“main.application”之间更改脚本,它会调整日志输出,分别引用“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
回溯(最近一次呼叫最后一次):
文件“/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py”,第240行,在Handle中
handler=\u config\u handle.add\u wsgi\u中间件(self.\u LoadHandler())
文件“/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py”,第302行,在_LoadHandler中
提出错误
ImportError:没有属性应用程序

感谢您的帮助。

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


感谢@DanielRoseman的评论。

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


感谢@DanielRoseman的评论。

main.py
文件中(即
main
模块)
应用程序是
main()
函数中的变量,而不是
main
模块的属性。基本上,您不需要
main()
函数


GAE对使用Django有一些特定的支持,我强烈建议您仔细阅读文档和
main.py
文件中的。

(即
main
模块)
application
main()
函数中的变量,而不是
main
模块的属性。基本上,您不需要
main()
函数


GAE对使用Django有一些特定的支持,我强烈建议阅读文档和.

,因为“应用程序”只存在于该模块的main()函数中。@DanielRoseman将声明移到main()函数之外实际上对我有用,这很有意义。我不知道为什么我以前没有想到它。但是,我仍然不太明白为什么默认应用程序会将声明放在那里。有什么原因吗?非常感谢您的评论。因为“应用程序”只存在于该模块的main()函数中。@DanielRoseman将声明移到main()函数之外实际上对我很有用,这很有意义。我不知道为什么我以前没有想到它。但是,我仍然不太明白为什么默认应用程序会将声明放在那里。有什么原因吗?非常感谢你的评论。
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