我怎么没有默认模板在龙卷风返回HTTP错误代码?(How do I return HTTP erro

2019-08-03 14:33发布

我目前使用以下提出一个HTTP错误的请求:

raise tornado.web.HTTPError(400)

它返回一个HTML输出:

<html><title>400: Bad Request</title><body>400: Bad Request</body></html>

是否可以使用自定义的身体只返回HTTP响应代码?

Answer 1:

您可以模拟RequestHandler.send_error方法:

class MyHandler(tornado.web.RequestHandler):
    def get(self):
        self.clear()
        self.set_status(400)
        self.finish("<html><body>My custom body</body></html>")


Answer 2:

龙卷风呼吁RequestHandler.write_error输出误差,所以替代视觉的做法是将其覆盖在龙卷风所建议的文档 。 这种方法的好处是,它可以让你提高HTTPError如前。

对于源RequestHandler.write_error是在这里 。 下面你可以看到write_error的简单修改,将改变设定状态码和改变输出,如果你提供kwargs原因的例子。

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.set_status(status_code)
        if kwargs['reason']:
            self.finish(kwargs['reason'])
        else: 
            self.finish("<html><title>%(code)d: %(message)s</title>"
                "<body>%(code)d: %(message)s</body></html>" % {
                    "code": status_code,
                    "message": self._reason,
                })


Answer 3:

这是更好地使用标准的接口,然后在定义自定义消息HTTPError

raise tornado.web.HTTPError(status_code=code, log_message=custom_msg)

然后,您可以解析错误在你RequestHandler并检查消息:

class CustomHandler(tornado.web.RequestHandler):
    def write_error(self, status_code, **kwargs):
        err_cls, err, traceback = kwargs['exc_info']
        if err.log_message and err.log_message.startswith(custom_msg):
            self.write("<html><body><h1>Here be dragons</h1></body></html>")


Answer 4:

def write_error(self, status_code, **kwargs):
    #Function to display custom error page defined in the handler.
    #Over written from base handler.
    data = {}
    data['code'] = status_code
    data['message'] = httplib.responses[status_code]
    # your other conditions here to create data dict
    self.write(TEMPLATES.load('error.html').generate(data=data))

当过self.send_error()调用开始write_error()函数由请求处理程序调用。 所以,你可以在这里创建自定义错误的数据字典,它使您的自定义错误页。

http.responses [STATUS_CODE]返回错误代码文本就像基于身份码“找不到网页”。



Answer 5:

你也可以在你的处理器重写get_error_html方法。 例如:

import tornado.web
class CustomHandler(tornado.web.RequestHandler):
    def get_error_html(self, status_code, **kwargs);
        self.write("<html><body><h1>404!</h1></body></html>")
...
def get(self):
...


Answer 6:

这种交换澄清一些这里提出的方法的,和折扣的reason关键字(我在想尝试)。

Q:(由mrtn)

“我想用raise tornado.web.HTTPError(400, reason='invalid request')通过自定义的理由的错误响应,并希望通过重写做到这一点write_error (self, status_code, **kwargs)方法。

“但看来我只能访问self._reasonwrite_error ,这不是我想要的。我也试过kwargs['reason']但不存在。”

答:(由龙卷风主要开发人员@bendarnell)

“暴露错误的例外是提供给write_error作为exc_info在关键字参数三重你可以用这样的访问原因字段:

if "exc_info" in kwargs:
    e = kwargs["exc_info"][1]
    if isinstance(e, tornado.web.HTTPError):
        reason = e.reason

“但要注意的是, reason领域基本上弃用(它不存在于HTTP / 2),所以它可能不会做任何你想在这里做的最好办法( HTTPErrorlog_message场好一点,但。还是不理想)只要提高自己的异常,而不是使用HTTPError ;您write_error覆盖可以使用self.set_status(400)时,看到合适类型的异常“。



文章来源: How do I return HTTP error code without default template in Tornado?