2012-08-14 3 views
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() 

第2ビットが私のコードからの初期化部分であるコードの最初のビットは、(非常に簡単)サブクラス定義自体である(これは私のコードの全てではありません)。私はまた、リソースをサブクラス化しました。TestHandlerというリソースオブジェクト。 WebFolderは、多くの静的ファイルを含む別のフォルダです。

ただし、サーバーへの呼び出し時にこれらの種類の例外がほとんど発生しています。

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

ルート以外のさまざまなパスがあります。

答えて

4

コード内の問題はrender_GETメソッドにあります。それは何も返さない。基本的には、同期応答の場合は文字列を返し、非同期応答の場合はNOT_DONE_YETの値を返す必要があります。あなたの場合、render_GETNoneを返します(そしてあなたの接続は直ちに閉鎖されます)。

はつまり、あなたの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を返します。これにより、明示的に閉じられない限り(この場合、ファイルがダウンロードされた後)、接続が保留になります。