5

私はTwistedを初めて使用し、static.Fileのtwistedに必要なサブクラス化に問題があります。サブクラス内にリクエストヘッダーを設定しようとしています。

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という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)

twint.web.static.pyモジュールを調べると、File.render_GETがプロデューサーを作成して戻り、NOT_DONE_YET明示的に閉じられないまで(この場合、ファイルがダウンロードされた後)接続を保持します。

于 2012-08-14T18:38:37.317 に答える