Tornado&#39的StaticFileHandler

时间:2016-03-21 00:25:53

标签: python routing tornado staticfilehandler

我有以下应用程序配置:

settings = {
    'default_handler_class': BaseHandler
}

app = web.Application([
        (r'/', IndexHandler),
        (r'/ws', SocketHandler),
        (r'/js/(.*)', web.StaticFileHandler, {'path': 'assets/js', 'default_filename': 'templates/error.html'}),
        (r'/css/(.*)', web.StaticFileHandler, {'path': 'assets/css'}),
        (r'/images/(.*)', web.StaticFileHandler, {'path': 'assets/images'})
    ], **settings)

当我输入http://localhost:8888/js/d3.min.js时,文件已送达​​,但当我错误填写文件名并提供http://localhost:8888/js/d3.mi.js时,我想获取位于templates/error.html的默认错误页面。对于像http://localhost:8888/not/existing这样的网址,它可以正常工作,但http://localhost:8888/js/d3.mi.js只能让我看到404: Not Found

我在文档中找到了以下部分:

  

在目录中自动提供index.html等文件   请求,设置static_handler_args = dict(default_filename =" index.html")   在您的应用程序设置中,或添加default_filename作为   您的StaticFileHandler的初始化参数。

但是我无法理解我应该在哪里指定提到的代码。我代码中的'default_filename': 'templates/error.html'无效。

2 个答案:

答案 0 :(得分:1)

实际上' default_filename'在你的代码中运作良好。

  

default_filename是什么意思?

" default_filename"意味着如果您请求诸如" http://localhost:1234/js/"之类的目录,服务器将返回一个默认文件给你。 所以,你必须知道"默认文件"不是错误文件," default_filename"不是你需要的。

  

你需要什么?

编写" StaticFileHandler"的子类。会解决。在方法" validate_absolute_path" " StaticFileHandler"

   if not os.path.exists(absolute_path):
        raise HTTPError(404)

不要提高404,只需返回错误文件路径(例如js / error.js)。 祝你好运!

我的英语很差,我不知道你是否能得到它^ _ ^。 我很高兴与您交流经验。

答案 1 :(得分:0)

default_filename

default_filename中指定的文件应位于给定的静态路径中。因此,如果您将error.html移至assets/js目录,则导航至/js/您将看到error.html的内容。

基本上这个功能是一个有限用例(imho)的助手。更多信息https://stackoverflow.com/a/27891339/681044

自定义错误页面

每个请求处理程序处理/呈现write_error函数中的错误。这是创建自定义错误页面的推荐方法:

class MyStaticFileHandler(tornado.web.StaticFileHandler):

    def write_error(self, status_code, *args, **kwargs):
        # custom 404 page
        if status_code in [404]:
            self.render('templates/error.html')
        else:
            super().write_error(status_code, *args, **kwargs)