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后,这些停止了清理。
我这样做错了吗?或者这是一个扭曲的错误?
答案 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 (即附加回调以及确保处理作为响应生成代码的一部分运行。)