找了好久Tornado自定义页面的放发 有人这么写的
class ErrorHandler(RequestHandler): #大约1413行 这里主要是‘文件url的404’
"""Generates an error response with status_code for all requests."""
def initialize(self, status_code):
self.set_status(status_code)
def prepare(self):
# raise HTTPError(self._status_code) 注释掉了这句
self.render("error.html") #改成重定向到一个页面
if not os.path.exists(abspath): #大约1490行 这里主要是‘文件的404’
#raise HTTPError(404)
self.render("error.html")
return -1
但是这样如果我想自定义多个错误 那就的找到每一个错误是在哪里提出来的太麻烦了
于是有在github qq群里问大神 有人要我重写RequestHandler write_error() 函数
def write_error(self, status_code, **kwargs):
if self.settings.get("serve_traceback") and "exc_info" in kwargs:
# in debug mode, try to send a traceback
self.set_header('Content-Type', 'text/plain')
for line in traceback.format_exception(*kwargs["exc_info"]):
self.write(line)
self.finish()
else:
self.finish("<html><title>%(code)d: %(message)s</title>"
"<body>%(code)d: %(message)s</body></html>" % {
"code": status_code,
"message": self._reason,
})
每一个错误请求都是最终都是在这里格式化后返回的所以的修改了源码在else加了这么一句话 修改后的else部分是这样的
else:
try:
self.render(str(status_code) + '.html')
except IOError:
self.finish("<html><title>%(code)d: %(message)s</title>"
"<body>%(code)d: %(message)s</body></html>" % {
"code": status_code,
"message": self._reason,
})
当server_traceback 为False 时会首先在template中寻找对应错误编码的html文件如果没有找到会使用默认的错误页面
这里也可以不修改源码 直接写一个新类继承 RequestHandler 重写write_error 方法就可以了