web.py で favicon を出す

web.pyを使ってテストをしていると、ログに

"GET /favicon.ico HTTP/1.1" 404 -

と表示されてうざい。
最近のブラウザは無条件にトップディレクトリ下に favicon を探しに来るけど、そんなコンテンツは知らない web.py は「知らんよ」と返すしかない。
web.py では、デフォルトで ./static に静的コンテンツを置いて参照できるようになっているが、こんどはブラウザ側はそんなことは知らない。
他の人の書いたサンプルなどを見ると、webサーバーの rewrite roule で見えるようにしているようだ。favicon の送り出しが web.py を経由しない分、処理は軽くなるので、この方法はかしこい。
でも、単体サーバーで起動してテストしている時には、この方法は使えない。あとは、コンテンツ側で ico ファイルを javascript 指定してやる手があるけど、これも1つづつ指定するのはめんどくさい。
というわけで、直接見えるようにする方法を考えてみた。

import web

urls = (
    '/favicon.ico', 'favicon'
)

class favicon:
   def GET(self):
       import os, stat
       if os.path.isfile('./static/favicon.ico'):
           st = os.stat('./static/favicon.ico')
           web.header('Content-Length', str(st.st_size))
           web.header('Content-Type', 'image/x-icon')
           web.ctx.output = open('./static/favicon.ico', 'rb')
       else:
           return web.notfound()

if __name__ == "__main__": web.run(urls)

最初は、そのままバイナリを返してもブラウザ側でよろしくやってくれるだろうと思ったが、ヘッダをちゃんと返さないと、FireFox はキャッシュしてくれず、毎回取りに来るようだ。それもウザイのでマジメに返答してみる。
たぶんこんなんでいいと思うのだけど、間違いorもっといい方法があるのだった教えてね。>all
# 脳が膿んでいるので、今日できるのはこのくらいが限界なのさ... まぁ、膿んでなくても似たりよったりだけどね...