Pythonを用いたCGIスクリプティング入門Beginner's Guide(2/2 ページ)

» 2008年06月07日 05時00分 公開
[Robert-D.-Currier,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2       

フォーム表示を利用するサンプルスクリプト

 標準的なPythonディストリビューションであれば、CGIアプリケーションの構築とデバッグに必要な拡張機能を提供するためのcgiおよびcgitbモジュールが付属しているはずだ。このうちcgiモジュールは各種のクラスを定義しているもので、このチュートリアルの場合はフォーム表示を行う2つ目のサンプルスクリプトで、FieldStorageというクラスを利用することになる。同じくcgitbモジュールはデバッガとしての機能を有するもので、これが役立つのは少し長めのスクリプトを記述する場合であり、このチュートリアルの場合は3つ目のサンプルスクリプトをデバッグする際にこのモジュールを使用している。

 次のサンプルスクリプトは、2つの質問を提示してその回答を集計するという簡単なアンケートを実施するものである。まずは1つ目のサンプルと同じ手順でexample2.pyという名前のファイルを作成し、その中に後記のコードをコピー&ペーストして/var/www/cgi-binに保存しておく。なおその際に「chmod 755 example2.py」による実行パーミッションの設定を忘れてはいけない。

#!/usr/bin/python

import cgi

print "Content-type: text/html"

print

form = cgi.FieldStorage()

laptops = form.getvalue('laptops','0')

desktops = form.getvalue('desktops','0')

print """

<html>

<body>

<form action='example2.py'>

How many laptops do you own 

<input type='radio' checked name='laptops' value='0' />0 

<input type='radio' name='laptops' value='1' />1 

<input type='radio' name='laptops' value='2' />2

<p>

How many desktops do you own 

<input type='radio' checked name='desktops' value='0' />0 

<input type='radio' name='desktops' value='1' />1 

<input type='radio' name='desktops' value='2' />2

<p>

<input type='submit' />

<p>

You own %d computers.

</form>

</body>

</html>""" % (int(laptops)+int(desktops))


 このexample2.pyの構造は1つ目のサンプルと幾つかの点で異なっている。まず気付くのは、2行目にあるcgiモジュールのインポートおよび 5行目にあるフォーム作成用のステートメントである。同様に6行目と7行目のFieldStorageクラスは、ここで作成するフォームからのデータ取得をするために使用している。example2.pyにおける残りの部分は通常のHTMLコードを記述するためのものだ。次の操作手順として、example2.pyの格納先がcgi-binディレクトリとなっていることを確認した後、このURLをWebブラウザに指定してexample2.pyを読み込ませると、ラップトップおよびデスクトップコンピュータをそれぞれ何台ずつ所有しているかを尋ねる2行形式のアンケートフォームが表示されるはずだ。そしてここで回答した数値については、合計が計算された上でフォーム下部に表示されるようになっている。回答する数値を変えてフォームの提出を何度か行い、正しい処理が行われているかを確かめて頂きたい。

cgitbを用いたデバッグ

 こうしたコード入力後の動作試験に一発でパスするのは誰にとっても喜ばしい驚きであろうが、常にそうした幸運に恵まれるとは限らない。しかもコード中のミスを特定する上で、httpdの返してくる標準エラーメッセージは、たいていの場合役に立たないものである。こうした意味不明なエラーメッセージに悩まされるか、それとも問題の根源を速やかに特定できるかの分かれ目となるのが、先に触れたcgitbなどのデバッガが利用できるかどうかなのだ。ここではcgitbの機能を確認する目的で、2つ目のサンプルスクリプトに意図的なエラーを混入させ、問題の発生源となっているコード部をcgitb を用いて特定してみよう。

 まずはexample2.pyを開きファイルの最終行に移動する。この行には「(int(laptops) + int(desktops))」というステートメントが記述されているが、ここにある+記号を/記号に変更し、「(int(laptops) / int(desktops))」というステートメントに変更したファイルを保存しておく。こうした変更後のexample2.pyをURL指定によりWebブラウザに読み込むと、先に実行した場合と異なり空白ページが表示されるだけになっているはずだ。つまりここで仕掛けたエラーは、スクリプトの実行を妨げる一方でデバッグに利用可能な情報を何も出力させない性質のものなのである。

 次に再度example2.pyを開き、ファイルの先頭部にあるimport cgiというステートメントの直下に後記の2行を追加する。

import cgitb

cgitb.enable()


 この変更後のファイルを/var/www/cgi-binに保存してURL指定による読み込みを行うと、今度は単なる空白のWebページではなく、サンプルスクリプトのいずこに問題があるかについての詳細なリポートが表示されるはずだ。この場合cgitbから表示されているのは「ZeroDivisionError: integer division or modulo by zero」というゼロ除算の発生を告げるメッセージなので、このスクリプトを再度正常に動作させるには、エラーの発生源である/記号を+記号に戻してexample2.pyを保存し直せばいいと判断できるのである。

 とは言うものの、算術演算子の使い方に関する単発的なミスの特定などは高度なデバッグ機能を必要とするものでもないし、むしろ人間が自力でチェックした方が簡単に特定できそうなものである。しかしながら実際に用いるスクリプトはこうしたサンプルよりも遥かに長いコードとなるものであり、そうした長くて複雑なスクリプト中のいずこかに存在するはずのエラー行という存在は、その1つを特定するだけでもかなりの長時間を要しかねないのだ。特にcgitbの使用は、タイプミスなどの識別に要する時間を大幅に節約してくれることになる。

さらなる学習に向けて

 スペースの都合もあるため、本稿では簡単なサンプルスクリプトを紹介するだけに止まり、CGIスクリプティングにおいてPythonがどれほど有用であるかを説明しきれなかったが、読者の学習意欲を刺激することはできたと思う。Pythonについてより深く学びたいという場合は、マグナス・ライ・ヘットランド氏の著した『Beginning Python: From Novice to Professional』や、O'Reillyから刊行されているマーク・ラッツ氏の『Programming Python, Third Edition』が参考になるはずだ。

Bob Currierは、フロリダ州サラソータにあるMote Marine Laboratory社の主任データエンジニアとしてLinuxサーバファームを管理すると同時に、自動潜水艇用の運航制御コード開発に携わっており、そうした活動の傍ら、Linux.com、Network World、ZDnet.com、Smart Computingなど数多くの業界紙誌に100本を超える記事および書評や論評を寄稿している。


前のページへ 1|2       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ