Djangoっぽい開発

2009年07月23日(木) 00:09

そろそろDjango1.1がでるようなので、Djangoっぽさって何?ってとこを再度書いてみよう。

もちろん、どう使うかは自由だし、付属しているものの一部だけを使うようなパターンもありありです。ただ、どう作ればいいのか?というヒントになるかもとか思って書くのです。

「チーム内で簡単にコードスニペットの共有がしたい、スニペットを登録したらチームのIRCに通知が欲しい」という状況が発生したとします。

まず、Pasteを用意するにはどうするか。コードを書くのはまだ早いですよ!

GoogleやGoogle Codeでdjango pasteというように検索します。すると django-paste という アプリケーション が見つかります。 サンプルサイトはこんな感じ で、十分です。

django-paste に書かれている必要なライブラリも一緒にインストールしておきます(mpttはsvn版を入れる)。django-pasteはPYTHONPATHの通ったところに置くだけでも構わないはずです。

次に、「スニペットを登録したらチームのIRCに通知が欲しい」をどう実現するか。定期的にデータをクロールしてIRCに投げても構いませんが、恐らくIRCの会話中で使いたいこともあるはずです。登録してURLをコピってIRCに貼付けるのは面倒です。

ここで、Django使いは今回のプロジェクト専用のアプリケーションを用意することを思いつきます。Djangoの思想が理解できていない人はここで詰まるはずです。

順に見ていきますか?まず、プロジェクトを作成してみましょう。

$ django-admin.py startproject snippet
$ cd snippet
$ python manage.py startapp snippet_notifier

続いてとりあえずsqlite3を使うように設定をして、INSTALLED_APPSにmpttとdpasteとsnippet_notifierを追加します。

#settings.pyの上の方
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = os.path.join(BASE_DIR, 'data.sqlite3')             # Or path to database file if using sqlite3.

#settings.pyの下の方
INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'mptt',
  'dpaste',
  'snippet_notifier',
)

そんで、snippet_notifierアプリケーションから、dpasteのSnippetが登録されるタイミングでIRCに発言させます。dpasteをいじらずにやるのがポイントです。

snippet_notifier/__init__.py:

from django.db.models.signals import post_save
import irclib
import time

from dpaste.models import Snippet

def notice_to_irc(sender, instance, created, **kwargs):
  if not created:
    return
  msg = u'Code Snippet: %s by %s %s' % (instance.title, instance.author, instance.get_absolute_url())
  try:
    irc = irclib.IRC()
    server = irc.server()
    if server.connect('ircserver', 6667, 'paste-bot', ircname='paste-bot'):
      server.join('#teamx')
      time.sleep(1)
      ret = server.privmsg('#teamx', msg.encode('utf8'))
      time.sleep(1)
      server.disconnect()
    else:
      print "can't connect"
  except Exception, e:
    print e

post_save.connect(notice_to_irc, sender=Snippet)

urls.pyで適当なURLをdpaste.urlsに割り当ててsyncdbしてrunserverしてみましょう。

うーっぷす! base.htmlが無い!

これが第二のポイントです。Djangoのアプリケーションは、再利用されることを前提として開発することが多いので、大本のテンプレートが含まれていないことも不思議ではありません。

dpaste/templates/dpaste/snippet_list.htmlあたりを眺めて、base.htmlに必要そうなblockを探し当てます。contentとかtitleとかは大抵同じ名前でつけられています。本当はダミーのbase.htmlがあればいいのですが、用意されていないことが多いのは少しストレスなので、何か作るときには考慮してください><

あとはデザインを当てたりすればよいのですが、とりあえずはhttp://dpaste.de/を表示して奪ったりすればよいと思います。base.htmlは、snippet_notifier/templates/base.htmlとかに置くなりなんなりします。

これがDjangoっぽい、ものです。dpasteはいっさい手を入れること無く再利用できました。提供されているテンプレートを変更したい場合だってdpasteのコードベースは安全です。

Djangoでどう作ればいいかわからない?

再利用可能なように作ってください。Djangoを使えばそんなに難しいことではありません。


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar