tornado 自定义错误页面

找了好久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 方法就可以了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值