我有以下应用程序配置:
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'
无效。
答案 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
中指定的文件应位于给定的静态路径中。因此,如果您将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)