2015-01-21
■FlaskをJSから叩いてエラーになった時に対話的デバッグする方法
WebアプリフレームワークのFlask(が内部で使っているWerkzeug)は、デバッグモードをONにしておくとエラーが起きた時にそのエラー画面からブラウザ上で対話的にコードを実行したり変数を表示させたりしてデバッグが出来る。これは超便利。なのだけど、最近JSからAPIを叩くケースが多くなって、その場合JSが予期しないHTMLを受け取ってパースに失敗するだけなので折角の対話的デバッグが生かせない。
そこで、エラー時には新しいwindowを開いて、レスポンスの内容をそちらに書き出すようにした。初回だけポップアップブロックが発動してしまうけど、それ以降はこれでAPIでも対話的デバッグが出来る。
$.ajax({ url:'/buggy/', data: 'q=42', success: function(x){console.log(x)}, error:function(x){ var w = window.open('', 'debug_stuff', 'width=540,height=150'); w.document.open(); w.document.write(x.responseText); w.document.close(); } });
サーバ上でpdbデバッグという案(thanks @cocoatomo)に関しては、サーバのコード中でpdb.set_trace()で止めた場合は、コンソール上で対話的にデバッグすることはできるのですけど、python -mpdb server.pyした場合、例外発生時期待通りに対話的デバッガに入らない。おそらくFlask自体の例外処理と干渉してる。
「スタックトレースを生かしたまま持っておいて、デバッグ用の画面にリダイレクトしているだけなので、リダイレクトのURLを適当に拾ってブラウザからそのURLにアクセスすればデバッグ画面を開けます。」(thanks @methane) がとても参考になったけども、どうも僕の環境ではリダイレクトはしていないみたいに見えて、あとXMLHttpRequestがリダイレクト先に勝手にアクセスするので面倒くさい。
このアドバイスがヒントになって、最終的にはここに書かれている内容に辿り着いた:
トラックバック - http://d.hatena.ne.jp/nishiohirokazu/20150121/1421848052
リンク元
- 20 http://t.co/sFL8u7Dcn3
- 2 http://feedly.com/i/my
- 2 http://www.google.co.uk/url?sa=t&source=web&cd=1
- 1 http://a.hatena.ne.jp/mjh/simple
- 1 http://a.hatena.ne.jp/poka_poka/?via=201006
- 1 http://api.twitter.com/1/statuses/show/557897286328811522.json
- 1 http://b.hatena.ne.jp/
- 1 http://b.hatena.ne.jp/entrylist?url=http://nakazye.hatenablog.com/
- 1 http://feedly.com/i/latest
- 1 http://web.archive.org