本文を読み飛ばす

ZopeからRSSを出力する(非Template)

普通にXMLを出す要領でPythonScript書くだけです.

ZopeをPythonのフレームワークとしている場合は
こっちの方がいいかと.

RSSをXMLとして記述する

というわけでZopeからXMLを出力します.

大枠はなんとなくわかると思いますので,
詳しくは下のサンプル見てください

注意点を残しておきます.

  1. ZopeのエンコーディングからUTF-8に変換する(念のため)
    ブラウザによっては対応できないかもしれないので.
    簡単ですし
  2. RESPONSEでXMLを指定する
    まぁこれはすぐに気づくか, 当り前すぎて見過ごすかってところで.
  3. url_quote, html_quote に努める
    URIや, __call__の内容はquoteをケアしないといけません.

    RSSリーダはその辺りブラウザよりもシビアだったりして

# 特にFireFox(つかFireFoxしか使ってませんが)

quote忘れでエラーになってしまうことがしばしば.

しかも記事(description)の内容によってしまうので
気づくのが遅くなってしまいました.

PythonScriptサンプル

文書(DTMLDocumentなど)が
固まって入っているFolderオブジェクトを
folderとします.

あとは以下のように記述すればOKです:

####
s = """<?xml version="1.0" encoding="UTF-8"?>
       <rss version="2.0"> <channel>
       <title>%s</title>
       <link>%s</link>
       <description>Zope,PDAなどに関する話題を取り上げるホームページ</description>
       <language>ja</language>
       <pubDate>%s</pubDate>
       <lastBuildDate>%s</lastBuildDate>
       <webMaster>kuri65536@hotmail.com</webMaster>
       """ % ( context.title, request.baseurl, DateTime(seq[0].update).rfc822(),
               DateTime().rfc822())
print unicode( s, "euc-jp" ).encode( "UTF-8" )

#### each items
def output_item( obj ):
url = "%s/ShowData?type=updates&amp;id=%s&amp;ext=.html"
        % ( request.baseurl, obj.getId() )
url = html_quote( url )

print """
        <item>
        <title> %s </title>
        <link> %s </link>
        <guid isPermaLink="true"> %s </guid>
        <description> %s </description>
        </item>

""" % ( obj.title, url, url,
        html_quote( obj( context, request )[0:100] + "..." )
)
return printed


for i in seq:
    print unicode( output_item( i ), "euc-jp" ).encode( "UTF-8" )

print """
    </channel> </rss>
"""
return printed

euc-jpとか決め打ちしているところは,
managepage_charset とか使った方がよいかな.

コメント

Comments powered by Disqus
宣伝: