## 9 CGI スクリプトをデバッグする

何よりもまず、些細なインストール関連のエラーでないか確認してください -- 上の CGI スクリプトのインストールに関する節を注意深く読めば 時間を大いに節約できます。もしインストールの手続きを正しく理解 しているか不安なら、このモジュールのファイル (cgi.py) をコピーして、CGI スクリプトとしてインストールしてみてください。 このファイルはスクリプトとして呼び出すと、スクリプトの実行環境と フォームの内容を HTML フォームに出力します。 正しいモードなどをフォームに与えて、リクエストを送ってみてください。 標準的な cgi-bin ディレクトリにインストールされていれば、 以下のような URL をブラウザに入力してリクエストを送信できるはずです:

    http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home

もしタイプ 404 のエラーになるなら、サーバはスクリプトを発見 できないでいます - おそらくあなたはスクリプトを別のディレクトリ に入れる必要があるのでしょう。他のエラーになるなら、先に進む前に 解決しなければならないインストール上の問題があります。 もし実行環境の情報とフォーム内容 (この例では、 各フィールドはフィールド名 ``addr'' に対して値 ``At Home''、および フィールド名 ``name'' に対して ``Joe Blow'' ) が綺麗にフォーマット されて表示されるなら、 cgi.py スクリプトは正しくインストールされています。 同じ操作をあなたの自作スクリプトに対して行えば、スクリプトをデバッグ できるようになるはずです。

次のステップでは `cgi` モジュールの `test()` 関数を 呼び出すことになります: メインプログラムコードを以下の 1 行、

    cgi.test()

と置き換えてください。この操作で cgi.py ファイル自体を インストールした時と同じ結果を出力するはずです。

通常の Python スクリプトが例外を処理しきれずに送出した場合 (様々な理由: モジュール名のタイプミス、ファイルが開けなかった、など)、 Python インタプリタはナイスなトレースバックを出力して終了します。 Python インタプリタはあなたの CGI スクリプトが例外を送出した場合 にも同様に振舞うので、トレースバックは大抵HTTP サーバのいずれかの ログファイルに残るかまったく無視されるかです。

幸運なことに、あなたが自作のスクリプトで 何らかの コードを 実行できるようになったら、`cgitb` モジュールを使って 簡単にトレースバックをブラウザに送信できます。まだそうでないなら、 以下の一行:

    import cgitb; cgitb.enable()

をスクリプトの先頭に追加してください。そしてスクリプトを再度 走らせます; 問題が発生すれば、クラッシュの原因を見出せるような 詳細な報告を読めます。

`cgitb` モジュールのインポートに問題がありそうだと 思うなら、(組み込みモジュールだけを使った) もっと堅牢なアプローチを 取れます:

    import sys
    sys.stderr = sys.stdout
    print "Content-Type: text/plain"
    print
    ...your code here...

このコードは Python インタプリタがトレースバックを出力することに 依存しています。出力のコンテント型はプレーンテキストに設定されて おり、全ての HTML 処理を無効にしています。スクリプトがうまく動作 する場合、生の HTML コードがクライアントに表示されます。スクリプト が例外を送出する場合、最初の 2 行が出力された後、トレースバックが 表示されます。HTML の解釈は行われないので、トレースバックを 読めるはずです。