Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Tornado中,如果没有默认模板,如何返回HTTP错误代码?_Python_Tornado - Fatal编程技术网

Python 在Tornado中,如果没有默认模板,如何返回HTTP错误代码?

Python 在Tornado中,如果没有默认模板,如何返回HTTP错误代码?,python,tornado,Python,Tornado,我当前正在使用以下命令来引发HTTP错误请求: raise tornado.web.HTTPError(400) 返回一个html输出: <html><title>400: Bad Request</title><body>400: Bad Request</body></html> 400:错误请求400:错误请求 是否可以仅返回带有自定义正文的HTTP响应代码?您可以模拟以下方法: 类MyHandler(torna

我当前正在使用以下命令来引发HTTP错误请求:

raise tornado.web.HTTPError(400)
返回一个html输出:

<html><title>400: Bad Request</title><body>400: Bad Request</body></html>
400:错误请求400:错误请求
是否可以仅返回带有自定义正文的HTTP响应代码?

您可以模拟以下方法:

类MyHandler(tornado.web.RequestHandler):
def get(自我):
self.clear()
自我设置_状态(400)
self.finish(“我的定制身体”)
Tornado调用输出错误,因此替代方法是按照Tornado的建议覆盖它。这种方法的优点是,它允许您像以前一样引发
HTTPError

RequestHandler.write\u 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,
                })
def写入错误(自身、状态代码、**kwargs):
如果在kwargs中有self.settings.get(“服务跟踪”)和“exc\U信息”:
#在调试模式下,尝试发送回溯
self.set_标题('Content-Type','text/plain')
对于traceback.format_exception(*kwargs[“exc_info”])中的行:
self.write(行)
self.finish()
其他:
自我设置状态(状态代码)
如果kwargs[“原因”]:
自我完成(kwargs['reason'])
其他:
self.finish(“%(代码)d:%(消息)s”
“%(代码)d:%(消息)s”%{
“代码”:状态代码,
“信息”:自我理性,
})
当self.send\u error()调用启动时,请求处理程序将调用write\u error()。因此,您可以在此处创建自定义错误数据dict,并将其呈现到自定义错误页面


http.responses[status\u code]根据状态代码返回错误代码文本,如“page not found”。

您还可以覆盖处理程序中的get\u error\u 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):
...
导入tornado.web
类CustomHandler(tornado.web.RequestHandler):
def get_error_html(自我、状态代码,**kwargs);
self.write(“404!”)
...
def get(自我):
...

最好使用标准界面并在
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>")
类CustomHandler(tornado.web.RequestHandler):
def写入错误(自身、状态代码,**kwargs):
err_cls,err,traceback=kwargs['exc_info']
如果err.log\u消息和err.log\u消息.startswith(自定义消息):
写下(“这里是龙”)
阐明了此处建议的一些方法,并对
原因
关键字(我正在考虑尝试)进行了折扣

Q:(由mrtn提供)

“我想使用
raise tornado.web.HTTPError(400,reason='invalid request')
将自定义原因传递给错误响应,我希望通过重写
write\u error(self,status\u code,**kwargs)
方法来实现这一点

“但我似乎只能访问
self.\u reason
内部
write\u error
,这不是我想要的。我还尝试了
kwargs['reason']
,但这并不存在。”

A:(由Tornado首席开发商@bendarnell提供)

“暴露错误的异常可作为关键字参数中的
exc\u info
三元组提供给
write\u error
。您可以通过以下方式访问原因字段:

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

“但请注意,
reason
字段基本上已被弃用(它在HTTP/2中不存在),因此它可能不是您在这里尝试执行任何操作的最佳方式(
HTTPError
log\u message
字段稍好一些,但仍然不理想)。只需引发您自己的异常,而不是使用
HTTPError
;您的
write\u error
覆盖可以使用
self。当它看到正确类型的异常时,设置状态(400)

对于json错误响应,我使用以下模板:

请求处理程序:

导入json
从tornado.web导入RequestHandler
从src.lib.errors导入HTTPBadRequest
类JsonHandler(RequestHandler):
def准备(自我):
内容类型=“”
如果self.request.headers中的“内容类型”:
content\u type=self.request.headers['content-type']
如果内容类型==“应用程序/json”:
尝试:
self.request.body=json.loads(self.request.body.decode('utf-8'))
除值错误外:
提出HTTPBadRequest
def写入错误(self、*args、**kwargs):
err_cls,err,traceback=kwargs['exc_info']
自我设置状态(错误状态代码)
如果出现错误,请说明:
self.write_json(错误描述)
self.finish()
def set_default_标头(自身):
self.set_头('Content-Type','application/json')
def write_json(自我,响应):
self.write(json.dumps(响应))
错误处理程序:

从键入import Any
从tornado导入httputil
类BaseHTTPError(异常):
定义初始化__(
self,状态代码:int=500,description=None,*args:Any,**kwargs:Any
)->无:
如果描述为“无”:
description={}
self.status\u code=状态\u code
self.description=描述
self.args=args
self.kwargs=kwargs
定义(自我)->str:
message=“HTTP%d:%s”%(
self.status\u代码,
httputil.responses.get(self.status_代码,“未知”),
)
回信
类HTTPBadRequest(BaseHTTPError):
定义初始化(self,*args,**kwargs):
super()

+1表示进近,但错误消息主体将显示不同的er
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>")
if "exc_info" in kwargs:
    e = kwargs["exc_info"][1]
    if isinstance(e, tornado.web.HTTPError):
        reason = e.reason