2012-08-14 36 views
5

我是Twisted的新手,并且遇到了一些必要的子类化问题,因为static.File是扭曲的。我试图在子类中设置请求标头。Subclassing static.File

class ResponseFile(static.File): 

    def render_GET(self, request): 
     request.setHeader('Content-Disposition', ['attachment ; filename="tick_db_export.csv"']) 
     static.File.render_GET(self, request) 

if __name__ == "__main__": 
    from twisted.internet import reactor 
    root = ResponseFile('WebFolder') 
    testHandler = TestHandler() 
    root.putChild('main', testHandler) 
    reactor.listenTCP(3650, server.Site(root)) 
    reactor.run() 

的代码的第一位是子类定义本身(非常简单),而第二个比特为从我的代码的初始化部分(这不是所有的我的代码)。我也有一个名为TestHandler的resource.Resource对象。 WebFolder是另一个包含许多静态文件的文件夹。

但是,我在调用服务器时遇到了大多数这些类型的异常。

Unhandled Error 
Traceback (most recent call last): 
Failure: exceptions.RuntimeError: Producer was not unregistered for/

使用许多不同于root的路径。

回答

4

代码中的问题在render_GET方法中。它什么都不返回。基本上它必须为同步响应返回字符串,并且异步响应的值应为NOT_DONE_YET。在你的情况下,render_GET返回None(并且你的连接立即关闭)。

所以,你必须使你的render_GET(加适量return)更小的变化:

def render_GET(self, request): 
    request.setHeader('Content-Disposition', ['attachment ; filename="tick_db_export.csv"']) 
    return static.File.render_GET(self, request) 

如果检查twisted.web.static.py模块,你会发现File.render_GET使得生产者和返回NOT_DONE_YET,它使连接保持,直到它没有明确关闭(在我们的情况下,文件下载后)。

相关问题