Django on Jython (2)

前回は本当に動くだけってレベルだったので、データベースも使い、admin-siteの動作確認をしてみます。
環境

データベースとdjango-jython

現状では、nativeな実装を使うようなライブラリをJythonに組み込むことができません。したがって、Jythonでデータベースにアクセスする場合は、JDBCを使ってアクセスする事になります。
django-jythonはそんなデータベースのバックエンドのサポートと、WarファイルとしてJ2EEコンテナに配備する為のライブラリになります。

現在のバージョンでは、django-jythonPostgreSQLしか対応していない為、データベースはPostgreSQL 8.3を使わなくてはなりません。ただし、基本的にはJDBCドライバをJythonで使うための薄いラッパーに過ぎないため、簡単にMySQLは対応できます(誰か作ってね)とドキュメントに書いてあります。
尚、SQLiteはnative色が強すぎるのか、チャレンジャーになりたいならばつかってみては?という感じです。

というわけで、PostgreSQL 8.3をインストールしておきましょう。尚、JDBCドライバはJythonの付属Jarに含まれているので、別途用意する必要はありません。インストール後、ユーザjythonとデータベースtestを作成しておきます。

次にdjango-jythonをインストールします。これは、SVNから最新版を取得して、setup.pyをjythonで実行するだけです。尚、Jythonをビルドしなおすと、Lib以下もクリアされるので注意しましょう。

svn co http://django-jython.googlecode.com/svn/trunk/ django-jython
cd django-jython
jython setup.py install

http://code.google.com/p/django-jython/wiki/Install

settings.py

Djangoのデータベース周りの設定はsettings.pyで行います。django-jythonを使う場合は、DATABASE_ENGINE にpostgresqlではなく、postgresqlのラッパークラスを指定します。

DATABASE_ENGINE = 'doj.backends.zxjdbc.postgresql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = 'test'             # Or path to database file if using sqlite3.
DATABASE_USER = 'jython'             # Not used with sqlite3.
DATABASE_PASSWORD = 'jython'         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

では、とりあえずはsyncdbで各種設定テーブルなどを作成しましょう。

こんな感じで作成できていることが確認できます。

Adminサイトを試す

次にAdminサイトを動かすために、settings.pyとurls.pyを少しだけ編集しましょう。

まず、settings.pyのINSTALLED_APPSにadminを追加します。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin', # 追加
)

次にurls.pyのadmin-site用のコメントを削除しましょう。

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'^j_site/', include('j_site.foo.urls')),

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

    # Uncomment the next line to enable the admin:
     (r'^admin/(.*)', admin.site.root),
)

準備ができたので、syncdb

サーバを起動したならば、http://localhost:8000/admin/ を開いて確認です。

先ほど登録したadmin/adminでアクセスして、ユーザの追加などを一通り実行してみましたが、問題なく動作しているようです。

補足

データベースエンジンの話でもちらっと書きましたが、Jythonで実行することはJavaの資産活用が出来るというメリットでもありますが、nativeで作られたCPythonの資産は使えなくなるというデメリットもあります。また、運用環境ではJ2EEコンテナが必要になってくるでしょう。
逆に基本はJ2EEで作成する業務アプリケーションがあり、データベースのメンテ機能だけはDjangoで…というのはありかと思います。と、いうか業務アプリを作成するときに意味もなく大量のマスタメンテ機能を実装させられますが、その分のコストがほぼゼロになるってのはエンドユーザにとっても美味しい話の筈。