Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
おみくじを作ってみましょう。
おみくじプログラム
今回作ってみるアプリケーションはあなたのラッキーカラーを教えてくれるお みくじです。CGIのサンプルとしても定番ですね。要はアクセスするたびに表 示内容が変わるよ、っていうことです。
Pythonパッケージを作る
Zope3にはどんな風にプログラムを書いていけばいいのか、明確な指針があり ます。これはZope3の設計ポリシーといってもいいでしょう。これに沿ってお みくじプログラムを書いていきましょう。
Zope2と違って、Zope3のアプリケーションはPythonのパッケージとして作りま す。つまり、「Products以下に置くこと」みたいなお約束はありません。どこ かPYTHONPATHの通ったところを作業場所に決めてください。
作業場所を決めましたね。今回作るパッケージ名はomikujiとします。ディレ クトリを作りましょう。
$ mkdir omikuji $ cd omikuji $ touch __init__.py
はい、上記のコマンドでPythonのパッケージ omikuji ができました。 パッケージには __init__.py が必要です。忘れないでくださいね。 ちゃんとPYTHONPATHの通っている場所に作りましたか?Pythonの対話シェルで 確認しましょう。
$ python Python 2.3.5 (#2, Jun 19 2005, 13:28:00) [GCC 3.3.6 (Debian 1:3.3.6-6)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import omikuji
インポートできればOKです。
omikujiパッケージのトップディレクトリ
パッケージのトップディレクトリには、アプリケーションにとって最重要な中 核の機能を配置します。それ以外のものは置きません。
おみくじアプリケーションの最重要機能はラッキーカラーを算出するというア ルゴリズムです(単にランダムを使うだけですが)。
これを kuji.py に書きましょう。
"""Fortune cookie
$Id: 001130,v 1.57 2005/11/20 21:29:00 root Exp $
"""
import random
color = ('red', 'green', 'blue', 'white', 'black')
def luckycolor():
"""lucky color algorithm"""
return random.choice(color)
できました。luckycolor関数が肝心な機能です。
次に configure.zcml というファイルを作ってください。これはZCMLという Zope3の設定ファイルです。ZCMLはZope3のコンポーネント同士を結びつけるた めの糊の役割を果します。これがないとZope3はおみくじプログラムを読み込 んでくれません。
細かい説明はしませんが、ZCMLはZopeの起動時に読み込まれ、あるコンポーネ ントから別のあるコンポーネントへのアダプターを登録していきます。これが 糊の役割です。実行時にZopeのアプリケーションは登録されたアダプターを見 つけて必要な処理を行っています。
今回のアプリケーションは本当に単純なものなので、ZCMLに書くことはほとん どありません。以下の内容を書いてください。
<include package=".browser" />
ZCMLには色々なディレクティブ(タグ)があります。最上位で使えるディレクティ ブ(あるディレクティブの中でしか使えないディレクティブがたくさんありま す)は configure とinclude です。
include は次に読み込むZCMLを指定するディレクティブです。 ここでは、このパッケージ内にあるbrowserパッケージの中にある configure.zcmlを読み込めという命令になります。ですが、まだbrowserパッ ケージはありませんね。作りましょう。
$ mkdir browser $ touch browser/__init__.py
browserは、Zope3の命名規則でウェブブラウザ向けの見た目の機能を提供する パッケージの名前と決められています。Zopeのソースツリーを眺めてみれば、 browserパッケージがたくさんあることが分かります。
おみくじプログラムは、ウェブブラウザでラッキーカラーを教えてあげるアプ リケーションにするつもりなので、browserパッケージを作りました。
これで、トップディレクトリに必要なものが全て揃いました。
$ ls -1 omikuji __init__.py browser/ configure.zcml kuji.py
browserパッケージ
次にウェブブラウザ向けの機能を作っていきましょう。
まず、空っぽのファイルを作ります。
$ cd browser $ touch configure.zcml $ touch view.py $ touch view.pt $ ls -1 __init__.py configure.zcml view.pt view.py
また、configure.zcmlが出てきましたね。これにはこのパッケージで提供する ウェブブラウザ向けの機能の設定を書きます。こんな感じでパッケージの中に は必ず一つのconfigure.zcmlを作るというパターンを覚えておきましょう。
view.pyにはビュー(View)クラスと言われる表示用ロジックを提供するクラス を書きます。Zope3ではビュー(例えばHTML1ページ)にビュークラスを付けるこ とができます。Zope2ではちょっとした関数がたくさんのPythonScriptになっ てごちゃごちゃになるところですが、Zope3はビュークラスを使うことでとて もすっきりした構成になります。
view.ptは表示用に使うテンプレート言語ZopePageTemplateで書かれたファイ ルです。ページの表示結果にこのページテンプレートを使えます。
これで、おみくじアプリケーションに必要なディレクトリ・ファイルの構成が できあがりました。これがZope3用パッケージの定番の構成です。
$ ls -R1 omikuji omikuji: __init__.py browser/ configure.zcml kuji.py omikuji/browser: __init__.py configure.zcml view.pt view.py
Zope3のパッケージを作るための便利なツールがあるようです。私はまだ使っ たことがないのですが、Zope3の開発に使われているようなので、使って損は なさそうです。URLだけ紹介しておきます。
http://www.zope.org/Members/fdrake/zpkgtools
configure.zcml
今回はZCMLから書いていきましょう。
<configure
xmlns="http://namespaces.zope.org/browser">
<page
for="*"
name="omikuji.html"
permission="zope.View"
class=".view.KujiView"
template="view.pt"
/>
</configure>
ZCMLでは、普通はconfigureディレクティブを書いて、その中にいろいろなディ レクティブを書きます。(ZCMLの細かい説明は省きます。)
configureではその中で使うディレクティブを使うために、使えるネームスペー スを宣言する必要があります。
ここでは、ウェブブラウザ用のディレクティブを提供するbrowserネームスペー スを有効にしています。
xmlns="http://namespaces.zope.org/browser"
pageディレクティブは、URLでアクセスできるウェブブラウザ用の1ページを定 義するためのものです。
<page
for="*"
name="omikuji.html"
permission="zope.View"
class=".view.KujiView"
template="view.pt"
/>
for にはこのページの対象になるインターフェースを指定しますが、このおみ くじパッケージはどこでも見られるようにするので、特にインターフェースは 指定しないために * としています。今はとりあえずあまり気にしなくてもい いです。
name は実際のURLになる部分です。特に拡張子をhtmlにする必要はありません。 好きな名前を付けられます。ここではomikuji.htmlとしました。
permission はこのページにアクセスするための権限の設定です。おみくじを 誰でもみられるようにzope.Viewパーミッションを定義しておきました。ちな みにZope3のパーミッションは全て宣言してからでないと使えません。これは Zope2と違う点ですね。zope.Viewはzope本体ではじめから宣言されているパー ミッションです。
class はこのページで使うビュークラスを指定します。ページにアクセスがあ ると、ビュークラスで指定したクラスのインスタンスが作られて、直接そのメ ソッドが実行されたり、ページテンプレート内でこのインスタンスにアクセス できたりします。
ここではviewモジュールのKujiViewクラスをビュークラスとして使うように宣 言しています。
template はこのページで使うテンプレートを指定します。同じディレクトリ にあるview.ptを使うように宣言しています。
ビュークラス view.py
configure.zcmlが完成しました。この中でビュークラスを使うよう書きました。 ビュークラスを実装しましょう。
"""Browser view component for fortune cookie
$Id: 001130,v 1.57 2005/11/20 21:29:00 root Exp $
"""
from omikuji.kuji import luckycolor
class KujiView:
def luckycolor(self):
"""today's lucky color."""
return luckycolor()
luckycolorメソッドを持つクラスを作りました。このメソッドは前に定義した luckycolor関数を返すだけです。
テンプレート view.pt
ページテンプレートです。ここで上述のビュークラスのluckycolorメソッドを 実行して、その結果をHTMLに埋め込みましょう。これがomikuji.htmlの処理結 果としてウェブブラウザに返ります。
<html> <head> <title>Lucky color</title> </head> <body> Your lucky color is <span tal:replace="view/luckycolor">red</span>!! </body> </html>
Your lucky color is <span tal:replace="view/luckycolor">red</span>!!
view/luckycolor となっている部分が重要なところです。ここでviewという名 前はZCMLで定義したビュークラスのインスタンスを指しています。このインス タンスのluckycolorメソッドを実行せよ、という意味になるので、結果として 何かの色の名前になります。
完成
これで完成です。最後にZope3が起動するときにomikujiパッケージを読み込む ようにZCMLをpackage-includesに追加しておきましょう。
$ cd Zope3のルートディレクトリ $ cd package-includes
omikuji-configure.zcmlの中身は次のとおり。
<include package="omikuji" />
omikuji-configure.zcmlを置いたpackage-includesはちゃんとZope3が起動し たときに読み込む場所になっているでしょうか。前のコラム「起動の仕組み」 に書いたsite.zcmlのことを思い出してくださいね。
omikuji-configure.zcmlの名前の規則ですが、これは一般的に XXX-configure.zcmlのXXXの部分にパッケージ名が入ります。PYTHONPATHの直 下にあるトップのパッケージは名前に重複がないはずですから、この命名規則 でZCMLの名前も重複しないはずですね。
それでは、Zope3を起動してください。うまく起動しましたか?起動しなかっ たら、エラーメッセージがでているはずです。良く読んで解決してください。 分からなかったらフィードバックで質問してくれてもOKです。
起動したら、
http://localhost:8080/omikuji.html
にアクセスしてみてください。おみくじページが表示されましたか?こんな風 にメッセージが表示できたら成功です。
Your lucky color is black!!
今回はここまでです。いかがだったでしょうか。次回はおみくじを少しだけ発 展させて、ラッキーカラーに表示する色の種類を自分で登録できるようにした いと思います。
フィードバックもお待ちしています。
次回、超シンプルなアプリケーションを作ろう その2に続く。