Quiero permitir que los usuarios descarguen un archivo específico haciendo clic en el botón " Descargar ". El botón se vinculará con muchos conmutadores, por lo que escribí un script JS que cambia la etiqueta " href " para que apunte al archivo estático correcto.
Traté de seguir muchas preguntas de stackoverflow y leer documentación sobre Django staticfiles, archivos multimedia, pero no entendí lo que debo hacer en mi caso. Cualquier ayuda sería muy apreciada, permítanme presentarles lo que hice y pedirles su ayuda/opinión.
Quiero permitir que la gente descargue archivos que se pueden encontrar en:
"/home/user/xxxx/xxx/project/my_app/static/"
Aquí está mi función en views.py :
def send_file(request,file_name): from django.contrib.staticfiles.storage import staticfiles_storage import os from wsgiref.util import FileWrapper import mimetypes filename = staticfiles_storage.url(file_name) download_name = file_name wrapper = FileWrapper(open(filename)) content_type = mimetypes.guess_type(filename)[0] response = HttpResponse(wrapper, content_type=content_type) response['Content-Length'] = os.path.getsize(filename) response['Content-Disposition'] = "attachment; filename=%s" % download_name return response
Necesito la ruta exacta para abrir el archivo, así que lo que hice es definir en mi configuración STATIC_URL = "/home/user/xxxx/xxx/project/my_app/static/"
. No me gusta esta solución, porque después de eso, si revisas mi fuente, tienes la ruta exacta de mi proyecto. Si STATIC_URL = "static/"
no funciona. Busqué una forma de obtener la ruta exacta para el archivo estático pero no funcionó. ¿Alguna ayuda para esta parte?
urls.py :
url(r'^download/static/(?P<file_name>[\w.]{0,256})$',views.send_file, name='send_file'),
template.html , solo la parte del botón:
<a href="#" class="button" id="dl-link">Download</a>
JS , solo la parte que cuando hace clic en un conmutador, cambia la etiqueta href del botón HTML:
"if you click on a switcher" id = switcher-checked var atag = document.getElementById("dl-link"); var url = "http://localhost:8000/test/download/static/"+id+".csv"; atag.setAttribute("href",url);
¿Hay alguna solución para usar la etiqueta {% url 'my_app:send_file%} en mi JS? Descubrí que una solución es poner el script directamente dentro de "template.html", ¿es un buen comportamiento?
Mi descarga funciona perfectamente, pero siento que todas mis opciones son bastante malas (STATIC_URL y JS var url definition). Sé que mi pregunta es bastante densa, pero realmente necesito esta ayuda. Cualquier ejemplo sería más que apreciado. Gracias.
Un par de puntos. el primero para STATIC_URL puede usar "/static/" con una barra inclinada que comienza y termina en lugar de una ruta completa. ya que está intentando descargar desde el mismo nombre de dominio, no es necesario usar la URL completa " http://localhost:8000/your-url ". Simplemente puede usar "/your-url" en la variable js var url.
Django no puede procesar archivos js, por lo que solo tenemos una opción, manteniéndola en template.html. Para un mejor mantenimiento del código js, intente declarar una variable global con direcciones URL en la plantilla al cargar el documento y utilícelas en su secuencia de comandos. Entonces esa parte del guión será clara. por ejemplo,
var all_my_urls = { "url":"{% url 'my_app:send_file'%}" }