前回ののデザイン(意匠と設計)に沿って実装を行った。
実装概要
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.html を listview.html とリネームした。今後、テンプレートを追加する際には、以下の名前規約にしたがう。
今回、追加したテンプレートは記事("post")を表示するから postview.html、旧テンプレートは記事一覧("list")を表示するから listview.html となる。
その他の変更
今回から logging
モジュールを使うことにした。sys.stderr
に書き出していたエラーメッセージ(これもログに流れるようだが)を logging.error
を使って書き換えている。
今後の展開
肝心の記事の内容そのものを表示することができるようになった。次は、記事のメタ情報を表示させることを考える。ここで言うメタ情報とは、作成日時、ラベルのことだ。
フィードには published
に加えて updated
という日時データもふくまれているので、更新日時も表示させても良い。
ラベルは複数指定可能なので、表示にも工夫の余地がある。まずは、辞書順にソートして並べて表示、で良いが。
関連リンク
- アプリケーションのイベントのログ (GAE 公式ドキュメントより)
- 14.5 logging -- Python 用ロギング機能 (Python ライブラリリファレンス; PyJUG)
- mnbi/bloggerglass (github)
0 件のコメント:
コメントを投稿