Hatena::ブログ(Diary)

作業記録/備忘録(仮) このページをアンテナに追加 RSSフィード

2012/08/03

apache + wsgi + djangoでのdebug方法

※「wsgiファイルにdebugger起動の設定を書いておく」を追記し、「link」に関連するポインタを追記しました。2012/08/05

概要

apache + wsgi + djangoを利用している時、pdbを利用したdebug方法について示します。

背景

djangoでdebugしていて、通常であればmanager.py runserverなどで確認していたが、事情によりapacheでの動作中に確認する必要があった。
簡単なところは、print debugしていたが、だんだん辛くなり、debuggerを利用する方法について調べたら分かったので備忘として残しておきます。

環境

OS CentOS 6.0
python 2.6.6
mod_wsgi 3.3
apache 2.2.15

(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

(3)debugger起動待ち状態にする

 # apachectl -k stop
 # apachectl -DONE_PROCESS

プロンプトが戻ってこなくなり、pdb起動待ちになります。

(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

2012/01/20

python でGUI(2)  GUIモジュールの種類

pythonGUI作るには、いくつかの方法で実現することが可能。Tkinterしかしか知らなかった。

Hello Worldコレクション Python編 - フレキシブルなオブジェクト指向スクリプト言語
http://news.mynavi.jp/column/helloworld/009/index.html


GUIモジュール名説明
TkinterPythonに標準で付属している、Tcl/Tkベースのモジュール
gtkGTK+ベースのモジュール(モジュール名はgtk)
qtQtベースのモジュール

それぞれ使いたいものを基本importするだけだが、使い方が異なるので、詳しくはリンク先を参照。

nodeの関連を表現するのに使いたいので、近々練習しよう。

2012/01/15

python でGUI(1) python/Tk チェックボタンとラジオボタン

以前、Perl/Tkで遊んでいたことがあったが、ここ半年で触り始めたpythonでもTkが触れるということを知ったので、新しいマシンのセットアップのついでにpython/Tkで遊んでみた。

参考にしたのは以下のサイト。ソースはコピペで試してみた。

チェックボタンとラジオボタン
http://www.geocities.jp/m_hiroi/light/pytk03.html

■開発環境
Windows7上のVMWarePlayerのUbuntu10.04(仮想マシン)。python 2.6.5。

tkインストール
$ sudo apt-get install python-tk

ソースコード
※上記参考サイト参照