mod_python + mod_proxy でフィルタ用バッファ
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
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/1111/tbping
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。
zope/plone関係の技術的な内容については