优雅地关闭Tornado流媒体请求

时间:2017-05-17 11:55:41

标签: python tornado

我有一个带有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

如何确保请求正常关闭,以便在检查失败时向客户端返回错误消息?

1 个答案:

答案 0 :(得分:1)

在HTTP / 1中很难处理这个问题。大多数客户只是盲目地写请求,并且在他们写完整个请求之前不会从服务器查找响应,因此阻止他们发送整个请求的唯一方法是突然关闭连接。

您想要的行为位于名为100-continue的模糊HTTP功能中。如果客户端支持此功能,那么在上传请求之前,它将等待prepare()完成以查看是否存在错误。 requests不支持此功能。如果你在fetch上传递expect_100_continue=True,Tornado的默认HTTP客户端会这样做。