読者です 読者をやめる 読者になる 読者になる

DjangoでWerkzeugのデバッガを使う

Werkzeugというツールキットには、エラー発生時にブラウザ上から対話モードでPythonコードを実行できるという、強力なデバッガが付いています。Pythonコードは、エラー発生箇所でのコンテキストで実行できるため、変数の内容の確認はもちろん、変数を書き換えたりすることでうまくいくまで試行錯誤を行うこともできます。
そこで、そのデバッガをDjango上でも使えるようにする手順を記します。

Werkzeugについて

Python/Werkzeug
http://www.void.in/wiki/Python/Werkzeug

開発サーバーで使う場合

こちらのサイトを参考にさせていただきました。

Werkzeug + django を簡単に使う方法
http://d.hatena.ne.jp/Voluntas/20090118/1232259389

Werkzeugとdjango_extensionsをインストールする。

$ pip install Werkzeug
$ pip install django-extensions

settings.pyにアプリケーションを登録する。

INSTALLED_APPS = (
    ...
    'django_extensions',
)

あとは、サーバーを起動する際に、runserverではなくrunserver_plusとするだけです。

$ python manage.py runserver_plus

Apacheのmod_wsgi上で使う場合

mod_wsgiがすでに入っているものとします。

上記と同様に、Werkzeugをインストールします。django-extensionsは必要ありません。

以下のようなwsgiファイルを作ります。django-extensionsのrunserver_plusコマンドのコードを参考にしています。

# -*- coding: utf-8 -*-

import os
import sys


# パスを通す処理とか
# sys.path.append(...)


import django

from django.core.handlers.wsgi import WSGIHandler
from django.core.servers.basehttp import AdminMediaHandler
from django.views import debug
from werkzeug import DebuggedApplication


def null_technical_500_response(request, exc_type, exc_value, tb):
    raise exc_type, exc_value, tb
debug.technical_500_response = null_technical_500_response


admin_path = os.path.join(django.__path__[0], '/contrib/admin/media')
handler = AdminMediaHandler(WSGIHandler(), admin_path)
application = DebuggedApplication(AdminMediaHandler(handler), evalex=True)

このファイルをmod_wsgiの設定でWSGIScriptAliasに指定して、Apacheを再起動すれば、エラー画面でWerkzeugのデバッガが使えるようになります。
なお、DEBUG = TRUE でないとデバッガは表示されません。