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/06/23

django設定(CentOS)

Ubuntu(10.04)の時の設定と結構異なり、躓いたので備忘のため残しておく。

参考にしたサイト

  • (後日記載)
  • (後日記載)

httpdの設定

(後日記載)

wsgiの設定

(後日記載)

djangoのinstall

(後日記載)

sqliteの設定

(後日記載)

cssの設定

(後日記載)

2012/05/09

djangoの設定ファイル


(間違ってるかもしれないけど、)理解した範囲で/var/www/myprj内のファイル構成と、ファイルの意味。

.
|-- __init__.py
|-- __init__.pyc
|-- manage.py            開発用server立てたり(runserver),アプリ登録したり(startapp ${app名}),データベースと同期したり(syncdb),シェル立ち上げたり(shell)できる。
|-- myapp
|   |-- __init__.py
|   |-- models.py        O/Rマッパー用定義みたいなもん?
|   |-- template         html吐くためのtemplate置き場
|   |   `-- index.html   html吐くtemplate,views.pyの中でこれを使うことを指定する。
|   |-- tests.py
|   `-- views.py         これを使う設定は、urls.pyに書く。index.htmlを返すことをここではかいてる。
|-- settings.py          DBの設定、TimeZoneの設定、言語設定、InstallAppの設定、などなど
`-- urls.py              URLアクセスした時に何を見せるかの設定(ここではmyappのviewsのindex())

djangoを使ってみる(2) PostgreSQL編

引き続いて、下記サイトを参考にしてPostgreSQLでも動作確認
PythonDjangoをapt-getでUbuntuにインストール
http://blog.srengine.com/2008/03/python-djangoapt-getubuntu.html

PostgreSQLをインストールした状態で、djangoの設定を2点だけ変更する。
psycopg2のインストール

$ sudo apt-get install python-psycopg2

myprj/setting.pyでDB設定を以下のように変更する。HOST,PORTなどは適当に。

DATABASES = {
    'default': {
        'ENGINE': 'postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.                                                           
        'NAME': 'myprj',                      # Or path to database file if using sqlite3.                                                                                    
        'USER': 'postgres',                      # Not used with sqlite3.                                                                                                     
        'PASSWORD': '',                  # Not used with sqlite3.                                                                                                             
        'HOST': '127.0.0.1',                      # Set to empty string for localhost. Not used with sqlite3.                                                                 
        'PORT': '5432',                      # Set to empty string for default. Not used with sqlite3.                                                                        
    }
}
TIME_ZONE = 'Asia/Tokyo'

この状態で、syncdbするとOK。

$ sudo python manage.py syncdb

以降は、試験的に動作させる例。
DBに書き込み(test data)

$ sudo python manage.py shell
>>> from myapp.models import *
>>> User(username='foo', password='brabra', description='Hello', score=0).save()
>>> User(username='hoge', password='brabra', description='Good-bye',   score=0).save()
>>> us = User.objects.all()
>>> for u in us:
...    print u.username, u.password, u.datetime
... 
foo brabra 2012-05-09 19:39:29.085185
hoge brabra 2012-05-09 19:39:37.485181

/var/www/myprj/myapp/views.pyの設定(test data用)

# Create your views here.                                                                                                                                                     
from django.shortcuts import render_to_response, get_object_or_404
import models
def index(request):
  users = models.User.objects.all()
  return render_to_response('index.html', { 'users': users })
$ sudo mkdir myapp/template
$ sudo emacs -nw myapp/template/index.html

index.htmlの中身

<html>
  <body>
    {% for user in users %}
    <p>{{user.username}}, {{user.password}}, {{user.description}}</p>
    {% endfor %}
  </body>
</html>
$ sudo emacs -nw urls.py

urls.pyの中身

from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:                                                                                                                           
# from django.contrib import admin                                                                                                                                            
# admin.autodiscover()                                                                                                                                                        

urlpatterns = patterns('',
    # Example:                                                                                                                                                                
    # (r'^myprj/', include('myprj.foo.urls')),                                                                                                                                

    # Uncomment the admin/doc line below to enable admin documentation:                                                                                                       
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),                                                                                                             

    # Uncomment the next line to enable the admin:                                                                                                                            
    # (r'^admin/', include(admin.site.urls)),                                                                                                                                 
    (r'^myprj/myapp/$', 'myprj.myapp.views.index'),
)

apacheのrestart

$ sudo service apache2 restart

http://localhost/myprj/myapp にアクセスする。

2012/05/03

djangoを使ってみる

pythonのwebフレームワークであるdjango(ジャンゴ)を使ってみる。
開発環境は、ubuntu 10.04でpython-django (1.1.1-2ubuntu1.4)インストールから動作まで試してみた。

django(wikipedia)
http://ja.wikipedia.org/wiki/Django

インストールから動作まで参考にしたのは下記サイト
PythonDjangoをapt-getでUbuntuにインストール
http://blog.srengine.com/2008/03/python-djangoapt-getubuntu.html

インストール

djangoのインストール

$ sudo apt-get install python-django

apache2でpythonを有効にするモジュール(mod_python)のインストール

$ sudo apt-get install libapache2-mod-python libapache2-mod-python-doc

apache2の設定(python動作確認用)

/etc/apache2/sites-available/default に以下(fromからtoまでの部分)を追記する。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
#               AllowOverride None
                AllowOverride All
                Order allow,deny
                allow from all

                # for django 2012/05/03 Do. ---from ★ 
                AddHandler mod_python .py
                PythonHandler mod_python.publisher
                PythonDebug On
                # ---to ☆

        </Directory>

テストファイルを配置(python動作確認用)

以下のようなテストファイルtest.pyを/var/www以下に置く。

def index(req):
    return "Test successful"

apacheの再起動

$ sudo service apache2 restart

ブラウザで確認

http://localhost/test.pyにアクセスする。
"Test successful"が見えていればまずはOK。

apache2の設定(django動作確認)

djangoのプロジェクトディレクトリを作成する。

$ cd /var/www/
$ sudo django-admin startproject myprj
$ ls myprj/

apacheに設定してプロジェクトディレクトリを利用できるようにする。
/etc/apache2/sites-available/default に以下を追記(fromからtoまでの部分)

# for django 2012/05/03 Do. ---from
        <Location "/myprj/">
         Options Indexes FollowSymLinks MultiViews
         AllowOverride None
         Order allow,deny
         allow from all
         SetHandler python-program
         PythonPath "['/var/www'] + sys.path"
         PythonHandler django.core.handlers.modpython
         SetEnv DJANGO_SETTINGS_MODULE myprj.settings
         PythonDebug On
        </Location>
#--- to
</VirtualHost>

設定を有効にするため、apacheのrestartする。

$ sudo service apache2 restart

http://localhost/myprjにアクセスする。
「It worked!Congratulations on your first Django-powered page.」とかが見えるはず。

以降も、ほぼ「【PythonDjangoをapt-getでUbuntuにインストール(http://blog.srengine.com/2008/03/python-djangoapt-getubuntu.html)」を参考に作業した。

違っていた点/追加で作業が必要であった点だけ記載
db名

/var/www/myprj/settings.py
DATABASE_NAME = 'myprg' -> 'myprj'

myappに移動して、models.pyで、

 username = models.CharField(maxlength=200)  -> max_length
 password = models.CharField(maxlength=200)    -> max_length

python-mysqldbのインストール

$ sudo apt-get install python-mysqldb
mysql> create database myprj ->最後にセミコロン";"がいる

以上で、
/var/www/myprj$ python manage.py syncdb で設定できる。


あとは、modelを利用して具体的なデータをセットし、viewを通して取得し、index.html経由でwebアクセス可能になる。