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
。