Python Twisted.web.server不会通知客户端是否取消了连接

Python Twisted.web.server不会通知客户端是否取消了连接,python,python-2.7,twisted,twisted.web,Python,Python 2.7,Twisted,Twisted.web,这意味着如果连接因任何原因中断,则应通知位于请求处的延迟的。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 DelayedReso

这意味着如果连接因任何原因中断,则应通知位于
请求处的
延迟的
。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
从twisted.web.resource导入资源
从twisted.web.server导入尚未完成
从twisted.internet导入
从twisted.logger导入记录器
log=Logger()
类DelayedResource(资源):
isLeaf=1
def_delayedRender(自我,请求):
log.info(“呈现!”)
请求。写下(“抱歉让您久等了。”)
request.finish()
def_响应(自我、错误、呼叫):
call.cancel()
log.info(“No.Wait.Stop”)
def render_GET(自我,请求):
log.info(“让我们试试这个!”)
call=reactor.callLater(5,self.\u delayedRender,request)
request.notifyFinish().adderBack(self.\u responseFailed,call)
返回尚未完成
如果我从客户端取消连接,
\u responseFailed
不会被调用。永远不会打印日志语句“No.Wait.Stop”,也不会打印“Rendered!”语句

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


我做错了吗?或者这是twisted中的一个bug

这是由于引入了一个bug(或意外引入的功能,由您来判断!),但最近被修复了。因此,Twisted 16.3到Twisted 17.5不会在出现故障时触发
notifyFinish()
(尽管在成功的情况下似乎仍会触发)。由于HTTP实现的复杂性和TCP的底层功能,即使是超出该范围的Twisted版本,在HTTP客户端发现某种错误的情况下,也不一定会触发
notifyFinish()
,并出现
故障。请记住这一点,并确保必须在请求结束时进行的任何处理都不依赖于此
延迟的错误回复(即,也要附加回调或确保处理作为响应生成代码的一部分运行)。

如果您完成了代码段,这将是一个自包含的可运行示例,那将非常好。而且,是的,这个功能在我看来是坏的。@Jean-PaulCalderone你是说这是Twisted中的坏功能还是OP的代码?我在过去也注意到类似的情况,并认为浏览器或操作系统正在做一些事情,而没有切断连接。大部分证据都指向twisted中的一个bug,它被令人恼火地标记为“不会修复”@su名昭著。twisted中没有损坏的功能。我不知道有一个封闭的wontfix问题(由@matthew scouten发现)。这个问题已经解决了,wontfix确实让我很难过。看起来这个扭曲的问题已经被扭转了。后扭曲版本17.5应该被修复了吗?好的不过看起来17.5是目前的最高版本。我猜答案是“等到下一个扭曲的版本”。确实如此。不过,为了安全起见,也可以进行测试master@HEAD并验证所实现的修复程序是否确实提供了所需的行为(如果没有,则在下一个版本之前进行投诉:)。我们最终着手更新到更新版本,问题似乎得到了解决。