Comencé a jugar con Flask y estoy buscando convertir algunos scripts de Python fáciles para poder ejecutarlos a través de una interfaz web. Principalmente herramientas de ajuste de datos.
Entonces, la mayoría de las herramientas que tengo ejecutando a través de la línea de comandos usan 2 hojas de cálculo y luego realizan operaciones entre ellas usando pandas (buscar diferencias, actualizar información, etc.).
Sin embargo, parece que no puedo entender cómo crear la interfaz necesaria para permitir que los usuarios que ven el sitio tengan 2 botones de carga (1 para cada archivo) y luego, debajo, tienen un botón de proceso donde ocurre la magia.
Toda la documentación que he encontrado trata sobre la carga de un solo archivo (y luego ejecuta cualquier proceso) o permite la carga de múltiples archivos con un solo botón de carga.
Entonces, una plantilla básica sería algo como:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <h2>Upload Current File Here</h2> <form method=post enctype=multipart/form-data> <input type=file name=curfile> <input type=submit value=Upload> </form> </div> <div> <h2>Upload New File Here</h2> <form method=post enctype=multipart/form-data> <input type=file name=newfile> <input type=submit value=Upload> </form> </div> </body> </html>Ahora para app.py, esta es la versión que cargará un solo archivo y proceso.
from flask import Flask, request, render_template import pandas as pd from werkzeug.utils import secure_filename app = Flask(__name__) app.config["ALLOWED_FILE_EXTENSIONS"] = ["xlsx"] app.config["MAX_IMAGE_FILESIZE"] = 16 * 1024 * 1024 @app.route('/', methods=['GET', 'POST']) def upload(): if request.method == 'POST': dfcur = pd.read_excel(request.files.get('curfile')) return render_template('upload.html') if __name__ == '__main__': app.run(debug=True)Espero que lo que publiqué tenga sentido, he estado revisando muchas notas en línea y aún no he encontrado nada que aborde el flujo de trabajo. Sé que el problema es que el archivo se carga y luego se procesa la plantilla, mientras que quiero permitir que ambos se carguen antes de hacer nada.
Después de investigar un poco y repasar el código, logré que funcionara agregando una solicitud adicional. archivos para el nombre de archivo adicional.
Todavía tengo que incorporar qué hacer con los archivos, ya que este código es básicamente del tutorial de carga del matraz, pero esto es lo que funciona ahora.
archivo py
import os from flask import Flask, flash, request, redirect, url_for, send_from_directory from flask.templating import render_template from werkzeug.utils import secure_filename UPLOAD_FOLDER = 'uploads/' ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} app = Flask(__name__) app.config['SECRET_KEY'] = 'secret' app.config['MAX_CONTENT_LENGTH'] = 16 * 1000 * 1000 app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/uploads/<name>') def download_file(name): return send_from_directory(app.config["UPLOAD_FOLDER"], name) @app.route('/', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': # check if the post request has the file part if 'curfile' not in request.files or 'newfile' not in request.files: flash("Sorry, the upload didn't send all of the data!") return redirect(request.url) curfile = request.files["curfile"] newfile = request.files["newfile"] # If the user does not select a file, the browser submits an # empty file without a filename. if curfile.filename == "" or newfile.filename == "": flash('You need to upload 2 files!') return redirect(request.url) if curfile and allowed_file(curfile.filename): filename = secure_filename(curfile.filename) curfile.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) return redirect(url_for('download_file', name=filename)) return render_template("app2.html")archivo de plantilla
<!DOCTYPE html> <head> <title>Test</title> </head> <html> <body> <form method="post" enctype="multipart/form-data"> <h2>Upload Current File</h2> <input type="file" name="curfile"> <h2>Upload New File</h2> <input type="file" name="newfile"> <p></p> <input type="submit" value="Upload"> </form> {% with messages = get_flashed_messages() %} {% if messages %} <ul class="flashes"> {% for message in messages %} <div class="message_flash">{{ message }}</div> {% endfor %} </ul> {% endif %} {% endwith %} </body> </html>