Tengo una página que muestra una lista de archivos en un directorio. Cuando el usuario hace clic en el botón Descargar, todos estos archivos se comprimen en un solo archivo, que luego se ofrece para su descarga. Sé cómo enviar este archivo al navegador cuando se hace clic en el botón, y sé cómo volver a cargar la página actual (o redireccionar a otra), pero ¿es posible hacer ambas cosas en el mismo paso? ¿O tendría más sentido redirigir a una página diferente con un enlace de descarga?Método preferido para descargar un archivo generado sobre la marcha en Flask
Mi descarga se inicia con la API de Flask send_from_directory
. código de prueba relevante:
@app.route('/download', methods=['GET','POST'])
def download():
error=None
# ...
if request.method == 'POST':
if download_list == None or len(download_list) < 1:
error = 'No files to download'
else:
timestamp = dt.now().strftime('%Y%m%d:%H%M%S')
zfname = 'reports-' + str(timestamp) + '.zip'
zf = zipfile.ZipFile(downloaddir + zfname, 'a')
for f in download_list:
zf.write(downloaddir + f, f)
zf.close()
# TODO: remove zipped files, move zip to archive
return send_from_directory(downloaddir, zfname, as_attachment=True)
return render_template('download.html', error=error, download_list=download_list)
Actualización: Como solución, ahora estoy cargando una nueva página con el botón de clic, lo que permite al usuario iniciar la descarga (usando send_from_directory
) antes de regresar a la lista actualizada.
Gracias - la aplicación se ejecutará detrás de Apache, y veo que probablemente debería estar usando X-Sendfile para servir los archivos. La otra parte de mi pregunta era si es posible o no presentar una plantilla (para actualizar la información mostrada) y devolver una respuesta de archivo en el mismo paso. Mi comprensión hasta ahora es que no lo es. –
¿Está utilizando POST una buena práctica para descargar? – Joe