第2回 ビュークラスとZPTを使って簡易RSSリーダ作成

田原 悠西

2008/9/11

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

 第1回「Zope 3の魅力に迫る」では、Zope 3の特徴を紹介したほか、Zope 3/Grokの環境設定とインストールを行いました。

 それでは、前回、grokprojectコマンドで作成したプロジェクト「Sample」を使って、アプリケーションの開発方法を順を追ってみていきたいと思います。

 

 

 

 

 

プロジェクトディレクトリの確認

 grokprojectが作ったSampleディレクトリの中身を確認していきましょう。

 binディレクトリには第1回で作ったサーバ起動用のスクリプトをはじめ、開発中に使ういくつかのコマンドがあります。parts/dataディレクトリには、Zopeのオブジェクトデータベース(ZODB)のデータが保存されます。src/sampleディレクトリには、アプリケーションのソースコードが置かれています。アプリケーションの開発はここで行います。

 そのほかのファイルやディレクトリも含めて、grokprojectが生成したファイルやSampleディレクトリはzc.buildoutによって管理されます。zc.buildoutについては次回以降で触れたいと思います。いまのところ、気にする必要はありません。

 次に、src/sampleディレクトリの中身を確認しましょう。

 app.pyはアプリケーションのエントリポイントです。この時点ではgrokprojectが生成したひな型のソースコードが入っています。これが最も重要なファイルです。後で編集していきます。また、app_templatesはapp.pyのプログラムがHTMLを生成するために使うテンプレートファイル置き場です。

 configure.zcmlは、Zope 3のDI用の設定ファイル(ZCML)です。Grokを使う場合、アプリケーション開発者が自身でこれを書く必要はありません。このファイルはあなたのアプリケーションがGrokを使うことを宣言しています。これはそのままで構いません。

 testing.pyとftesting.zcmlは、あなたのアプリケーションのユニットテストのためのひな型です。テストは今後追加していきますが、いまのところ、触らなくて構いません。

 __init__.pyはこのディレクトリをPythonパッケージにするために置いてあります。中身は空です。

ひな型のアプリケーションの仕組み

 それでは、app.pyの中身を見ていきます。以下はapp.pyのソースコードです。

import grok

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

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

 Sampleクラスは、grok.Applicationクラスを継承しているのでアプリケーションのエントリポイントになり、管理画面でアプリケーションとして追加可能になります。また、grok.Containerを継承しているので、モデルを提供するコンポーネントになります。ここでは永続オブジェクトとなり、データを格納する役割になります。

 Indexクラスは、grok.Viewクラスを継承しているので、ビュー(表示機能)を提供するコンポーネントになります。ここではHTMLを生成することがビューとしての役割になります。

 ソースコードには以上のことしか書かれていませんが、Grokは次のようなコンポーネントの関連付けを暗黙に行います。

 Indexクラスは、Sampleクラス用のindexという名前の表示コンポーネントになります。app_templatesディレクトリは、app.py(appモジュール)用のテンプレートを入れるディレクトリになります。

 app_templates/index.ptは、Indexクラスで使われるテンプレート(.ptはZopeで使われているZope Page Templateというテンプレート言語ファイル用の拡張子)になります。app_templates/index.ptファイルの中身は次のとおりです。

<html>
<head>
</head>
<body>
  <h1>Congratulations!</h1>

  <p>Your Grok application is up and running.
  Edit <code>sample/app_templates/index.pt</code> to change
  this page.</p>
</body>
</html>
app_templates/index.pt

 名前を使った暗黙の関連付け機能は、いまどきのWebアプリケーションフレームワークでよく使われている手法です。GrokはこれによってZope 3を気軽に使えるようにしています。ちなみに、Zope 3を直接使った場合、コンポーネント同士の関連付けはZCMLを使って開発者が明示的に行います。

 以上の仕組みによって、先ほど管理画面で試しに追加したアプリケーション(名前はtest)のURL「http://localhost:8080/test/index」にアクセスすると、

Congratulations!

Your Grok application is up and running. Edit sample/app_templates/index.pt to change this page.

と表示されます。「http://localhost:8080/test」にアクセスしても同じ結果になるのは、indexという名前がデフォルトの表示コンポーネント名として使われているためです。表示名を省くとデフォルトのindexを指定したことになります。

ビューの追加

 それでは、新しいビューを追加してみましょう。新しいapp.pyは次のとおりです。

import grok

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

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

class HelloWorld(grok.View):
    pass

 新たにHelloWorldという名前のビュークラスを追加しました。このクラス用のテンプレートも追加します。

<html>
<head>
</head>
<body>
  <h1>Hello world</h1>
</body>
</html>
add_templates/helloworld.pt

 以上の変更を加えたら、サーバを再起動して「http://localhost:8080/test/helloworld」にアクセスしてください。すると、Webブラウザに、

Hello world

と表示されます。

 次に、CSSファイルをHTMLに入れてみましょう。staticディレクトリを作って、その中にmain.cssを保存してください。

h1 {color:red};
static/main.css

 helloworld.ptを以下のように編集します。

<html>
<head>
<link rel="stylesheet" type="text/css"
    tal:attributes="href static/main.css" />
</head>
<body>
  <h1>Hello world</h1>
</body>
</html>
add_templates/helloworld.pt

 main.cssを読み込む行を追加しました。tal:attributesという部分がZope 3のテンプレート言語で書かれた個所です。これはlinkタグのhref属性の値を動的にmain.cssのURLに置き換えています。

 staticというディレクトリは、Grokのアプリケーションで共通の静的ファイルの置き場所です。テンプレート用のディレクトリと違ってモジュールごとに分かれていません。

 以上の変更を加えたら、サーバを再起動して、もう一度「」にアクセスしてください。今度は赤い文字でHellow worldが表示されたと思います。main.cssのパスは、

/test/@@/sample/main.css

となっています。「@」はZope 3でビューコンポーネントを呼び出すときの特殊な記号として使われています。特に意識する必要はありませんので、そういうものだと思ってください。

 静的な画像も同様のやり方で追加できます。ユーザーがアップロードしないアプリケーション共通のアイコン画像などはこのやり方で管理するといいでしょう。

 
1/3

Index
ビュークラスとZPTを使って簡易RSSリーダ作成
Page1
プロジェクトディレクトリの確認
ひな型のアプリケーションの仕組み
ビューの追加
  Page2
動的なビューを作るプログラム
ビュークラスを使うZPTを追加する
  Page3
Webブラウザからの入力に対応させる

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 記事ランキング

本日 月間