今回からは実用的なアプリケーションの開発に必要な機能の使い方を順番に紹介していきたいと思います。
サンプルとして、インターネット上でよく使われている掲示板を作っていきましょう。目新しいものではありませんが、Webアプリケーションの開発に必要な要素はすべて詰まっていますので、これから紹介していく各機能は実際の開発に応用できると思います。
grokprojectでアプリケーションの開発環境を作る
では、前回までと同様にgrokprojectコマンドを使って、空のアプリケーション開発環境を作りましょう。名前はMyForumとします。
また、今回からは継続的に開発を進めるので、ソースコードをSubversionで管理することにします。筆者の環境ではホームディレクトリにSubversionのレポジトリを作って、そこにMyForumのソースコードを入れることにしました。読者の皆さんは自分用のレポジトリを用意してください。
$ cd /home/yusei |
次にgrokprojectコマンドを実行します。筆者の環境では/home/Zope3/ENV以下にeasy_installで必要なパッケージをインストールしてあります。詳しくは第1回「Zope 3の魅力に迫る」を読んでください。
$ cd ~/Zope3 |
以上で、アプリケーション開発環境のセットアップは完了です。自動的にSubversionのレポジトリにこのプロジェクト用のディレクトリが作られています。このコマンドで作られたMyForumディレクトリはsvnコマンドでいつでも変更点をコミットできる状態になっています。
grokprojectが作ったMyForumディレクトリの中はこのようになっています。
$ ls -1 MyForum |
いまのところ重要なのは、srcディレクトリの中のmyforum以下です。ここにプログラムのコードを追加していきます。src/myforumディレクトリに移動して、中身を確認してみてください。
$ cd cd MyForum/src/myforum |
データモデルを考える
それでは、アプリケーションの開発を始めましょう。どんな掲示板アプリケーションにするかを決めて、それに合わせたデータモデルを考えましょう。
掲示板は、一般的なスレッド形式のものにしたいと思います。1つの掲示板に複数のスレッドを作ることができて、そのスレッドにコメントを書き込むことができるタイプです。細かく定義すると、掲示板はスレッドを格納することができ、スレッドはコメントを格納することができる、とします。
では、プログラミングでこの定義を記述しましょう。
初めに掲示板を表すクラスについて。これは自動的に生成されたapp.pyにMyForumクラスとして定義されているので、そのまま使うことにします。以下がapp.pyのソースコードです。
import grok |
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 |
forumthread.py |
スレッドはコメントを格納します。コメントは書き込んだ順番に並べたいので、順番を保持するgrok.OrderedContainerを使うことにしました。Pythonの辞書と同様にgrok.Containerは要素の順番を記録しません。
次にコメントを表すクラスを定義します。ファイル名をcomment.pyとします。以下がcomment.pyのソースコードです。
import grok |
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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|