web.pyで画像掲示板

ちょっと実験に必要だったので「画像をPOSTできて、それの一覧が表示されるサーバ」を作ってみました。これからもうちょっと新しい機能を入れるんだけども、今のシンプルな状態を公開しておく方が読みやすくていいのかなと思って貼ってみます。ちなみにもう少し規模が大きければIndex#GETはテンプレートを使うように変えるたほうがよさそう。

import web

urls = [
    "/", "Index",
    "/img/(.+)", "GetImage",
]

def id2path(ID):
    import os, re
    if not re.match("\d{8}_\d{6}_\d+", ID):
        raise RuntimeError("invalid format")
    return os.path.join("img", ID + ".png")
    
class Index(object):
    def GET(self):
        import os
        print INDEX_GET
        for f in os.listdir("img"):
            print "<img src='img/%s'><br>" % f[:-4] 
    def POST(self):
        from time import strftime, clock
        id = strftime("%Y%m%d_%H%M%S_%%d") % (clock() * 1000000) 
        print id
        data = web.input().Image
        file(id2path(id), "wb").write(data)
        print "ok"

INDEX_GET = """
<html>
<form enctype="multipart/form-data" action="." method="post">
<input type="file" name="Image"/>
<input type="submit">
</form>
<hr>
"""

class GetImage(object):
    def GET(self, ID):
        web.header("Cotent-type", "image/png")
        print open(id2path(ID), "rb").read()
 
if __name__ == '__main__':
    web.webapi.internalerror = web.debugerror
    web.run(urls, globals(), web.reloader)

追記。
printで出力したらいくつかのバイナリファイルは壊れて読めなくなった。sys.stdout.writeを使う。