Menangani Input Pengguna dalam Formulir


Bagian panduan kode Buku Tamu Python ini menunjukkan cara menangani input pengguna.

Halaman ini adalah bagian dari tutorial multi-halaman. Untuk memulai dari awal dan melihat petunjuk penyiapan, buka Membuat Buku Tamu.

Mengonfigurasi aplikasi untuk menggunakan webapp2

Contoh Buku Tamu menggunakan framework webapp2, yang disertakan di lingkungan App Engine dan App Engine Python SDK. Anda tidak perlu menggabungkan webapp2 dengan kode aplikasi Anda untuk menggunakannya.

File app.yaml menentukan bahwa aplikasi menggunakan framework webapp2:

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

Aplikasi webapp2 memiliki dua bagian:

  • Satu atau beberapa class RequestHandler yang memproses permintaan dan membuat respons.
  • Instance WSGIApplication yang mengarahkan permintaan masuk ke pengendali berdasarkan URL.

File app.yaml menentukan objek app di guestbook.py sebagai pengendali untuk semua URL:

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

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: guestbook.app

Menentukan pengendali untuk pengiriman formulir

Objek app di guestbook.py adalah WSGIApplication yang menentukan skrip mana yang menangani permintaan untuk URL yang ditentukan.

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

Parameter debug=True memberi tahu webapp2 untuk mencetak stack trace ke output browser jika pengendali mengalami error atau memunculkan pengecualian yang tidak tertangkap. Opsi ini harus dihapus sebelum men-deploy versi final aplikasi. Jika tidak, Anda akan secara tidak sengaja mengekspos bagian dalam aplikasi Anda.

Pengendali Guestbook memiliki metode post(), bukan metode get(). Hal ini karena formulir yang ditampilkan oleh MainPage menggunakan metode HTTP POST untuk mengirimkan data formulir.

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

Metode post() mendapatkan data formulir dari self.request.