2010-10-05

Blogger で作ったブログの記事の内容を表示する #2

前回ののデザイン(意匠と設計)に沿って実装を行った。

実装概要

app.yaml (修正)

記事内容を表示させるためのリクエスト形式(/post/?id=<id>) に対応させるため、handlers区画に以下の記述を追加した。

(app.yaml より)
- url: /post/.*
  script: postview.py
postview.py と postview.html (新規追加)

postview.py が内容表示リクエスト用のハンドラ、postview.html は同ハンドラが使用するテンプレートになる。

postview.py で定義されている PostViewHandler は一覧表示用の MainHandler を一部書き換えたものになっている。共通部分のくくり出し等のリファクタリングは行っていない。

構造も論理も MainHandler とほとんど変わっていない。目立つ差異はフィードを抽出するためのクラスに記事内容専用の AtomPostFeed を使っていることだ。

現状、テンプレートはフィードから抽出した記事の内容を流し込むだけのものになっている。タイトル以外のメタ情報(作成日付やタグ等)は一切表示していない(フィードから抽出もしていない)。

feed/parser.py (修正)

変更点は、記事の内容 (feed/entry/content) を抽出するようになったことと、ブログの permalink と個別フィードへの URL を抽出するようにしたこと。

main.py と feed/core.py (修正)

内容表示リクエストでは、フィードの取得時に必要なポスト ID をリクエストパラメータとして受け取る。一方、一覧表示リクエストでは、リクエストパラメータとしてページ番号を受け取る(フィードを取得する際に start-index を指定する値に変換される)。この違いを吸収するため、それぞれに専用のフィードオブジェクトを用意することにした。従来からある AtomFeed を一覧表示用に、新しく追加した AtomPostFeed を内容表示用として使う。リクエストパラメータは、それぞれをインスタンス化する際に引数として渡すことにした。このため、フィードオブジェクトのインスタンス化と get メソッドの呼び出し形式が変わることになり、main.py を修正した。

core.py では、この他にも、フィードデータを保持する Entry クラスを修正(抽出するデータの種類が増加したため)、さらに一覧表示で各項目に張るリンクを、これまでの記事への permalink から、内容表示リクエストの形式に変更してある。

feed/post.py (新規追加)

コードの中身はほぼ AtomFeed からの流用になっている。いずれリファクタリングし、共通部分を BloggerFeed に押し出すつもりだ。

この AtomPostFeed で少し特殊なのは、内容表示リクエストの形式で /post/ というパラメータなしのパターンをサポートしたこと。この場合、ポスト ID を指定するタイプの URL からフィードを取得することはできない。そこで、ポスト ID が指定されなかった場合に限って、通常のフィード取得用の URL (一覧表示リクエストで利用しているもの) に max-results=1 を指定して取得することで対応した。

ファイルのリネーム

テンプレートへの postview.html の追加にともない、page.htmllistview.html とリネームした。今後、テンプレートを追加する際には、以下の名前規約にしたがう。

<表示するオブジェクト>view.html

今回、追加したテンプレートは記事("post")を表示するから postview.html、旧テンプレートは記事一覧("list")を表示するから listview.html となる。

その他の変更

今回から logging モジュールを使うことにした。sys.stderr に書き出していたエラーメッセージ(これもログに流れるようだが)を logging.error を使って書き換えている。

今後の展開

肝心の記事の内容そのものを表示することができるようになった。次は、記事のメタ情報を表示させることを考える。ここで言うメタ情報とは、作成日時、ラベルのことだ。

フィードには published に加えて updated という日時データもふくまれているので、更新日時も表示させても良い。

ラベルは複数指定可能なので、表示にも工夫の余地がある。まずは、辞書順にソートして並べて表示、で良いが。

関連リンク

関連記事

0 件のコメント:

コメントを投稿