如果客户端

时间:2017-06-29 21:14:26

标签: python python-2.7 twisted twisted.web

documentation表示如果连接因任何原因而丢失,则应通知Deferred request.notifyFinish()。我在下面加载了类似的代码:

from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor
from twisted.logger import Logger

log = Logger()

class DelayedResource(Resource):
    isLeaf = 1

    def _delayedRender(self, request):
        log.info("Rendered!")
        request.write("<html><body>Sorry to keep you waiting.</body></html>")
        request.finish()

    def _responseFailed(self, err, call):
        call.cancel()
        log.info("No. Wait. Stop")

    def render_GET(self, request):
        log.info("Lets try this!")
        call = reactor.callLater(5, self._delayedRender, request)
        request.notifyFinish().addErrback(self._responseFailed, call)
        return NOT_DONE_YET

如果我从客户端取消连接,则不会调用_responseFailed。日志声明&#34;没有。等待。停止&#34;永远不会打印出来&#34;呈现!&#34;声明 打印。

这很重要,因为在我的实际用例中,如果连接断开,我正在分配需要释放的资源。升级到扭曲的17.1.0后,这些停止了清理。

我这样做错了吗?或者这是一个扭曲的错误?

1 个答案:

答案 0 :(得分:1)

这是由于http://tm.tl/8320引入但最近由http://tm.tl/8692修复的错误(或意外引入的功能 - 您是法官!)。因此,Twisted 16.3到Twisted 17.5不会使用 notifyFinish() 触发Failure(尽管它似乎仍会在成功情况下触发)。由于HTTP实现的复杂性和TCP的基本功能,即使HTTP范围外的Twisted版本也可能并不总是使用notifyFinish()激活Failure,以防HTTP客户端观察到某种错误。牢记这一点,并确保在请求结束时必须进行的任何处理都不依赖于此Deferred上的 errback (即附加回调以及确保处理作为响应生成代码的一部分运行。)