Python Tornado:删除请求永无止境
Python Tornado: Delete request never ends
我在 Tornado 中遇到删除请求问题。请求到达服务器,处理程序中的一切都很好,但它从来没有 returns 对客户端的响应。
我试过退货,只有 "return" 甚至没有 "return",结果总是一样。
我正在使用 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
龙卷风文档 (tornado.web.asynchronous):
If this decorator is given, the response is not finished when the method > returns. It is up to the request handler to call self.finish() to finish > the HTTP request.
您需要调用 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 中的异步编程。
我在 Tornado 中遇到删除请求问题。请求到达服务器,处理程序中的一切都很好,但它从来没有 returns 对客户端的响应。
我试过退货,只有 "return" 甚至没有 "return",结果总是一样。
我正在使用 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
龙卷风文档 (tornado.web.asynchronous):
If this decorator is given, the response is not finished when the method > returns. It is up to the request handler to call self.finish() to finish > the HTTP request.
您需要调用 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 中的异步编程。