Tornado:如果在StaticFileHandler中找不到,则如何发送默认文件

时间:2017-11-14 04:41:08

标签: tornado

当找不到请求的静态文件时,我想发回一个默认文件。例如。 /images/dog.png - > /images/default.png

深入挖掘源代码here

if (os.path.isdir(absolute_path) and
    self.default_filename is not None):

设置default_filename用于请求/images/ - > /images/default.png

1 个答案:

答案 0 :(得分:1)

有趣的validate_absolute_path函数,为什么不覆盖它以提供默认文件(如果不存在?)

import tornado 
import tornado.web
import tornado.ioloop

import os

DEFAULT_ABSPATH = os.path.dirname(os.path.abspath(__file__))

class StaticFileOrDefaultHandler(tornado.web.StaticFileHandler):

    def validate_absolute_path(self, root, absolute_path):
        try:
            return super(StaticFileOrDefaultHandler, self).validate_absolute_path(root, absolute_path)
        except tornado.web.HTTPError as e:
            if e.status_code == 404:
                return os.path.join(DEFAULT_ABSPATH, 'default.png')
            raise e


app = tornado.web.Application([
    (r'/(.*)', StaticFileOrDefaultHandler, { 'path': DEFAULT_ABSPATH }),
])

if __name__ == '__main__':
    app.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

修改

为避免覆盖HTTPError(403),如果引发的错误为status_code,请与404核对。