5

我是 Twisted 的新手,我在为扭曲的 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 /

除了根目录之外,还有许多不同的路径。

4

1 回答 1

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使连接保持直到它没有显式关闭(在我们的例子中,在下载文件之后)。

于 2012-08-14T18:38:37.317 回答