2017-05-17 63 views
0

我有一个Tornado RequestHandler@tornado.web.stream_request_body装饰器允许分块流式传输给处理程序。完美关闭Tornado流媒体请求

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

你可以尝试用'@ coroutine'包装'prepare',这会让Tornado等你完成检查。因此,'some_function'也需要是一个协程。 – desertkun

回答

0

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

您需要的行为可在名为100-continue的不起眼的HTTP功能中找到。如果客户端支持这一点,那么它将等待prepare()完成以在上载请求之前查看是否有错误。 requests不支持此功能。 Tornado的默认HTTP客户端会这样做,如果您在提取时通过expect_100_continue=True