第3回 掲示板を作ろう(データモデルの定義とユニットテスト)

田原 悠西

2008/10/10

Pythonで作られたWebアプリケーションフレームワークのZope 3とは何か。設計思想から実際の運用ノウハウまでを解説する(編集部)

 今回からは実用的なアプリケーションの開発に必要な機能の使い方を順番に紹介していきたいと思います。

 サンプルとして、インターネット上でよく使われている掲示板を作っていきましょう。目新しいものではありませんが、Webアプリケーションの開発に必要な要素はすべて詰まっていますので、これから紹介していく各機能は実際の開発に応用できると思います。

 

 

 

grokprojectでアプリケーションの開発環境を作る

 では、前回までと同様にgrokprojectコマンドを使って、空のアプリケーション開発環境を作りましょう。名前はMyForumとします。

 また、今回からは継続的に開発を進めるので、ソースコードをSubversionで管理することにします。筆者の環境ではホームディレクトリにSubversionのレポジトリを作って、そこにMyForumのソースコードを入れることにしました。読者の皆さんは自分用のレポジトリを用意してください。

$ cd /home/yusei
$ svnadmin create repos

 次にgrokprojectコマンドを実行します。筆者の環境では/home/Zope3/ENV以下にeasy_installで必要なパッケージをインストールしてあります。詳しくは第1回「Zope 3の魅力に迫る」を読んでください。

$ cd ~/Zope3
$ ./ENV/bin/grokproject --svn-repository=file:///home/yusei/repos MyForum

Committed revision 1.
Checked out revision 1.
Enter module (Name of a demo Python module placed into the package) ['app.py']:
Enter user (Name of an initial administrator user): zope
Enter passwd (Password for the initial administrator user): zope
Enter eggs_dir (Location where zc.buildout will look for and place packages) ['/home/yusei/buildout-eggs']:
Invoking zc.buildout...

 以上で、アプリケーション開発環境のセットアップは完了です。自動的にSubversionのレポジトリにこのプロジェクト用のディレクトリが作られています。このコマンドで作られたMyForumディレクトリはsvnコマンドでいつでも変更点をコミットできる状態になっています。

 grokprojectが作ったMyForumディレクトリの中はこのようになっています。

$ ls -1 MyForum
bin/
buildout.cfg
develop-eggs/
parts/
setup.py
src/

 いまのところ重要なのは、srcディレクトリの中のmyforum以下です。ここにプログラムのコードを追加していきます。src/myforumディレクトリに移動して、中身を確認してみてください。

$ cd cd MyForum/src/myforum
$ ls -1
app.py
app_templates/
configure.zcml
ftesting.zcml
__init__.py
testing.py

データモデルを考える

 それでは、アプリケーションの開発を始めましょう。どんな掲示板アプリケーションにするかを決めて、それに合わせたデータモデルを考えましょう。

 掲示板は、一般的なスレッド形式のものにしたいと思います。1つの掲示板に複数のスレッドを作ることができて、そのスレッドにコメントを書き込むことができるタイプです。細かく定義すると、掲示板はスレッドを格納することができ、スレッドはコメントを格納することができる、とします。

 では、プログラミングでこの定義を記述しましょう。

 初めに掲示板を表すクラスについて。これは自動的に生成されたapp.pyにMyForumクラスとして定義されているので、そのまま使うことにします。以下がapp.pyのソースコードです。

import grok

class MyForum(grok.Application, grok.Container):
    pass

class Index(grok.View):
    pass # see app_templates/index.pt
app.py

 MyForumクラスはアプリケーションの階層構造のトップになるので、grok.Applicationクラスを継承しています。ほかのクラスがgrok.Applicationを継承する必要はありません。

 また、ほかのデータを格納するためにgrok.Containerを継承しています。grok.ContainerはPythonの辞書クラスのように振る舞う永続クラスです。永続クラスのインスタンスは自動的にZODB(Zopeのオブジェクトデータベース)に保存されます。

 いま定義しているクラスはすべてデータを保存するためのデータモデルなので、永続クラスを継承します。

 IndexクラスはMyForumのビュークラスです。同じモジュール(同じ.pyファイル)にgrok.Viewクラスの派生クラスとして定義しておくと、grokが自動的にそれを見つけてMVCモデルのビューとしてZope 3のコンポーネントレジストリに登録してくれます。

 Indexというクラス名にしておくと、そのクラスのデフォルトのビューになり、URLでは「/index」もしくは「/」でアクセスできると覚えておいてください。

 次に、スレッドを表すクラスを定義しましょう。grokprojectが生成するのは、アプリケーションのトップレベルのクラスだけなので、ここから先は自分で定義する必要があります。

 ファイル名をforumthread.pyとします。本当はthread.pyとしたいところですが、Pythonの標準ライブラリと名前が重複してしまうのを避けました。以下がforumthread.pyのソースコードです。

import grok

class ForumThread(grok.OrderedContainer):

    pass
forumthread.py

 スレッドはコメントを格納します。コメントは書き込んだ順番に並べたいので、順番を保持するgrok.OrderedContainerを使うことにしました。Pythonの辞書と同様にgrok.Containerは要素の順番を記録しません。

 次にコメントを表すクラスを定義します。ファイル名をcomment.pyとします。以下がcomment.pyのソースコードです。

import grok

class Comment(grok.Container):

    pass
comment.py

 ほかのクラス同様にコメントも永続クラスのgrok.Containerを継承しています。Commentはいまのところデータモデルの末端にあり、何かほかのデータを格納することがないので、grok.Containerを使う代わりにgrok.Modelクラスを使うことも可能です。

 しかし、将来拡張したくなったときにgrok.Containerの方が便利なので、ここではgrok.Containerを使うことにしました。

 
1/3

Index
掲示板を作ろう(データモデルの定義とユニットテスト)
Page1
grokprojectでアプリケーションの開発環境を作る
データモデルを考える
  Page2
インターフェイスでスキーマを定義する
ユニットテストを書く
  Page3
buildout.cfgの調整
Subversionにコミットする

Zope 3とは何ぞや?

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間