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を使えばそんなに難しいことではありません。

Prev Entry

Next Entry