どんなものも、いずれ壊れます (Things break)。そんなとき、何がうまく行っ ていないのか、なぜ大きな違いが生まれるのかを即座に明らかにすることは大 きな価値があります。 Pylons は、 Ian Bicking の EvalException ミドルウェアを Mako/Myghty の完全なトレースバックの情報を含むようにカスタマイズしたも のをデフォルトで利用しています。
デバッグ画面の上部には3つのタブがあります。
Traceback
生の例外トレースと、インタラクティブなデバッガを提供します。
Extra Data
例外発生時の CGI, WSGI 変数と設定情報を表示します。
Template
人間が読みやすい Mako または Myghty テンプレートのトレースバックで す。
Mako と Myghty はテンプレートを Python モジュールにコンパイルするので、 テンプレートのどの行でエラーが起きたのかを正確に見出すのは難しい場合が あります。 Template タブは、 Mako や Myghty の完全なトレースバックを 提供し、テンプレート内の正確な行番号と、エラーがどこで起こっているのか の情報を提供します。例外がテンプレートを描画する前に発生した場合には、 この項目にはテンプレートに関する情報は表示されません。
インタラクティブなデバッガを利用することは、 session や request といった Web リクエスト中にしか現れないオブジェクトの中身を 深く知るのにも役に立ちます。
エラーを起こして何が起きているかを知るためには、単に興味を持っているア クションの中で例外を raise します。この例では、今あなたが見ているページ を表示するのに使われているアクション (訳注: この記述は原文が間違ってい るのでは?) の中でエラーを raise します。 docs コントローラは以下のよう なものです。
class DocsController(BaseController):
def view(self, url):
if request.path_info.endswith('docs'):
redirect_to('/docs/')
return render('/docs/' + url)
session や request の中身を知りたいので、最初にそれらの値を束縛 (bind) しておく必要があります。ここで、値の束縛と例外の発生でアクション がどのようになるか見てみましょう。
def view(self, url):
raise "hi"
if request.path_info.endswith('docs'):
redirect_to('/docs/')
return render('/docs/' + url)
ここに、上記の例に対応したトレースバックを探索している様子を示します (関連部分を抜粋しています):
Note
訳注:
以下の例では、例外が発生した時点で self に束縛されていた session や request が表示されていることがわかります。
デバッグの動作のしかたについて、あらゆる変更を行うことができます。たと えば設定ファイルの中で debug 変数を無効にすると、設定ファイルの先頭 でメールアドレスを設定さえしておけば、画面にエラーレポートを表示する代 わりに、 Pylons はそれをメールしてくれます。
error_email_from = you@example.com
この機能はプロダクション・サイトでとても便利です。メールは SMTP を介し て送られるので、適切な SMTP サーバも設定しておく必要があります。
多くのエラー処理オプションを設定ファイルで指定することができます。それ らは インタラクティブなデバッグ で説明されますが、覚えておくべき重要 なポイントは、プロダクション環境では debug を常に false にセットし なければならないということです。そうしなければ、エラーが発生した場合に、 悪意のあるコードを実行するために使用できる開発者のインタラクティブ・ト レースバックを、サイト訪問者に与えてしまうことになります。