4

我有以下 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 或图像,编译应用程序后出现以下错误:

raise ImportError('%s has no attribute %s' % (handler, name)) ImportError: has no attribute app


已解决:我不得不调用“应用程序”而不是“应用程序”!

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

2 回答 2

8

您调用了文件 index.py,而不是 main.py。重命名它,或者index.app在 yaml 中使用。

于 2013-03-30T20:08:28.693 回答
2

您遇到的问题是您的app.yaml文件没有正确描述您的代码。这是有问题的位:

- url: .*
  script: main.app

This says that all URLs that were not matched by some previous entry should be handled by the app object of the main module, which should be a WSGI application object (see the WSGI standard).

This doesn't work because your code is set up differently. Your primary module is in index.py (the index module) and its interface with the server is via the CGI standard (though WSGI is used internally).

So, you need to change something. It could either be the app.yaml description of the app, or it could be the organization of your code.

Making your code work as a CGI-style program is easy. Just change app.yaml to point to index.py as the script. The .py part in this case is the file extension, and the file will be run as a script.

If instead you want to go with the newer, WSGI-compatible style (which is probably the best option), the documentation suggests the following format:

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)])

Your code is almost like this already. To make it work, get rid of your main function and if __name__ == "__main__" boilerplate. Replace it with:

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

This creates an app object at the top level of your module. Now, either rename your index.py file to main.py, or change app.yaml to point to index.app. The .app part of this is different this time. Rather than a file extension, it represents Python member access (in this case, accessing a global variable in a module).

于 2013-03-30T20:46:46.480 回答