Monday, November 22, 2010

Request 'POST' dan 'GET' Di Pemrograman Python

Bila di tulisan sebelumnya saya sudah menguraikan tentang templating HTML maka di sini saya akan sedikit menguraikan tentang pemrosesan data dari 'form' dan penanganan request 'POST' dan 'GET'.

Sebuah webapp framework yang kita buat di AppEngine mampu menangani berbagai request yang diterima lewat HTTP dengan menggunakan metode dari class webapp, antara lain get(), post(), head(), options(), put(), delete(), dan trace().

Tapi disini saya hanya akan memberikan contoh sederhana untuk penanganan request yang paling banyak kita gunakan, yaitu post() dan get(). Metode 'POST' sering digunakan untuk penanganan request lewat 'form' sedangkan request 'GET' banyak digunakan untuk penanganan request lewat 'url query'.

Request 'POST' dan 'FORM'

Seperti yang sudah dijelaskan di atas, request 'POST' banyak digunakan untuk menangani pemrosesan data lewat 'form'. Dibawah ini adalah template form dalam contoh yang akan kita bahas disini dan kita simpan dengan nama file 'form_template.html' :

<html>
<head>
<title>Working with Form</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form name="form1" method="post" action="./process">
<table width="100%" cellpadding="5">
<tr>
<td width="23%"><h3>Masukan nama Anda</h3></td>
<td width="77%"><input name="nameTxt" type="text" size="50">
<input type="submit" name="Submit" value="Submit"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</form>
</body>
</html>

 

Sedangkan ini adalah template untuk menampung hasil pemrosesan form
yang kita simpan dengan nama file 'post_result.html' yang sudah kita sematkan kode Python yang diapit dengan tag '{%' dan '%}' karena kita akan menggunakan modul template Django :

<html>
<head>
<title>Process Result</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
  {% if the_name %}
<h3>Hello {{ the_name }} thanks for visiting, <a href="./">back</a></h3>
  {% else %}
<h3>Please insert Your name, <a href="./post">back</a></h3>
  {% endif %}
</body>
</html>

Berikut kelas yang akan menangani request dari 'form' di atas :

class PostResultHandler(webapp.RequestHandler):
    def post(self):
        nama = self.request.get('nameTxt')
        the_value = {'the_name' : nama}
        path = os.path.join(os.path.dirname(__file__), 'post_result.html')
        self.response.out.write(template.render(path, the_value))

Coba perhatikan fungsi kelas di atas 'def post(self)', fungsi ini akan menangani data dengan metode 'POST' dan nilai yang tersimpan di dalam input form dengan nama 'nameTxt' akan 'ditangkap' dengan baris kode berikut :

nama = self.request.get('nameTxt')

Dan dimasukan kedalam variabel 'the_value' dengan tipe data dictionary kemudian di masukan ke dalam template dengan menggunakan modul templating Django :

the_value = {'the_name' : nama}
path = os.path.join(os.path.dirname(__file__), 'post_result.html')
self.response.out.write(template.render(path, the_value))
 



Request GET dan URL QUERY

Yang perlu diperhatikan, penentuan URL pada pemrograman aplikasi web pada pemrograman Python semuanya di-mapping saat pendeklarasian objek kelas WSGIApplication di fungsi 'main' dan dalam file 'app.yml' dan jangan lupa bahwa untuk mapping URL ini juga membutuhkan pengetahuan regular expression Python.

Dicontoh ini akan menggunakan query yang sederhana seperti berikut :

http://localhost:8080/get/BERHASIL



Dimana 'BERHASIL' adalah data string yang akan kita gunakan dalam pemrosesan, untuk mendapatkan hasil query dari URL tersebut kita mengatur mapping pada app.yaml, seperti berikut :

- url: /get/(.*)
  script: main.p
y

Sedangkan pada objek kelas WSGIApplication kita set seperti berikut (lihat yang di huruf tebal) :

def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                          ('/post', FormHandler),
                                          (r'/get/(.*)', GetResultHandler),
                                          ('/post_result', PostResultHandler)],
                                         debug=True)

Karena disini hanya mengulas pananganan request 'GET' maka kita hanya membutuhkan satu template untuk melihat hasil pemrosesan query yang kita buat di atas, berikut contohnya :

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h3>Contoh request 'GET'</h3>
  Akses Query Anda : {{ query_result }}<br>
<p><a href="../"><b>Kembali</b></a></p>
</body>
</html>

String 'query_result' yang diapit tag '{}' adalah variabel yang akan menampung hasil pemrosesan query yang kita lakukan dengan modul Django template, dalam contoh ini kita hanya ingin menampilkan data string query yang kita berikan, yaitu 'BERHASIL'.

Berikut kelas yang akan digunakan untuk memproses query string  yang kita berikan :

class GetResultHandler(webapp.RequestHandler):
    def get(self,q):
        the_value = {'query_result' : q}
        path = os.path.join(os.path.dirname(__file__), 'get_result.html')
        self.response.out.write(template.render(path, the_value))

Di sini, data query string yang kita berikan akan di proses dalam kelas ini dengan memasukan variabel 'q' sebagai argumen dalam fungsi get() untuk menampung query string yang kita berikan dan akan di proses serta dimasukan ke dalam template.

Versi PDF dari tulisan ini bisa Anda dapatkan di sini dan contoh program lengkapnya bisa diunduh disini

No comments: