apache + wsgi + djangoでのdebug方法
※「wsgiファイルにdebugger起動の設定を書いておく」を追記し、「link」に関連するポインタを追記しました。2012/08/05
背景
djangoでdebugしていて、通常であればmanager.py runserverなどで確認していたが、事情によりapacheでの動作中に確認する必要があった。
簡単なところは、print debugしていたが、だんだん辛くなり、debuggerを利用する方法について調べたら分かったので備忘として残しておきます。
(1)wsgiファイルにdebugger起動の設定を書いておく
djangoのprojectディレクトリ(setting.pyとかあるところ)にあるxxx.wsgiファイルにclass Debugerの設定と、applicationに適用する設定を書いておく。
個の記載をすることで、applicationが呼ばれる際にdebuggerを起動できる。
下記例では、class Debugger(object):以降の部分が追記する部分。
# cat ../gui/django.wsgi import os, sys sys.path.append('/var/www/xxx') os.environ['DJANGO_SETTINGS_MODULE'] = 'gui.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() class Debugger(object): def __init__(self, object): self.__object = object def __call__(self, *args, **kwargs): import pdb, sys debugger = pdb.Pdb() debugger.use_rawinput = 0 debugger.reset() sys.settrace(debugger.trace_dispatch) try: return self.__object(*args, **kwargs) finally: debugger.quitting = 1 sys.settrace(None) application = Debugger(application)
(2).htaccessをdebugしたいprogramのあるdirectoryに配置する
PythonHandlerのところに、debuggerを起動させたいprogramを指定する(?)。<--ちゃんと調べてません
下記例では、yyy.py
AddHandler python-program .py PythonHandler yyy.py PythonEnablePdb On
(4)web accessすると、debuggerが起動するのでそのままdebugをすすめる。
[root@xxx XxxYyy]# apachectl -DONE_PROCESS <--ここで待ちになるが、web browserアクセスしたら返ってくる > /usr/lib/python2.6/site-packages/Django-1.4.1-py2.6.egg/django/core/handlers/wsgi.py(213)__call__() -> if self._request_middleware is None: (Pdb) l 208 request_class = WSGIRequest 209 210 def __call__(self, environ, start_response): 211 # Set up middleware if needed. We couldn't do this earlier, because 212 # settings weren't available. 213 -> if self._request_middleware is None: 214 self.initLock.acquire() 215 try: 216 try: 217 # Check that middleware is still uninitialised. 218 if self._request_middleware is None: (Pdb) b /var/www/xxx/yyy.py:39 Breakpoint 1 at /var/www/xxx/yyy.py:39 (Pdb)
link
Mod_pythonアプリケーションをpdbでデバッグ
http://www.daemonfreaks.com/blog/200705281740.html
Debugging Techniques
http://code.google.com/p/modwsgi/wiki/DebuggingTechniques