web2py簡易デバッグ方法

「エラーチケット」について

web2pyのエラーログは、

web2py/applications/アプリ名/errors/

の中に一ファイル毎に格納される。

たとえば次のようなエラーチケット番号をふられたファイル名で、である。

(ひみつ).2012-04-17.22-23-42.ffa0b92a-2f10-472a-836a-b461e2b0c980

エラー時は

no title


という風にブラウザに上の「エラーチケット」名を記載したリンクが表示される。クリックすると管理者画面で

no title


詳細が見られるというわけである。

Web経由ではないかたちで(つまりはエラーログファイルを直接コンソールなどで見たり)ログをみる方法を考えてみたが、ログフォーマットを見やすいようにコンバートするのに(理解の)時間がかかりそうだ。GUIのTKLツールをリモートから動かすとかいう方法もありそうだが、結局は、別ポート番号でadmin用のサーバ(web2pyのRoket Server)をたちあげておき、sshトンネリングをつかってローカルのWebブラウザからのアクセスが楽だということに落ち着いた。

以下その方法。


sshトンネリングとadmin用の起動コマンドの作成

web2pyを使うの「adminモードを外部から使えるようにする」で書いたようにする。

なおrestartがいつでも出来るようにしたほうがいいので下記のようなシェルスクリプトをつくっておく(スクリプト名をweb2py_8002とする)。

ps ax | egrep "web2py.*8002" | egrep -v "web2py_8002|grep" | gawk '{CMD=sprintf("kill -KILL %s",$1);system(CMD)}'
python web2py.py --nogui -p 8002 -i 127.0.0.1 -a "<recycle>" -Q &

これで、http://localhost:8002/でadminにログイン出来る。

routes.pyの細工

デフォルトだとエラーチケットが表示された場合のリンクでアクセスできるURLはlocalhost:8002ではないので、routes.pyの設定でlocalhost:8002にアクセス可能にする。

cp routes.example.py routes.py

routes.pyの

#error_message_ticket

コメントを外し、href部分冒頭にhttp://localhost:8002を付け加える。

error_message_ticket = '<html><body><h1>Internal error</h1>Ticket issued: <a href="http://localhost:8002/admin/default/ticket/%(ticket)s" target="_blank">%(ticket)s</a></body></html>'

これで、同じブラウザでlocalhost:8002にadminログインしていれば、直接エラーチケットの閲覧画面にアクセスできる。

adminアプリだけは別のルーティングにする

routes.pyのroutes_inでURLルーティング(ディスパッチ)を変更することがあるが、そのさい、adminのルーティングだけは固定しておかないと、adminページ自体がエラー発生して見られなくなったりもする。それを避ける場合routes.pyのroutes_in設定で、

(r'/admin/(?P<any>.*)', r'/admin/\g<any>')

を優先的に書いておく(*1)。

これはローカルマシン完結型でコードを書くときも必須だと思う。

*1: 実は、まだroutes.pyの仕組みがよくわかっていない。routes_appという設定があって、これでアプリケーション毎のルーティングが出来るようなのだが、それを設定してもadminアプリにディスパッチされない。なので、とりあえずroutes_inで設定することにしたというのがホントのところである。

this file --> last modified:2012-04-18 14:44:52