2015-04-04 82 views
0

我遇到了Tornado中的刪除請求問題。請求到達服務器並且處理程序中的所有內容都很好,但它永遠不會將響應返回給客戶端。Python龍捲風:刪除請求永遠不會結束

我已經試過返回一些東西,只有「返回」,甚至沒有「返回」,結果總是相同的。

我使用Python 3.4,Tornado 4.1和Firefox的RestClient。

@web.asynchronous 
@gen.coroutine 
def delete(self, _id): 
    try: 
     model = Model() 
     model.delete(_id) 
     self.set_status(204) 
    except Exception as e: 
     logging.error(e) 
     self.set_status(500) 
    return 

回答

1

龍捲風文檔(tornado.web.asynchronous):

如果此裝飾給定,該反應不是當該方法>返回結束。這取決於請求處理程序調用self.finish()完成HTTP請求。

您需要調用tornado.web.RequestHandler.finish方法。這將工作:

@web.asynchronous 
@gen.coroutine 
def delete(self, _id): 
    try: 
     model = Model() 
     model.delete(_id) 
     self.set_status(204) 
    except Exception as e: 
     logging.error(e) 
     self.set_status(500) 
    self.finish() 
    return 

但是,在這個例子中你不需要異步方法。這也將工作以同樣的方式:

def delete(self, _id): 
    try: 
     model = Model() 
     model.delete(_id) 
     self.set_status(204) 
    except Exception as e: 
     logging.error(e) 
     self.set_status(500) 
    return 

此外,如果您使用的是@ gen.coroutine裝飾,你並不需要使用@ web.asynchronous裝飾。只需使用@ gen.coroutine,這是正確的方式,更加優雅。

最後,我認爲您應該閱讀this article以瞭解Tornado中的異步編程。

+0

感謝您的回答。我試過了你不同的方法,但是沒有一個能夠工作。即使我已經開始產生刪除的結果(我不需要的東西),以便等待該動作並且結果是相同的。也許這個問題與Firefox的restclient有關,因爲調試代碼似乎完成了,但沒有響應到達客戶端。 – mendrugory 2015-04-05 08:38:50

+0

如果delete方法未返回Future對象,則不必輸出結果。 – 2015-04-05 17:42:14

+0

嗨, 我已經嘗試了所有的可能性,並且最終的解決方案已經將狀態從204更改爲202(接受),假設該操作(刪除甚至放)將被異步執行並寫入和響應。你知道當我們放置狀態204或206時是否有任何問題? 謝謝。 – mendrugory 2015-07-26 10:08:46