【问题标题】:Gracefully close Tornado streaming request优雅地关闭 Tornado 流请求
【发布时间】:2017-05-17 11:55:41
【问题描述】:

我有一个带有 @tornado.web.stream_request_body 装饰器的 Tornado RequestHandler,以允许分块流式传输到处理程序。

在允许流式传输之前,我需要执行身份验证和一些其他检查。我尝试在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

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

【问题讨论】:

  • 你可以尝试用@coroutine包裹prepare,这样会让Tornado等待你完成检查。因此,some_function 也需要是协程。

标签: python tornado


【解决方案1】:

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

您想要的行为可以在名为100-continue 的不起眼的 HTTP 功能中找到。如果客户端支持这一点,那么它会等待prepare()完成,看看是否有错误,然后再上传请求。 requests 不支持此功能。 Tornado 的默认 HTTP 客户端会执行此操作,如果您在 fetch 上传递 expect_100_continue=True。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-07-12
    • 2013-06-27
    • 2017-12-31
    • 2014-12-01
    • 2020-06-29
    • 2021-06-03
    相关资源
    最近更新 更多