Python ImportError:Google app引擎项目中没有名为main的模块

时间:2013-03-30 19:57:58

标签: python google-app-engine

我有以下app.yaml文件

application: gtryapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:

- url: /images/(.*\.(gif|png|jpg))
  static_files: static/img/\1
  upload: static/img/(.*\.(gif|png|jpg))

- url: /css/(.*\.css)
  mime_type: text/css
  static_files: static/css/\1
  upload: static/css/(.*\.css)

- url: /js/(.*\.js)
  mime_type: text/javascript
  static_files: static/js/\1
  upload: static/js/(.*\.js)

- url: /(.*\.html)
  mime_type: text/html
  static_files: static/\1
  upload: static/(.*\.html)

- url: .*
  script: main.app


libraries:

- name: webapp2
  version: "2.5.2"

文件app.py:

import webapp2

class MainPage(webapp2.RequestHandler):
def get(self):
    if self.request.url.endswith('/'):
        path = '%sindex.html'%self.request.url
    else:
        path = '%s/index.html'%self.request.url

    self.redirect(path)


    application = webapp2.WSGIApplication([('/.*', MainPage)],
                                     debug=True)

我应该部署的文件只是html文件或js或图像,编译应用程序后出现以下错误:

引发ImportError('%s没有属性%s'%(处理程序,名称)) ImportError:没有属性应用


解决:我不得不称“app”而非“应用程序”!

    app = webapp2.WSGIApplication([('/.*', MainPage)],
                                     debug=True)

2 个答案:

答案 0 :(得分:6)

你已经调用了index.py文件,而不是main.py.重命名,或在yaml中使用index.app

答案 1 :(得分:2)

您遇到的问题是您的app.yaml文件无法正确描述您的代码。这是令人讨厌的一点:

- url: .*
  script: main.app

这表示所有与先前条目不匹配的URL应由app模块的main对象处理,该对象应该是WSGI应用程序对象(请参阅WSGI标准)。

这不起作用,因为您的代码设置不同。您的主要模块位于index.pyindex模块)中,其与服务器的接口是通过CGI标准(尽管WSGI在内部使用)。

所以,你需要改变一些东西。它可以是应用程序的app.yaml描述,也可以是代码的组织。

使您的代码作为CGI风格的程序工作很容易。只需将app.yaml更改为指向index.py作为脚本即可。在这种情况下,.py部分是文件扩展名,文件将作为脚本运行。

如果您想使用更新的WSGI兼容样式(这可能是最佳选择),the documentation建议使用以下格式:

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello, webapp World!')

app = webapp2.WSGIApplication([('/', MainPage)])

你的代码已经差不多了。要使其工作,请删除main函数和if __name__ == "__main__"样板。替换为:

app = webapp.WSGIApplication([('/.*', IndexHandler)],
                              debug=False)

这会在模块的顶层创建一个app对象。现在,将index.py文件重命名为main.py,或将app.yaml更改为index.app。这次的.app部分不同。它代表Python成员访问(在这种情况下,访问模块中的全局变量)而不是文件扩展名。