Для будущих ссылок: у меня только что был случай, когда я не мог использовать временные файлы для загрузки.Но я все еще должен был удалить их после этого;вот как я это сделал (я действительно не хотел полагаться на работу cron, сельдерея или wossnames, это очень маленькая система, и я хотел, чтобы она оставалась такой).
def plug_cleaning_into_stream(stream, filename):
try:
closer = getattr(stream, 'close')
#define a new function that still uses the old one
def new_closer():
closer()
os.remove(filename)
#any cleaning you need added as well
#substitute it to the old close() function
setattr(stream, 'close', new_closer)
except:
raise
, а затемЯ просто взял поток, использованный для ответа, и подключился к нему.
def send_file(request, filename):
with io.open(filename, 'rb') as ready_file:
plug_cleaning_into_stream(ready_file, filename)
response = HttpResponse(ready_file.read(), content_type='application/force-download')
# here all the rest of the heards settings
# ...
return response
Я знаю, что это быстро и грязно, но это работает.Я сомневаюсь, что это будет продуктивно для сервера с тысячами запросов в секунду, но это не мой случай здесь (максимум несколько десятков в минуту).
РЕДАКТИРОВАТЬ: забыл уточнить, что я имел дело с очень очень большойфайлы, которые не могли поместиться в памяти во время загрузки.Вот почему я использую BufferedReader
(что под io.open()
)