2015-04-04 113 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