Streaming de arquivo WSGI com um gerador
Eu tenho o seguinte código:
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
Não tenho certeza se está certo, mas os fragmentos de informação que encontrei na internet me levaram a pensar que deveria funcionar. Basicamente eu quero transmitir um arquivo em pedaços, e para fazer isso eu estou passando um gerador de volta da minha função de aplicativo. No entanto isso só imprime os cabeçalhos e não envia de volta nenhum dado, alguém pode me dizer por que isso é?
Alternativamente, se isso é completamente errado, qual é a melhor maneira de fazer isso? Eu não posso armazenar todo o arquivo na memória como os arquivos que eu vou trabalhar são potencialmente gigabytes grandes.
Pergunta terciária: Qual é a melhor maneira de fechar o arquivo depois que eu terminar a produção? No código que eu postei eu não posso ver de qualquer maneira para realmente fechar o arquivo.
(Estou executando o python 3.2.3 com o uWSGI 1.2.4)