次のコードがあります。
def application(env, start_response):
path = process(env)
fh = open(path,'r')
start_response('200 OK', [('Content-Type','application/octet-stream')])
return fbuffer(fh,10000)
def fbuffer(f, chunk_size):
'''Generator to buffer file chunks'''
while True:
chunk = f.read(chunk_size)
if not chunk: break
yield chunk
それが正しいかどうかはわかりませんが、インターネットで見つけた断片的な情報から、うまくいくはずだと思いました. 基本的に、ファイルをチャンクでストリーミングしたいので、アプリケーション関数からジェネレーターを返します。ただし、これはヘッダーを出力するだけで、実際にデータを送り返すことはありません。誰でも理由を教えてもらえますか?
または、これが完全に間違っている場合、これを行う最善の方法は何ですか? 作業するファイルは数ギガバイトになる可能性があるため、ファイル全体をメモリにバッファリングすることはできません。
第 3 の質問: 出力が完了したら、ファイルを閉じる最善の方法は何ですか? 私が投稿したコードでは、実際にファイルを閉じる方法がわかりません。
(uWSGI 1.2.4でpython 3.2.3を実行しています)