0

我有以下应用程序配置:

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. 对于像它这样的 URLhttp://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'我的代码中不起作用。

4

2 回答 2

1

默认文件名

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

基本上这个功能是一个有限用例的助手(恕我直言)。更多信息请访问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)
于 2016-03-21T09:50:14.547 回答
1

事实上,“default_filename”在您的代码中运行良好。

default_filename 是什么意思?

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

你需要什么?

写一个“StaticFileHandler”的子类就解决了。在“StaticFileHandler”的方法“validate_absolute_path”中

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

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

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

于 2016-03-21T01:56:46.523 回答