====== Google App Engine入门(二):webapp 框架 ====== CGI 标准很简单,但是手动编写使用该标准的所有代码将非常麻烦。网络应用程序框架可以为您处理这些琐碎的事情,以便您可以将开发精力集中在应用程序的功能上。 Google App Engine 支持用纯 Python(符合 CGI)编写的任何框架(以及使用 CGI 适配器的与 [[http://www.python.org/dev/peps/pep-0333/|WSGI]] 兼容的框架),包括 [[http://www.djangoproject.com/|Django]]、[[http://www.cherrypy.org/|CherryPy]]、[[http://www.cherrypy.org/|Pylons]] 和 [[http://webpy.org/|web.py]]。可以通过将应用程序代码复制到应用程序目录来捆绑所选框架和应用程序代码。 App Engine 包括其自己的简单网络应用程序框架,称为 webapp。webapp 框架已安装在 App Engine 环境和 SDK 中,因此无需将其与应用程序代码捆绑即可使用。我们将使用 webapp 学习本教程的剩余部分。 ===== webapp 简单应用 ===== 一个 webapp 应用程序包含三部分: * 一个或多个RequestHandler类,用于处理请求和构建响应 * 一个 WSGIApplication 实例,按照网址将收到的请求发送给处理程序 * 一个主要例行程序,用于使用 CGI 适配器运行 WSGIApplication 现在让我们将友好的问候语重新编写为一个 webapp 应用程序。编辑 helloworld/helloworld.py,并将其内容替换为以下内容: from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, webapp World!') application = webapp.WSGIApplication( [('/', MainPage)], debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main() ===== Google App Enging 中 webapp 的功能 ===== webapp 模块位于 google.appengine.ext 包中。SDK 以及生产运行时环境中均提供该模块。 该代码定义一个映射到根网址 (/) 的请求处理程序 MainPage。当 webapp 收到网址 / 的 HTTP GET 请求时,它会将 MainPage 类实例化并调用该实例的 get 方法。在该方法中,可以使用 self.request 获得有关请求的信息。通常情况下,该方法在 self.response 上设置属性以准备响应,然后退出。webapp 将基于 MainPage 实例的最终状态发送响应。 应用程序本身由 webapp.WSGIApplication 实例表示。如果处理程序遇到错误或引发未捕捉的异常,则传递给其构造函数的参数 debug=true 将通知 webapp 将堆栈记录打印到浏览器输出。您可能需要从应用程序的最终版本中删除此选项。 函数 run_wsgi_app() 使用 WSGIApplication 实例(或其他与 WSGI 兼容的应用程序对象)并在 App Engine 的 CGI 环境中运行此实例。run_wsgi_app() 与 Python 标准库中的 wsgiref 模块提供的从 WSGI 到 CGI 的适配器相似,但前者包含其他几个功能。例如,它可自动检测应用程序是在开发服务器中运行还是在 App Engine 上运行,如果在开发服务器上运行,则在浏览器中显示错误。