Tornado 的 StaticFileHandler 中的默认文件

Default file in Tornado's 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 例如,我想获得位于 [=13] 的默认错误页面=].对于像 http://localhost:8888/not/existing 这样的 URL 它工作正常但是 http://localhost:8888/js/d3.mi.js 给了我简单的 404: Not Found.

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

To serve a file like index.html automatically when a directory is requested, set static_handler_args=dict(default_filename="index.html") in your application settings, or add default_filename as an initializer argument for your StaticFileHandler.

但是我不明白我应该在哪里指定提到的代码。我的代码中的 'default_filename': 'templates/error.html' 不起作用。

事实上 'default_filename' 在您的代码中运行良好。

What does default_filename mean ?

"default_filename" 表示如果你请求一个目录如“http://localhost:1234/js/”,服务器将return一个默认文件给你。 所以,你必须知道 "default file" 不是错误文件,"default_filename" 不是你需要的。

What do you need?

写一个"StaticFileHandler"的子类会解决。在 "StaticFileHandler"

的方法 "validate_absolute_path" 中
   if not os.path.exists(absolute_path):
        raise HTTPError(404)

不要引发 404,只需 return 您的错误文件路径(例如 js/error.js)。 祝你好运!

我的英语很差,不知道你能不能懂^_^。 很高兴与大家交流经验

default_filename

default_filename 中指定的文件应该在给定的静态路径中。因此,如果您将 error.html 移动到 assets/js 目录,然后导航到 /js/,您将看到 error.html.

的内容

基本上这个功能是一个用例有限的助手(恕我直言)。更多信息请见 .

自定义错误页面

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

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)