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)
我有以下应用程序配置:
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)