Gestione dell'input utente in un modulo


Questa parte della procedura dettagliata del codice del guestbook Python mostra come gestire l'input utente.

Questa pagina fa parte di un tutorial multi pagina. Per partire dall'inizio e vedere le istruzioni per la configurazione, vai a Creare un guestbook.

Configurazione dell'app per l'uso di webapp2

L'esempio di guestbook utilizza il framework webapp2, incluso nell'ambiente App Engine e nell'SDK Python di App Engine. Non è necessario raggruppare webapp2 con il codice dell'applicazione per utilizzarlo.

Il file app.yaml specifica che l'app utilizza il framework webapp2:

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

Un'applicazione webapp2 è composta da due parti:

  • Una o più classi RequestHandler che elaborano richieste e creano risposte.
  • Un'istanza WSGIApplication che instrada le richieste in entrata ai gestori in base all'URL.

Il file app.yaml specifica l'oggetto app in guestbook.py come gestore per tutti gli URL:

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

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: guestbook.app

Definizione di un gestore per l'invio del modulo

L'oggetto app in guestbook.py è un WSGIApplication che definisce quali script gestiscono le richieste per determinati URL.

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

Il parametro debug=True indica a webapp2 di stampare le tracce dello stack sull'output del browser se un gestore rileva un errore o genera un'eccezione non rilevata. Questa opzione deve essere rimossa prima di eseguire il deployment della versione finale dell'applicazione, altrimenti esporrai inavvertitamente gli elementi interni dell'applicazione.

Il gestore Guestbook ha un metodo post() anziché un metodo get(). Questo perché il modulo visualizzato da MainPage utilizza il metodo HTTP POST per inviare i dati del modulo.

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

Il metodo post() recupera i dati del modulo da self.request.