Monday, November 17, 2003

Testing mod_python

Testing mod_python


Rationale
Lagi iseng coba-coba CGI dengan python juga nyoba Zope. Hmmm mestinya ada yang bikin ASP atau PHP versi python.
Setelah googling dengan keyword 'python server pages' (inget ASP) trus 'python hypertext processor' (inget PHP) ... ada dua yang menarik :

-Spyce
Ini sepertinya PSP yang paling matang dilihat dari informasi dari web-site reference yang lain.
Setelah lihat-lihat di web-site-nya, IMHO spyce ini agak aneh.
Pertama adalah TAG yang digunakan untuk menyisipkan kode python. Tag itu adalah [[ dan ]].
Mungkin karena terbiasa menggunakan <% %> atau <? ?> (pokoknya di web itu harus pake < dan >) kalo nggak aneh aja.... Tapi dia kasih alasan kenapa pake tag [[ dan ]] (saya makin bego ... nggak ngerti). Mungkin akhirnya dia mengalah dengan menambahkan bahwa tag <% %> bisa juga dipakai.

Kedua ada karakter ketiga setelah tag misalnya [[. atau [[\ dan lain-lain dengan tujuan masing-masing.

Ketiga, hal yang sangat berseberangan dengan python .... spyce ini pakai kurung buka dan kurung tutup { ... } untuk block-statements (hah ... apa-apaan nih ). Contoh :
[[ for item in mylist : {
do_something(item)
and_more(item)
} ]]
Tapi ... mungkin bener juga ... agak susah untuk indent/dedent di dalam file dengan format HTML.
Mau nyoba instal .. tapi agak ragu. Cari alternatif yang lain dulu.

-mod_python
Pertama dibuat sejak jaman Netscape web server masih berjaya (belum ada Apache).
Kemudian dihibahkan ke Apache Software Fondation. Pada dasarnya fungsi mod_python adalah memungkinkan kita membuat "handler" Apache dengan bahasa Python. Implikasi lain adalah peningkatan kecepatan dibanding CGI dengan Python.
Saya sendiri lebih tertarik pada fitur PSP dari mod_python.
Sayang sekali fitur PSP ini baru masuk ke versi belakangan saja. Jadi saya pikir fitur PSPnya belum terlalu matang. Juga dilihat dari dokumentasinya juga sangat ringkas. Belum bisa dibandingkan dengan dokumentasi PHP, apalagi ASP.
Tapi pantes buat dicoba.... Mungkin alasannya karena mod_python dikembangkan oleh ASF, jadi saya lebih yakin bahwa mod_python ini bakal terus dikembangkan. Bukan berarti Spyce nggak berkelanjutan, tapi who knows ??


Instalasi
Cari-cari paket rpm mod_python untuk Mandrake di rpmfind.net . Tapi hanya ada versi yang lama yang belum termasuk fitur PSP.
Akhirnya download source mod_python Release 3.1.2b di www.modpython.org .
Extract source mod_python di home saya.

Seperti biasa baca README-nya dan dokumentasi instalasi. Requirementnya :
* Python 2.2.1 or later.
* Apache 2.0.40 or later.

Di Mandrake 9.2 sudah terinstal python 2.3 dan apache2 (versi 2.0.47) jadi mestinya tidak ada masalah.

Kita coba jalankan tanpa parameter,
$ ./configure

Ada yang nggak beres ... Muncul pesan : Bla bla bla apxs apa gichu .....

... Apaan tuh apxs ?
Untuk ./configure butuh argument --with-apxs=/path/ke/apxs
Cari di rpmdrake paket mana yang provide apxs... ternyata apache2-devel***.rpm . Install deh.

Jalankan
$ ./configure --with-apxs=/usr/sbin/apxs2 ........OK
$ make ..........OK

Kemudian ... butuh root untuk instal.
$ su
$ make install

OK nggak ada masalah .....

Kemudian kita perlu menambahkan beberapa directive di file konfigurasi Apache.
Saya buat file '80_mod_python.conf' di /etc/httpd/conf.d . Isinya : (di antara garis ----- )

-------------
LoadModule python_module modules/mod_python.so
-------------

Kemudian saya ikuti contoh testing mod_python di dokumentasi. Sayang sekali nggak jalan.
Kurang tahu apa yang kurang yaa ...??? (Udah bolak balik cek '.conf' file, restart Apache, cek permission, dll)

Cuek aja ... Trus baca dokumentasi lagi ...
Ada yang menarik di bagian Publisher.
Coba ganti isi '80_mod_python.conf' jadi berisi :

-------------
LoadModule python_module modules/mod_python.so

AddHandler mod_python .py
PythonHandler mod_python.publisher
-------------

Restart Apache,

$ /etc/init.d/httpd restart

Bikin directory mptest /var/www/html .
Bikin file 'form.html' di /var/www/html/mptest. Berisi :

-------------
<html>
Please provide feedback below:
<p>
<form action="form.py/email" method="POST">

Name: <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
<input type="submit">

</form>
</html>
-------------

Juga file 'form.py' di /var/www/html/mptest. Berisi :

-------------
WEBMASTER = "webmaster"   # webmaster e-mail

SMTP_SERVER = "localhost" # your SMTP server



def email(req, name, email, comment):



    # make sure the user provided all the parameters

    if not (name and email and comment):

        return "A required parameter is missing,                please go back and correct the error"





    # provide feedback to the user

    s = """<html>



From : %s<br>

                                                                                                                                           

Subject: feedback <br>

To: %s<br>



I have the following comment:<br>



%s<br>



Thank You,<br>



%s<br>





</html>""" % (email, WEBMASTER, comment, name)



    return s

-------------

Contoh aslinya di dokumentasi, skrip aslinya akan mengirim email ke WEBMASTER.
Saya ubah sedikit supaya nggak kirim email, jadi hanya print ke HTML.

Browse pake galeon ke http://localhost/mptest/form.html .
Isi text field ... dan klik submit .... Viola ... it's working !!! Duh ...senangnya ...

Baca-baca lagi bagian PSP dan directive .psp .
File '80_mod_python.conf' ganti lagi :

--------------
LoadModule python_module modules/mod_python.so

AddHandler mod_python .psp
PythonHandler mod_python.psp

PythonDebug On

--------------

Restart Apache,

$ /etc/init.d/httpd restart

Bikin file mptime.psp di /var/www/html :

-------------
<html>
<%
import time
%>
Hello world, the time is: <%=time.strftime("%Y-%m-%d, %H:%M:%S")%>
</html>
-------------

Browse http://localhost/mptime.psp ...
Sekali lagi ..... Sukses .....

(sebenarnya nggak langsung sukses..... tapi hanya masalah indent di bagian 'import time')

OK deh .... sampe sini dulu yaa ...