2012-08-14 46 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,它使連接保持,直到它沒有明確關閉(在我們的情況下,文件下載後)。

相關問題