Python CGIのデバッグ
CGIプログラムは通常はWebサーバから呼び出されて実行されるので、高機能なデバッガが利用できないため、とてもデバッグがしにくいです。
しかし、Pythonの標準ライブラリには、CGIのデバッグに役立つ2つのモジュールが用意されていて、デバッグがかなり楽にできます。
まず最初に紹介するのが、cgitbです。このモジュールを使うと、CGIプログラムで捕捉されない例外が発生したときに、トレースバック情報をHTMLで出力してくれます。使い方は非常に簡単で、
import cgitb; cgitb.enable()
と最初の方に書いておくだけです。後は例外が発生したときに、勝手になんとかしてくれます。
実際にcgitbの出力がどんな感じになるのか、サンプルを用意しました。
http://niisaka.s33.xrea.com/cgi-bin/test/python-cgi.cgi
このCGIは1行コメントを投稿して、10行まで保存しますが、コメント欄が空欄のまま投稿すると例外が発生します。(フォームにinput要素があっても値が空の場合はFieldStorageには登録されないため)
例外が発生すると、例外の詳細と前後のソースコードが表示されます。この場合は、form['comment']から暗黙的に呼び出された FieldStorage.__getitem__() でKeyError例外が発生しています。
ユーザにソースコードを見せたくない場合は、cgitb.enable(display=0, logdir="/tmp") のようにすると、/tmpディレクトリにファイルとして出力され、ブラウザ上には出力されなくなります。また、context引数で出力されるソースコードの行数を指定できます。(標準ではcontext=5)
もう1つとても便利なのが、CGIHTTPServerモジュールです。これはCGI実行機能付きの簡易的なWebサーバとして動くモジュールで、Apache等をインストールしなくてもローカルでCGIのテストができます。
使用方法は、コマンドプロンプトから python -m CGIHTTPServer とするだけです。 このときのカレントディレクトリがWebサーバのドキュメントルートとなります。標準ではポート8000に設定されているので、ブラウザから localhost:8000 を開くことでアクセスできます。
CGIスクリプトは、cgi-binという名前のディレクトリより下に置く必要があり、拡張子は.pyでなければなりません。また、cgi-bin以下のディレクトリでは.py以外のファイルにはアクセスできなくなっています。画像などを表示する場合は、cgi-bin以外のディレクトリに配置しなければなりません。
このモジュールには1つ困った問題があり、CGIスクリプトが実行されるときにカレントディレクトリがドキュメントルートのままになっています。通常はCGIスクリプトのあるディレクトリがカレントディレクトリになるので、実際にApache等で動かした場合と動作が異なってしまいます。CGIHTTPServerを修正してしまうか、CGIスクリプト側でカレントディレクトリを設定しなおすといいかもしれません。
このような素晴らしい機能が標準で付いてくるのもPythonの魅力ですね。
カテゴリ
プログラミングトラックバック(0)
このブログ記事に対するトラックバックURL: http://niisaka.s33.xrea.com/x/mt/mt-tb.cgi/223


コメントする