1

Twisted Web で書かれたフロントエンド Web サーバーがあり、別の Web サーバーとインターフェイスします。クライアントはファイルをフロントエンド サーバーにアップロードし、フロントエンド サーバーはそのファイルをバックエンド サーバーに送信します。アップロードされたファイルを受信し、そのファイルをバックエンド サーバーに送信する前に、すぐに応答をクライアントに送信したいと考えています。そうすれば、クライアントは応答を得る前に両方のアップロードが行われるのを待つ必要がありません。

別のスレッドでバックエンド サーバーへのアップロードを開始することで、これを実行しようとしています。Request問題は、クライアントに応答を送信した後、オブジェクトからアップロードされたファイルにアクセスできなくなったことです。次に例を示します。

class PubDir(Resource):

    def render_POST(self, request):
        if request.args["t"][0] == 'upload':
            thread.start_new_thread(self.upload, (request,))

        ### Send response to client while the file gets uploaded to the back-end server:
        return redirectTo('http://example.com/uploadpage')

    def upload(self, request):
        postheaders = request.getAllHeaders()
        try:
            postfile = cgi.FieldStorage(
                fp = request.content,
                headers = postheaders,
                environ = {'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE': postheaders['content-type'],
                        }
                )
        except Exception as e:
            print 'something went wrong: ' + str(e)

        filename = postfile["file"].filename

        file = request.args["file"][0]

        #code to upload file to back-end server goes here...

これを試すと、次のエラーが表示されますI/O operation on closed file

4

1 に答える 1

1

要求オブジェクトを終了する前に、ファイルをメモリ内のバッファまたはディスク上の一時ファイルに実際にコピーする必要があります (これはリダイレクト時に発生します)。

したがって、スレッドを開始してリクエストオブジェクトを渡すと、おそらくバックエンドサーバーへの接続が開かれ、リダイレクト時にコピーが開始され、リクエストが終了して関連する一時ファイルが閉じられ、問題が発生します。

リクエスト全体をスレッドに渡す代わりに、リクエストのコンテンツをスレッドに渡すだけの簡単なテストを行います。

thread.start_new_thread(self.upload, (request.content.read(),))
于 2012-07-19T04:17:59.263 に答える