Erro de memória do Django Filewrapper que serve arquivos grandes, como transmitir
Eu tenho um código como este:
@login_required
def download_file(request):
content_type = "application/octet-stream"
download_name = os.path.join(DATA_ROOT, "video.avi")
with open(download_name, "rb") as f:
wrapper = FileWrapper(f, 8192)
response = HttpResponse(wrapper, content_type=content_type)
response['Content-Disposition'] = 'attachment; filename=blabla.avi'
response['Content-Length'] = os.path.getsize(download_name)
# response['Content-Length'] = _file.size
return response
Parece que funciona. No entanto, se eu baixar arquivos maiores (~ 600 MB por exemplo), meu consumo de memória aumentará em 600 MB. Depois de alguns desses downloads, meu servidor lança:
Erro interno do servidor: / download / Traceback (última chamada mais recente):
O arquivo "/home/matous/.local/lib/python3.5/site-packages/django/core/handlers/exception.py", linha 35, em resposta interna = get_response (request) File "/ home / matous /. local / lib / python3.5 / site-packages / django / core / handlers / base.py ", linha 128, em _get_response response = self.process_exception_by_middleware (e, request) Arquivo" /home/matous/.local/lib/ python3.5 / pacotes do site / django / core / handlers / base.py ", linha 126, em _get_response response = wrap_callback (request, * callback_args, ** callback_kwargs) Arquivo" /home/matous/.local/lib/python3 .5 / site-packages / django / contrib / auth / decorators.py ", linha 21, em _wrapped_view retorna view_func (request, * args, ** kwargs) Arquivo" / media / matous / 89104d3d-fa52-4b14-9c5d- 9ec54ceebebb / home / matous / phd / emoapp / emoapp / mainapp / views.py ", linha 118, em download_file response = HttpResponse (wrapper, content_type = content_type) Arquivo" /home/matous/.local/lib/python3.5/ site-packages / django / http / response.py ", linha 285, eminiciar self.content = content Arquivo "/home/matous/.local/lib/python3.5/site-packages/django/http/response.py", linha 308, no conteúdo content = b ''. join (self.make_bytes (chunk) para chunk em valor) MemoryError
O que estou fazendo errado? É possível configurá-lo de alguma forma para transmiti-lo peça por peça do disco rígido sem esse armazenamento de memória insano?
Nota: Eu sei que arquivos grandes não devem ser servidos pelo Django, mas estou procurando uma abordagem simples que permita verificar os direitos de acesso do usuário para qualquer arquivo servido.