パーソナルツール
現在の場所: ホーム takalog
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2009June »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
ferret (24)
google (34)
icecream (44)
lego (69)
mac (20)
misc (74)
moblog (277)
movie (32)
pc (44)
plone (337)
puzzle (42)
python (56)
server (67)
snowscoot (9)
software (126)
sports (32)
suidou (30)
winds (47)
 
文書操作

mod_python + mod_proxy でフィルタ用バッファ

作成者 takanori投稿日 2009年06月19日 23時58分 最終変更日時 2009年06月20日 16時31分

lxml を使って html をフィルタリング のエントリで HTML をパーサで解釈して変換する話を書きました。

その下ごしらえとして、変換元のデータを取得する必要があります。

で、ここで変換元の HTML が他のサーバだったりすると mod_proxy でデータを取得しますが、この際取得するデータがいくつかの chunk (データのかたまり)に分かれて渡されるため、一つにまとめないと HTML パーサに通すことができません。

そこで、データをバッファに入れる必要があるんですが、そのやり方に一般的な方法がないのかなーと探してたら、 mod_python のメーリングリストの [mod_python] libxml2 and libxslt in mod_python というメールで紹介されていました。

そのコードはこんな感じです。

import mod_python
from cStringIO import StringIO

def outputfilter(filter):
    """apache output filter with mod_proxy"""

    # create buffer
    try:
        buffer = filter.req.buffer
    except:
        filter.req.buffer = StringIO()
        buffer = filter.req.buffer

    s = filter.read()
    while s:
        buffer.write(s)
        s = filter.read()

    if s is None:
        data = buffer.getvalue()
        buffer.close()
        data = lxmlfilter(data)
        filter.write(data)
        filter.close()

ポイントは # create buffer と書いてある部分で、わたってきた apache のリクエストに対して、 buffer が存在しなければ buffer を追加し、あとはその buffer にデータを追加していきます。 最後のデータであることが if s is None: でわかるので、 buffer の中身を取り出してフィルタにかけたりとか後処理をします。

apache のリクエストオブジェクトは同じリクエストだと当然同じオブジェクトなので、そこに動的にバッファを追加するという考えのようです。なるほどーと思いました。

以前私は apache.req からリクエスト時刻をとりだし、その時刻をキーにしたバッファを使いまわしてましたが、こっちの方がスマートですね。

カテゴリ
python python
トラックバック用URL:
http://takanory.net/takalog/1111/tbping

Powered by vine linux, python, zope, plone, coreblog