我有一个带有RequestHandler
装饰器的龙卷风@tornado.web.stream_request_body
,以允许分块流式传输到处理程序。
我需要在允许流式传输之前执行身份验证和其他一些检查。我尝试在RequestHandler.prepare()
方法中实现这些,但是当我使用requests
将数据流式传输到处理程序,并且检查失败时,连接突然关闭,我看到一个异常:
requests.exceptions.ConnectionError: [Errno 32] Broken pipe
我的prepare()
方法如下:
def prepare(self):
check = some_function()
if not check:
self.set_status(400)
self.write('some error message')
self.finish()
return
如何确保请求正常关闭,以便在检查失败时向客户端返回错误消息?
答案 0 :(得分:1)
在HTTP / 1中很难处理这个问题。大多数客户只是盲目地写请求,并且在他们写完整个请求之前不会从服务器查找响应,因此阻止他们发送整个请求的唯一方法是突然关闭连接。
您想要的行为位于名为100-continue
的模糊HTTP功能中。如果客户端支持此功能,那么在上传请求之前,它将等待prepare()
完成以查看是否存在错误。 requests
不支持此功能。如果你在fetch上传递expect_100_continue=True
,Tornado的默认HTTP客户端会这样做。