Como manipular dados inseridos pelo usuário em um formulário


Nesta parte das instruções do código do livro de visitas do Python, veja como processar a entrada do usuário.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, acesse Como criar um livro de visitas.

Como configurar o app para usar webapp2

A amostra do livro de visitas usa o framework webapp2, incluído no ambiente do App Engine, e o SDK do App Engine para Python. Não é necessário agrupar o webapp2 com o código do aplicativo para usá-lo.

O arquivo app.yaml especifica que o aplicativo usa a estrutura webapp2:

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

Um aplicativo webapp2 tem duas partes:

  • uma ou mais classes RequestHandler que processam solicitações e constroem respostas
  • uma instância WSGIApplication que direciona solicitações recebidas para manipuladores baseados no URL

O arquivo app.yaml especifica o objeto app em guestbook.py como o manipulador de todos os URLs:

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

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: guestbook.app

Como definir um gerenciador para envio de formulário

O objeto app em guestbook.py é um WSGIApplication que define quais scripts processam solicitações para determinados URLs.

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

O parâmetro debug=True informa webapp2 para imprimir rastreamentos de pilha para a saída do navegador se um manipulador encontrar um erro ou disparar uma exceção não capturada. Essa opção precisará ser removida antes de implantar a versão final do aplicativo. Do contrário, você vai expor inadvertidamente os componentes internos do aplicativo.

O manipulador do Guestbook tem um método post() em vez de um método get(). Isso ocorre porque o formulário exibido por MainPage usa o método HTTP POST para enviar os dados do formulário.

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

O método post() recebe os dados do formulário de self.request.