Error de memoria de Django Filewrapper que sirve archivos grandes, cómo transmitir
Tengo un 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. Sin embargo, si descargo un archivo más grande (~ 600 MB, por ejemplo), mi consumo de memoria aumentará en 600 MB. Después de algunas descargas de este tipo, mi servidor lanza:
Error interno del servidor: / download / Traceback (última llamada más reciente):
Archivo "/home/matous/.local/lib/python3.5/site-packages/django/core/handlers/exception.py", línea 35, en respuesta interna = get_response (solicitud) Archivo "/ home / matous /. local / lib / python3.5 / site-packages / django / core / handlers / base.py ", línea 128, en _get_response response = self.process_exception_by_middleware (e, request) File" /home/matous/.local/lib/ python3.5 / site-packages / django / core / handlers / base.py ", línea 126, en _get_response response = wrap_callback (request, * callback_args, ** callback_kwargs) Archivo" /home/matous/.local/lib/python3 .5 / site-packages / django / contrib / auth / decorators.py ", línea 21, en _wrapped_view return view_func (solicitud, * args, ** kwargs) Archivo" / media / matous / 89104d3d-fa52-4b14-9c5d- 9ec54ceebebb / home / matous / phd / emoapp / emoapp / mainapp / views.py ", línea 118, en download_file response = HttpResponse (wrapper, content_type = content_type) File" /home/matous/.local/lib/python3.5/ site-packages / django / http / response.py ", línea 285, enen eso self.content = Content File "/home/matous/.local/lib/python3.5/site-packages/django/http/response.py", línea 308, en contenido content = b ''. join (self.make_bytes (fragmento) para el fragmento en valor) MemoryError
¿Que estoy haciendo mal? ¿Es posible configurarlo de alguna manera para transmitirlo pieza por pieza desde el disco duro sin este almacenamiento de memoria loco?
Nota: Sé que Django no debe servir archivos grandes, pero estoy buscando un enfoque simple que permita verificar los derechos de acceso de los usuarios para cualquier archivo servido.