Django: permite al usuario descargar un archivo grande

Estoy construyendo un sitio privado de carga de archivos. Alice carga un archivo, Bob lo descarga.

Las personas que no sean Alice y Bob no deberían tener acceso. Primero pensé en darle al archivo un nombre complejo ( http://domain/download/md5sum.zip ), pero quiero un enlace que caduca. Entonces, algo como http://domain/download/tempkey/aaa123/file.zip . Esto me dará más control sobre la descarga y el registro de archivos.

Encontré esto: https://stackoverflow.com/a/2900646 . Sugiere lo siguiente:

 class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): # The URL the client requested print self.path # analyze self.path, map the local file location... # open the file, load the data with open('test.py') as f: data = f.read() # send the headers self.send_response(200) self.send_header('Content-type', 'application/octet-stream') # you may change the content type self.end_headers() # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish. # wfile is a file-like object. writing data to it will send it to the client self.wfile.write(data) 

¿Pero cómo consigo que esto funcione en Django? Una función de vistas debería devolver un objeto HTTPResponse, lo que no funciona.

Usar Django para descargar archivos grandes no es realmente recomendable. Por lo general, tendrías un multiplexor de front-end como NginX, y usarías Django solo para validar el archivo.

Luego, si se valida la descarga, se emitirá una señal al multiplexor. Para NginX, puede configurar un encabezado especial (“X-Accel-Redirect”) para que apunte a la ubicación real del archivo local. Django solo servirá unos pocos bytes, y todo el trabajo pesado será tomado por NginX; al mismo tiempo, la URL original será la de Django, por lo que no es posible eludir la seguridad.

Ver: http://wiki.nginx.org/X-accel

Puede encontrar notas sobre cómo servir archivos estáticos (extensibles con autenticación) aquí

https://docs.djangoproject.com/en/dev/howto/static-files/

pero como dice la página, es ” una vista de ayudante rápida y sucia ” no destinada a sitios de producción o de alto tráfico. Eso no es lo que Django fue diseñado para hacer, incluso si puede hacerlo.