Tornado Web自定义404,其中路径不存在

时间:2017-05-04 22:43:54

标签: python tornado

我正在尝试更改Tornado Web应用程序实例在无法路由(或确认Content-Type json)时提供的本机404响应。

我找不到文档来执行此操作,所以我现在只是添加一个匹配所有内容的最终正则表达式:

import tornado.web

class BaseHandler(tornado.web.RequestHandler):
    def write_error(self, status_code, **kwargs):
        self.finish({
            'error': {
                'code': status_code,
                'message': self._reason,
            }
        })


class NotFoundHandler(BaseHandler):
    def get(self, *args, **kwargs):
        raise tornado.web.HTTPError(
            status_code=404,
            reason="Invalid resource path."
        )


app = tornado.web.Application([
    (r"/ping", PingHandler),
    # ...
    (r"(.*)", NotFoundHandler),
])

这感觉有点像黑客。有没有办法更全面地设置这个?

2 个答案:

答案 0 :(得分:0)

根据documentation,您可以使用default_handler_class来执行此操作。

  

对于404错误,请使用default_handler_class应用程序设置。   此处理程序应覆盖prepare而不是更具体   像get()这样的方法,所以它适用于任何HTTP方法。这应该   如上所述产生错误页面:通过提出一个   HTTPError(404)并覆盖write_error或致电   self.set_status(404)并直接在其中生成响应   prepare()

例如:

class NotFoundHandler(RequestHandler):
    def prepare(self):  # for all methods
        raise tornado.web.HTTPError(
            status_code=404,
            reason="Invalid resource path."
        )

app = Application(..., default_handler_class=NotFoundHandler)

答案 1 :(得分:0)

经过修改的代码对我有用:

...
class NotFoundHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("404.html")


app = tornado.web.Application([
    (r"/ping", PingHandler),
   # ...
  (r"/.*", NotFoundHandler),
])