处理表单中的用户输入


Python 留言板代码演示的这一部分介绍了如何处理用户输入。

本页面是多页教程中的一页。如需从头开始并查看设置说明,请转到创建留言板

配置应用以使用 webapp2

留言板示例使用 webapp2 框架,该框架包含在 App Engine 环境和 App Engine Python SDK 中。webapp2 无需与应用代码进行捆绑即可使用。

app.yaml 文件指定应用使用 webapp2 框架:

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

webapp2 应用分为两个部分:

  • 一个或多个 RequestHandler 类,用于处理请求和构建响应
  • 一个 WSGIApplication 实例,按照网址将传入请求发送给处理程序

app.yaml 文件将 guestbook.py 中的 app 对象指定为所有网址的处理程序:

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: guestbook.app

定义处理程序以提交表单

guestbook.py 中的 app 对象是一个 WSGIApplication,用于定义哪些脚本处理对给定网址发出的请求。

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

在处理程序遇到错误或引发未捕获的异常时,debug=True 参数会通知 webapp2 将堆栈跟踪输出至浏览器。在部署应用的最终版本之前,应移除此选项,以免无意中暴露应用的内部结构。

Guestbook 处理程序使用的是 post() 方法而不是 get() 方法。这是因为 MainPage 显示的表单使用 HTTP POST 方法来提交表单数据。

class Guestbook(webapp2.RequestHandler):

    def post(self):
        # We set the same parent key on the 'Greeting' to ensure each
        # Greeting is in the same entity group. Queries across the
        # single entity group will be consistent. However, the write
        # rate to a single entity group should be limited to
        # ~1/second.
        guestbook_name = self.request.get('guestbook_name',
                                          DEFAULT_GUESTBOOK_NAME)
        greeting = Greeting(parent=guestbook_key(guestbook_name))

        if users.get_current_user():
            greeting.author = Author(
                    identity=users.get_current_user().user_id(),
                    email=users.get_current_user().email())

        greeting.content = self.request.get('content')
        greeting.put()

        query_params = {'guestbook_name': guestbook_name}
        self.redirect('/?' + urllib.urlencode(query_params))

post() 方法从 self.request 获取表单数据。