Django Sirviendo un archivo de descarga

Estoy tratando de servir un archivo txt generado con algún contenido y estoy teniendo algunos problemas. Creé los archivos temporales y escribí el contenido usando NamedTemporaryFile y simplemente puse delete a false para depurar, sin embargo, el archivo descargado no contiene nada.

Mi conjetura es que los valores de respuesta no apuntan al archivo correcto, aunque no se está descargando nada, aquí está mi código:

f = NamedTemporaryFile() f.write(p.body) response = HttpResponse(FileWrapper(f), mimetype='application/force-download') response['Content-Disposition'] = 'attachment; filename=test-%s.txt' % p.uuid response['X-Sendfile'] = f.name 

¿Ha considerado simplemente enviar a p.body través de la response esta manera?

 response = HttpResponse(mimetype='text/plain') response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid response.write(p.body) 

XSend requiere la ruta del archivo en la response['X-Sendfile'] .

 response['X-Sendfile'] = smart_str(path_to_file) 

Aquí, path_to_file es la ruta completa al archivo (no solo el nombre del archivo). Revisa este django-snippet

Puede haber varios problemas con su enfoque:

  • el contenido del archivo no se debe vaciar, agregue f.flush() como se menciona en el comentario anterior
  • NamedTemporaryFile se elimina al cerrar, lo que puede suceder al salir de su función, por lo que el servidor web no tiene oportunidad de recogerlo
  • el nombre del archivo temporal puede estar fuera de las rutas que el servidor web está configurado para enviar usando X-Sendfile

Tal vez sería mejor usar StreamingHttpResponse en lugar de crear archivos temporales y X-Sendfile

 import urllib2; url ="http://sofes.miximages.com/download/octet-stream response = HttpResponse(opener.read(), mimetype=mimetype) response[Content-Disposition]= attachment; filename=aktel.png" return response