Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
369 lines (267 sloc) 12.5 KB
layout title
default
Tutorial web.py 0.3

Tutorial

Bahasa Lain : Inggris | China 简体中文 | Perancis | ...

Ringkasan

Memulai

Jadi Anda mengerti Python dan ingin membuat sebuah website. web.py menyediakan kode untuk membuatnya mudah.

Apabila Anda ingin mengikuti keseluruhan tutorial, Anda perlu menginstall Python, web.py, flup, psycopg2 dan PostgreSQL (atau database yang ekuivalen dan driver untuk Python). Lihatlah halaman install untuk detilnya.

Mari kita mulai.

Penanganan URL

Bagian paling penting dari setiap website adalah struktur URL yang digunakan. URL yang Anda gunakan bukan saja merupakan sesuatu yang pengunjung Anda lihat dan email ke teman-temannya, namun juga merupakan model mental dari bagaimana website Anda bekerja. Pada website populer seperti del.icio.us, URL bahkan merupakan bagian dari user interface. web.py memudahkan kita untuk membuat URL yang bagus.

Untuk memulai aplikasi web.py Anda, buatlah file teks baru (mari kita beri nama code.py) dan ketikkan:

import web

Ini akan mengimport modul web.py.

Sekarang, kita perlu beri tahu web.py tentang struktur URL kita. Mari kita mulai dengan yang sederhana:

urls = (
  '/', 'index'
)

Bagian pertama merupakan regular expressions yang cocok dengan sebuah URL, seperti /, /help/faq, /item(\d+) dan sebagainya (contoh: \d+ akan cocok dengan deretan digit). Tanda kurung akan cocok dengan bagian dari data untuk dipergunakan nantinya. Bagian kedua merupakan nama class di mana request akan dikirim, seperti index, view, welcomes.hello (yang akan merujuk pada class hello dari modul welcomes),atau get_\1. \1 akan digantikan dengan tangkapan pertama dari regular expression yang digunakan; tangkapan lainnya akan dilewatkan ke fungsi yang Anda buat.

Baris ini menyatakan bahwa kita ingin agar URL / (contoh: halaman depan sebuah website) akan ditangani oleh class dengan nama index.

GET dan POST: perbedaannya

Sekarang kita ingin menulis class index. Walau sebagian besar pengunjung tidak memperhatikan pada saat browsing, browser Anda mempergunakan bahasa yang dikenal sebagai HTTP untuk berkomunikasi dengan World Wide Web. Detilnya memang tidak penting, tapi pada dasarnya, pengunjung web meminta kepada web server untuk melakukan fungsi tertentu (seperti GET atau POST) pada URL (seperti / atau /foo?f=1).

GET, yang kita kenal, akan meminta teks dari halaman web. Pada saat Anda mengetikkan harvard.edu di web browser Anda, browser tersebut akan meminta kepada web server Harvard untuk GET /. Yang kita kenal juga, POST, umum digunakan pada saat mengirimkan form-form tertentu, seperti pada saat berbelanja online. Anda menggunakan POST pada saat aksi dari pengiriman sebuah request akan melakukan sesuatu (seperti charge kartu kredit atau memroses sebuah order). Perhatikanlah, karena URL GET dapat diindeks oleh search engine, yang mana umumnya Anda
inginkan untuk sebagian besar halaman Anda, tapi tidak Anda inginkan untuk hal-hal seperti memroses order (bayangkan jika Google mencoba untuk membeli segalanya di website Anda).

Di dalam kode web.py kita, kita bedakan dengan jelas antara keduanya:

class index:
    def GET(self):
        return "Hello, world!"

Fungsi GET akan dipanggil oleh web.py setiap saat seseorang membuat request GET untuk /.

Sekarang kita perlu membuat sebuah aplikasi dengan menyatakan URL yang kita miliki dan meminta kepada web.py untuk memulai melayani halaman web:

if __name__ == "__main__": 
    app = web.application(urls, globals())
    app.run()        

Pertama, kita meminta kepada web.py untuk membuat sebuah aplikasi dengan URL yang kita daftarkan di atas, dengan mencari class-class dari namespace global file ini. Dan, akhirnya, kita meminta web.py untuk menjalankan server untuk aplikasi yang kita buat sebelumnya.

Perhatikanlah bahwa walaupun saya telah banyak berbicara, kita sebenarnya hanya memiliki lima baris kode. Itulah yang Anda perlukan untuk membuat sebuah aplikasi web.py yang lengkap.

Untuk lebih mudahnya, berikut adalah kode lengkapnya:

import web

urls = (
    '/', 'index'
)

class index:
    def GET(self):
        return "Hello, world!"

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

Memulai server

Apabila Anda ke command line dan mengetikkan:

$ python code.py
http://0.0.0.0:8080/

Maka aplikasi web.py Anda akan menjalankan sebuah web server sesungguhnya di komputer Anda. Kunjungilah URL tersebut dan seharusnya Anda akan melihat tulisan: "Hello, world!" (Anda dapat menambahkan alamat IP/port setelah "code.py" untuk mengontrol di mana web.py akan menjalankan server. Anda juga dapat memintanya untuk menjalankan server fastcgi atau scgi.)

Catatan: Anda dapat menentukan port yang ingin digunakan di command line seperti ini, jika Anda tidak dapat atau tidak ingin menggunakan nilai default:

$ python code.py 1234

Menggunakan template

Menulis HTML di dalam Python bisa menjadi merepotkan; lebih nyaman untuk menulis Python di dalam HTML. Untungnya, web.py membuatnya cukup mudah.

Mari buat direktori untuk menyimpan template kita (kita berikan nama templates). Di dalamnya, buatlah file baru dengan nama diakhiri dengan HTML (kita berikan nama index.html). Sekarang, di dalam file tersebut, Anda dapat menulis HTML seperti biasanya:

<em>Hello</em>, world!

Atau, Anda bisa gunakan bahasa template milik web.py untuk menambahkan kode ke dalam HTML Anda:

$def with (name)

$if name:
    I just wanted to say <em>hello</em> to $name.
$else:
    <em>Hello</em>, world!

Seperti yang bisa Anda lihat, template sangat mirip dengan file Python kecuali dengan adanya statemen def with di awal file (menyatakan apa yang dilewatkan ke template) dan $ yang ada di awal setiap kode. Saat ini, template.py mengharuskan statement def with merupakan baris pertama file. Perhatikanlah juga bahwa web.py secara otomatis akan mengescape setiap variabel yang digunakan di sini, sehingga apabila name diberikan nilai yang mengandung kode HTML tertentu, secara otomatis akan diescape dan tampil sebagai teks biasa. Apabila Anda ingin menonaktifkan fitur ini, gantilah $name dengan $:name.

Sekarang, mari kembali ke code.py. Di bawah baris pertama, tambahkan:

render = web.template.render('templates/')

Ini akan meminta web.py untuk mencari template ke dalam direktori templates. Kemudian, gantilah index.GET menjadi:

name = 'Bob'    
return render.index(name)

('index' adalah nama template dan 'name' merupakan argumen yang dilewatkan kepadanya)

Kunjungilah website Anda, yang harusnya akan menyapa hello kepada Bob.

Tapi, katakanlah kita ingin agar pengunjung dapat memasukkan namanya sendiri. Gantilah dua baris yang kita tambahkan di atas dengan:

i = web.input(name=None)
return render.index(i.name)

Kunjungilah / dan harusnya, hello kepada dunia akan ditampilkan. Kunjungilah /?name=Joe dan harusnya, hello kepada Joe akan ditampilkan.

Tentu saja, memiliki ? tersebut di URL tidaklah cantik. Mari ganti definisi URL di bagian atas kode menjadi:

'/(.*)', 'index'

Dan ganti definisi index.GET menjadi:

def GET(self, name):
    return render.index(name)

Dan hapuslah baris yang mengatur name. Sekarang, kunjungilah /Joe dan harusnya, hello kepada Joe akan ditampilkan.

Apabila Anda ingin belajar lebih lanjut tentang template, kunjungilah halaman templetor.

Form

Modul form dari web.py memungkinkan pembuatan form HTML, mendapatkan input dari user, dan melakukan validasi sebelum input diproses atau ditambahkan ke dalam database. Apabila Anda ingin belajar lebih lanjut tentang modul form web.py, bacalah Dokumentasi or kunjungilah link langsung ke Pustaka Form.

Menggunakan database

Catatan: Sebelum Anda dapat mulai menggunakan database, pastikanlah pustaka untuk mengakses database telah terinstall. Untuk database MySQL, gunakanlah MySQLdb dan untuk database PostgreSQL, gunakanlah psycopg2.

Pertama, Anda perlu membuat objek database.

db = web.database(dbn='postgres', user='username', pw='password', db='dbname')

(Sesuaikanlah -- terutama username, password, dan dbname -- dengan setup Anda. Pengguna MySQL juga perlu mengubah definisi dbn ke mysql.)

Ini adalah semua yang perlu Anda lakukan -- web.py secara otomatis akan menangani koneksi dan diskoneksi dari database.

Pada interface admin dari engine database yang Anda gunakan, buatlah sebuah tabel sederhana di dalam database Anda:

CREATE TABLE todo (
  id serial primary key,
  title text,
  created timestamp default now(),
  done boolean default 'f'    );

Dan tambahkan sebuah baris:

INSERT INTO todo (title) VALUES ('Learn web.py');

Kembalilah mengedit code.py dan gantilah index.GET menjadi nilai berikut, menimpa seluruh isi fungsi sebelumnya:

def GET(self):
    todos = db.select('todo')
    return render.index(todos)

Dan gantilah handler URL untuk hanya menerima / seperti berikut:

'/', 'index',

Edit dan gantilah keseluruhan isi index.html sehingga menjadi berikut:

$def with (todos)
<ul>
$for todo in todos:
    <li id="t$todo.id">$todo.title</li>
</ul>

Kunjungilah kembali website Anda dan Anda harusnya akan melihat sebuah item todo: "Learn web.py". Selamat! Anda telah membuat sebuah aplikasi lengkap yang membaca dari database. Sekarang, mari kita membuatnya dapat juga menulis ke database.

Pada bagian akhir dari index.html, tambahkanlah:

<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
</form>

Dan gantilah definisi URL menjadi:

'/', 'index',
'/add', 'add'

(Hati-hatilah dengan koma-koma yang ada. Apabila Anda tidak menuliskannya, Python akan menggabungkan semuanya sehingga menjadi '/index/addadd' dan bukannya daftar URL Anda!)

Sekarang, tambahkanlah class lain:

class add:
    def POST(self):
        i = web.input()
        n = db.insert('todo', title=i.title)
        raise web.seeother('/')

(Perhatikanlah bagaimana kita menggunakan POST untuk ini?)

web.input memungkinkan kita untuk mengakses setiap variabel yang dikirim oleh user lewat sebuah form.

Catatan: Untuk dapat mengakses data dari berbagai item yang bernama sama, dalam format list (contoh: berbagai checkbox yang semuanya memiliki atribut name="name"), pergunakanlah:

post_data=web.input(name=[])

db.insert akan menambahkan nilai ke dalam tabel database todo dan mengembalikan nilai ID dari baris baru. seeother akan melakukan redireksi ke suatu URL.

web.input, db.query dan fungsi lainnya di web.py mengembalikan "objek Storage", yang mirip dengan dictionary, namun Anda bisa melakukan d.foo selain d['foo']. Ini akan menjadikan kode lebih bersih.

Untuk detil lebih lanjut, termasuk untuk semua fungsi web.py, bacalah dokumentasi.

Selama pengembangan

web.py juga memiliki beberapa alat bantu untuk membantu kita melakukan debugging. Pada saat berjalan dengan web server bawaan, web.py akan menjalankan aplikasi pada modus debug. Dalam modus tersebut, setiap perubahan pada kode dan template secara otomatis akan dibaca ulang dan pesan-pesan kesalahan akan mengandung lebih banyak informasi berguna.

Modus debug ini tidak diaktifkan pada saat aplikasi berjalan pada web server sesungguhnya. Apabila Anda ingin menonaktifkan modus debug, Anda dapat menambahkan kode berikut sebelum membuat aplikasi/template:

web.config.debug = False

Berikutnya?

Sampai di sini dulu tutorial kita. Kunjungilah buku resep dan contoh kode untuk contoh-contoh keren yang dapat Anda lakukan dengan web.py. Dan, jangan lupakan juga referensi api.