Tornado Web自定义404路径不存在

2024-10-02 12:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图更改Tornado web应用程序实例在路由失败(或确认内容类型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),
])

这感觉有点像黑客。有没有一种方法可以在全球范围内进行设置?在


Tags: selfweb应用程序内容defstatuscodeerror
2条回答

根据documentation可以使用default_handler_class来完成此操作。在

For 404 errors, use the default_handler_class Application setting. This handler should override prepare instead of a more specific method like get() so it works with any HTTP method. It should produce its error page as described above: either by raising a HTTPError(404) and overriding write_error, or calling self.set_status(404) and producing the response directly in 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)

你的代码改编版对我很有用:

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


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

相关问题 更多 >

    热门问题