У меня есть следующий код:
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
Я не уверен, что это правильно, но обрывки информации, которые я нашел в Интернете, привели меня к мысли, что это должно работать. По сути, я хочу передать файл фрагментами, и для этого я передаю генератор обратно из моей прикладной функции. Однако это только распечатывает заголовки и фактически не отправляет никаких данных, может ли кто-нибудь сказать мне, почему это так?
В качестве альтернативы, если это совершенно неправильно, как лучше всего это сделать? Я не могу буферизовать весь файл в памяти, так как файлы, с которыми я буду работать, потенциально имеют размер в гигабайтах.
Третий вопрос: как лучше всего закрыть файл после его вывода? В коде, который я разместил, я все равно не вижу, чтобы на самом деле закрыть файл.
(Я использую Python 3.2.3 с uWSGI 1.2.4)