Tuesday, August 9, 2011

CherryPy Dengan Datastore dan Templating Appengine


Ini adalah tulisan yang masih berhubungan dengan tulisan sebelumnya yang berkaitan dengan penggunaan framework CherryPy di Appengine yang berjudul CherryPy dan Appengine, bisa dibilang ini adalah tulisan pelengkap dari tulisan yang pertama sekaligus saya berikan contoh pengaplikasian sederhana CherryPy di Appengine.

Tulisan sebelumnya saya telah menguraikan 'sedikit' bagaimana memulai menggunakan CherryPy di Appengine yang sebenarnya cukup mudah yaitu cukup memasukan folder yang berisi paket/modul CherryPy kedalam folder project yang kita buat. Yang perlu diperhatikan adalah, untuk saat ini tampaknya Appengine hanya mendukung CherryPy versi 3.1.1 karena setelah saya mencoba menggunakan versi dibawahnya dan versi yang terbaru ( versi 3.2.0) CherryPy tidak dapat digunakan, bila Anda hobi 'ngoprek' silahkan Anda coba dengan membuat patch sendiri seperti yang dibuat oleh salah seorang developer penulis artikel ini.

Untuk akses database dengan CherryPy di Appengine kita bisa menggunakan Datastore Appegine atau bisa juga menggunakan SQLite yang katanya saat ini sudah didukung oleh Appengine sedangkan untuk tampilanya kita bisa menggunakan modul template default Appengine bahkan kita juga bisa menggunakan templating system lainnya yang sudah didukung oleh CherryPy seperti ZPT, Cheetah dan lainnya.

Disini saya akan memberikan contoh project yang menggunakan templating default Appengine dan menggunakan media penyimpanan Datastore Appengine. Seperti biasa, di dalam project Appengine kita harus membuat file konfigurasinya lebih dahulu yang bernama 'app.yaml' seperti berikut :

application: test-cherry
version: 1
runtime: python
api_version: 1
handlers:
- url: /
  script: test.py

Kemudian kita juga harus membuat file konfigurasi untuk aplikasi CherryPy kita, misalnya kita beri nama 'test.conf' yang berisi baris berikut :

[global]
server.socket_host = "127.0.0.1"
server.socket_port = 8080
server.thread_pool = 10

Sekarang kita buat file utama yang berisi kode aplikasi yang akan kita buat tapi saya sarankan Anda sebaiknya sudah menguasai dasar penggunaan CherryPy yang bisa dibaca di dokumentasinya dan sudah memahami penggunaan Datastore dan templating Appengine (Anda bisa membaca tulisan saya sebelumnya berkaitan dengan Datastore dan Templating di Appengine).

Berikut baris kode yang kita buat di dalam file utama aplikasi kita yang diberi nama 'test.py'

# Import CherryPy global namespace
import cherrypy

import os

# Import Appengine Template module
from google.appengine.ext.webapp import template
# Import Appengine Datastore module
from google.appengine.ext import db
# Import Appengine Webapp module
from google.appengine.ext.webapp.util import run_wsgi_app

# Datastore model class
class Test(db.Model):
     nama = db.StringProperty(required=True)
     kelamin = db.StringProperty(required=True)
     umur = db.IntegerProperty(required=True)

# Main class for root
class Test:
    """ Sample request handler class. """
    def index(self):
        # CherryPy will call this method for the root URI ("/") and send
        # its return value to the client. Because this is tutorial
        # lesson number 01, we'll just send something really simple.
        # How about...

        # Query searching data
        query = db.GqlQuery("SELECT * FROM Test")
        result = query.fetch(10) 

       # Templating  
       path = os.path.join(os.path.dirname(__file__), 'index.html') 
       template_values = {
                     result': result,
      

       # View result
       return "<h3>Penggunaan Datastore dan Template Appengine</h3>" + template.render(path, template_values)
        
       # Expose the index method through the web. CherryPy will never
       # publish methods that don't have the exposed attribute set to True.
       index.exposed = True

# Set CherryPy conf file
tutconf = os.path.join(os.path.dirname(__file__), 'test.conf')

# Execute the app
if __name__ == '__main__':
    # CherryPy always starts with app.root when trying to map request URIs
    # to objects, so we need to mount a request handler root. A request
    # to '/' will be mapped to HelloWorld().index().
    run_wsgi_app(cherrypy.tree.mount(Test(),config=tutconf))

Coba Anda perhatikan yang huruf tebal pada baris terakhir, untuk menjalankan aplikasi CherryPy ini kita menggunakan modul Webapp Appengine 'run_wsgi_app(cherrypy.tree.mount(Test(),config=tutconf))'

Untuk dapat menggunakan Datastore, sebelumnya kita harus memiliki data yang telah tersimpan lebih dahulu disini, kita menggunakan entity datastore yang kita beri nama 'Test' dimana untuk membuat dan mengisi datanya harus secara 'programming' dengan menggunakan interactive console pada Appengine Launcher (di Windows), berikut baris kode yang saya ambil dari tulisan saya sebelumnya yang berkaitan dengan Datastore :

from google.appengine.ext import db
class Test(db.Model):
    nama = db.StringProperty(required=True)
    kelamin = db.StringProperty(required=True)
    umur = db.IntegerProperty(required=True)

##Memasukan satu baris data dengan memasukan datanya langsung
##lewat argumen pada Model yang kita buat
inputTest = Test(nama="PUPUT", kelamin="P", umur=26)

inputTest.put()

db.put(inputTest)

Setelah Entity datastore terbentuk dan terisi data, sekarang kita membuat template halaman html yang akan kita gunakan untuk menampilkan data yang sudah kita simpan di datastore yang kita beri nama 'index.html', berikut templatenya :

{% for results in result %}
Nama : <b>{{ results.nama }}</b>
Kelamin : {{ results.kelamin }}
Umur : {{ results.umur }}
{% endfor %}

Setelah file aplikasi, template dan konfigurasi sudah kita buat berarti sekarang di dalam folder project kita sudah terdapat empat file yang terdiri dari ; test.py, app.yaml, test.conf dan index.html juga folder modul cherrypy yang kita ambil dari hasil download dari situs CherryPy.org (Source code lengkap bisa di download di sini).

Berikut hasil aplikasi yang sudah kita buat :


No comments: