2017-05-17 59 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