少し RSS コンテンツを豊富にしてみました

サムネイル画像やキーワード等を追加しました。


RSS 用の HTML テンプレートとして、以下を作成しました。
ここではテンプレート値として article エンティティを利用しています。

<!-- HTML Template for RSS -->
<!-- rss.html -->
<img src="/static/images/thumbnail/{{ article.site.thumbnail }}" alt="thumbnail" align="left" hspace="15"/>
<h3>{{ article.site.name }}</h3>
<p>更新日:{{ article.update|date:"Y年n月j日 H:i" }}</p>
{% for keyword in article.keywords %}
<span><a href="/search?key={{ keyword }}">{{ keyword }}</a>{% if not forloop.last %}, {% endif %}</span>
{% endfor %}
<br clear="left" />


Google App Engine では、Django の配信フィードフレームワーク feedgenerator を利用してフィード作成が可能です。

#
# Python
#
import os
from google.appengine.ext import webapp
from google.appengine.api import memcache
from django.utils import feedgenerator
import models


class UpdateRSSHandler(webapp.RequestHandler):

    def render(self, template_name, template_values={}):
        ''' HTML レンダリングコンテンツを返す '''
        directory = os.path.dirname(__file__)
        path = os.path.join(directory, 'html', template_name)
        return template.render(path, template_values)

    def get(self):
        self.update_rss()
        
    def update_rss(self):
        title = u'【2ch】キーワードあんてな'
        link = u'http://keyword-antena.appspot.com/'
        description = u'2chまとめサイトのアンテナです。キーワードで絞り込み可。'
        language = u'ja'
        # フィード作成 (RSS 2.01.)
        rss2_feed = feedgenerator.Rss201rev2Feed(title=title, 
                                                 link=link,
                                                 description=description,
                                                 language=language)
        # フィード作成 (Atom 1.0.)
        atom_feed = feedgenerator.Atom1Feed(title=title, 
                                            link=link,
                                            description=description,
                                            language=language)
        
        articles = # 配信する記事エンティティのリスト
        for article in articles:
            render = self.render('rss.html', {'article': article})  # 上記 HTML テンプレート
            # フィードにエントリ情報を追加
            rss2_feed.add_item(title=article.name, 
                               link=article.url, 
                               description=render)
            atom_feed.add_item(title=article.name, 
                               link=article.url, 
                               description=render)
        # feed インスタンスを文字列化
        rss2_text = rss2_feed.writeString('utf-8')
        rss_model = models.RSS(key_name='rss2.0', 
                               text=db.Text(rss2_text, encoding='utf-8'))
        rss_model.put()
        
        atom_text = atom_feed.writeString('utf-8')
        atom_model = models.RSS(key_name='atom', 
                                text=db.Text(atom_text, encoding='utf-8'))
        atom_model.put()
        
        # memcache の更新
        memcache.set_multi({'rss2.0': rss_model, 'atom': atom_model}, 
                           time=7200)  # 2 hours


フィードの存在をブラウザに知らせるには、HTML の タグ内に以下を記述しておく必要があります。

<head>
  <!-- RSS -->
  <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="/feed/index.xml" />
  <link rel="alternate" type="application/atom+xml" title="Atom" href="/feed/atom.xml" />
</head>


ここで紹介したフィードは、RSS2.0 (http://keyword-antena.appspot.com/feed/index.xml), Atom (http://keyword-antena.appspot.com/feed/atom.xml) から閲覧できます。