Estoy trabajando en una aplicación Flask de una sola página en python. Para cambiar el contenido de la página, simplemente invoco una función de javascript que oculta un div y revela otro.
Uno de estos divs contiene un formulario en el que un usuario puede cargar un archivo, que ejecuto a través de un script de Python que analiza los datos del archivo.
El problema es que después de ejecutar el código, Flask parece querer que lo redirija a una nueva página. Preferiría devolver un disparador para simplemente ejecutar mi función javascript.
El formulario HTML:
<form class='upload-form' id='upload-form' action="/upload" method='POST' enctype="multipart/form-data" onsubmit="return show_and_hide('load', 'upload')"> <input type="file" name='file' value="Browse..."> <input type="submit" value='Upload'> </form>La función Javascript:
var callFunction; function show_and_hide(div_in, div_out){ var shower = document.getElementById(div_in); var hider = document.getElementById(div_out); var hider_items = hider.children; var i; for(i = 0; i < hider_items.length; i++){ hider_items[i].style.animation = "hide 1s"; } callFunction = setTimeout(change_div, 1000, div_in, div_out); var shower_items = shower.children; var n; for(n = 0; n < shower_items.length; n++){ shower_items[n].style.animation = "show 1s"; } return true; }Y la aplicación del matraz (en realidad no la tengo regresando ???):
@app.route('/upload', methods=['POST', 'GET']) def upload_file(): f = request.files['file'] new_file_name = str(uuid.uuid1()) + '.zip' f.save(os.path.join('uploads/', new_file_name)) path = 'uploads/' + new_file_name return ???Agradezco cualquier consejo! ¡Gracias!
Deberá usar JavaScript para enviar los archivos a Flask, ya que enviar un formulario HTML siempre lo redirigirá. Aquí hay un ejemplo usando AJAX ¿Cómo puedo cargar archivos de forma asíncrona?
Flask necesita todas las funciones de vista (rutas) para devolver una respuesta para enviar al cliente. Puede devolver una cadena vacía y un estado 200 para que Flask sepa que procesó la solicitud con éxito.
@app.route('/upload', methods=['POST', 'GET']) def upload_file(): f = request.files['file'] new_file_name = str(uuid.uuid1()) + '.zip' f.save(os.path.join('uploads/', new_file_name)) path = 'uploads/' + new_file_name return '', 200La solución que terminé usando era un poco antigua pero funciona muy bien. Redirijo el formulario a un iframe invisible agregando un botón al formulario:
<input type="button" id="double-analysis-button" value='Correlate' style='width:250px' onclick="redirect('double-analysis-form', 'double-analysis-iframe', 'graph-loading', 'graph-display')"> <iframe class="uploader" id="double-analysis-iframe" name="double-analysis-iframe" src="" frameborder="0"></iframe>y la función javascript:
function redirect(elemid, tgt, sh1, sh2){ document.getElementById(elemid).target = tgt; document.getElementById(elemid).submit(); var callFunction; callFunction = show_and_hide(sh1, sh2); }La función show_and_hide es lo que uso para desvanecer un div hacia afuera y otro div hacia adentro.