動的なビューを作るプログラム
ここまでで静的なビューの作り方が分かったと思います。次に動的なビュー、つまりHTMLを動的に作るプログラムを書いてみましょう。実のところ、CSSのパスを生成するときにも動的な処理が行われていますが、次はアプリケーションのロジックを作ってみます。
Zope 3で動的にHTMLを生成するには、Zope Page Template(ZPT)とビュークラスを使います。
ビュークラスはPythonで記述して作るので、表示に使いたいデータ構造を組み立てる複雑なロジックはここに書きます。ZPTは、出力したいHTMLとXMLをほとんどそのまま書けるテンプレートなので、ビュークラスのメソッドで組み立てたデータ構造をHTMLやXMLにはめ込むのに使います。
試しにビュークラスとZPTを使って簡易RSSリーダを作ってみましょう。初めに肝心のロジックから作ります。方針としては、RSSのエントリをPythonの辞書で表現することにして、ビュークラスに辞書のリストを返すメソッドを実装することにしましょう。
ZPTでは、辞書のリストを繰り返し処理でHTMLに埋め込むことにします。ビューの機能を作るコツは、ZPTで扱いやすい単純なデータ構造をメソッドで作ってあげることです。そうすれば、テンプレートのメンテナンスが楽になるので、後でHTMLのデザインを変えたくなってもすぐに対応できます。
さて、いったんZopeのことは忘れて、RSSを読み込んで一連のエントリを辞書のリストに変換するPythonプログラムを考えてみましょう。
対話プロンプトを起動します。
$ python2.4 |
RSSをインターネットから取得することを考えてurllibモジュールを使ってみました。
>>> import urllib |
うまくXMLフォーマットのデータを取得できました。次にこれをパースしましょう。手軽な方法がよかったので、今回はxml.dom.minidomモジュールを使ってみました。
>>> import xml.dom.minidom |
DOMツリーにXMLファイルの改行やスペースが交ざっていました。これは不要なので取り除きます。
>>> len([i for i in item.childNodes if i.nodeType==xml.dom.Node.ELEMENT_NODE]) |
RSSのエントリのタイトルを取得できました。これでどの機能を使えばいいのか大ざっぱに分かりました。これを踏まえて、ビュークラスを追加したのが下の新しいapp.pyです。
import grok |
ビュークラスを使うZPTを追加する
次に、上で実装したビュークラスを使うZPTを追加しましょう。ビュークラスの名前がRSSViewerなので、全部小文字にして拡張子.ptを付けたrssviewer.ptをapp_templatesディレクトリに作ります。
<html> |
app_templates/rssviewer.pt |
tal:repeatは、「このタグを繰り返します」という意味の命令です。ここでは<div tal:repeat="entry view/getEntries">と書いているので、divタグを繰り返し処理します。右のview/getEntriesが繰り返す要素を取得する命令で、このテンプレートのビュー(つまり、RSSViewerインスタンス)のgetEntriesメソッドを呼び出すという意味になります。
左のentryはこのループ変数の名前です。つまり、getEntriesの返り値のリストの要素1つ1つがループごとにentryという名前の変数に束縛されます。この変数はtal:repeatが使われているタグ、この場合はdivタグで囲われた中で有効になります。このテンプレートでは、getEntriesが辞書のリストを返すので、entryは必ず辞書です。
tal:attributesは先にCSSファイルを埋め込むときに使いました。タグの属性を動的に生成する命令です。ここでは、entry/linkとあり、entryは必ず辞書なので、辞書entryのキーがlinkである値をhrefの属性の値にします。
tal:contentはこの属性のあるタグで囲った中身を動的に置き換える命令です。entry/titleとあるので、辞書entryのキーがtitleである値をaタグの中に挿入します。
tal:replaceはcontentと似ていますが、この属性のあるタグごと動的に置き換えます。つまり、tal:replaceが書いてあるタグ自身も置き換えられてなくなってしまうということです。
また、tal:replaceの中では式の初めにstructureと書いてあります。これを書いておくと、置き換えに使われた文字列にHTMLの特殊文字が入っていてもエスケープされません。例えば、<html>は<html>とならず、<html>がそのままHTMLに埋め込まれます。
ZPTは標準で安全側に倒して設計されているため、structureと明示的に書かない限り、動的に挿入される文字列は必ずエスケープされます。今回は、RSSの中にHTMLが入っていることが多いので、structureを使っています。
最後のtal:contentの式では、python:と書いてあります。これはPythonの式を使いますという宣言です。それで、python:の後にはentry.get('dc:date')のようにPythonの式が書かれています。
やっていることは上のtal:contentと同じで辞書entryのキーdc:dateを取得しているだけなのですが、entry/dc:dateと書いた場合に、コロンのせいで別の意味に解釈されてしまうため、わざとPython式を使っています。
2/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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|