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 中的异步编程。