pricing online google anywhere python python-2.7 file-upload flask pythonanywhere

python - online - Cargar y descargar archivos con el matraz



python server online (2)

Mejor añadir

response.headers["Cache-Control"] = "must-revalidate" response.headers["Pragma"] = "must-revalidate" response.headers["Content-type"] = "application/csv"

Si no agrega el tipo de contenido, FF 48.0 lo reportó como html y abrió el cuadro de diálogo Guardar una vez para HTML y luego para CSV. Si no agrega Cache-Control, su resultado puede ser almacenado en caché, y si sirve contenido activo, esto no es lo que desea. Si usa must-revalidate sin edad, servirá efectivamente como no-cache; consulte here y here para obtener una explicación.

Estoy tratando de escribir una aplicación web realmente simple con PythonAnywhere y Flask que le permite al usuario cargar un archivo de texto, genera un archivo csv y luego permite que el usuario descargue el archivo csv. No tiene que ser lujoso, solo tiene que funcionar. Ya he escrito el programa para generar el csv desde un archivo txt en la unidad.

En este momento, mi función abre el archivo en la unidad con:

with open(INPUTFILE, "r") as fname:

y escribe el csv con:

with open(OUTPUTFILE, ''w'') as fname:

siendo INPUTFILE y OUTPUTFILE cadenas de nombre de archivo.

¿Sería mejor para mí manejar los archivos como objetos, devueltos por el frasco / html de alguna manera?

No se como hacer esto. ¿Cómo debo estructurar este programa? ¿Cuántas plantillas HTML necesito? Preferiría trabajar en los archivos sin guardarlos en cualquier lugar, pero si tengo que guardarlos en el directorio de PythonAnywhere, podría hacerlo. ¿Cómo puedo hacer eso?


PythonAnywhere dev aquí. Esta es una buena pregunta sobre Flask y el desarrollo web en general y no específico de nuestro sistema, así que intentaré dar una respuesta genérica sin nada específico para nosotros :-)

Hay algunas cosas que necesito saber para dar una respuesta definitiva a su pregunta, así que comenzaré haciendo una lista de las suposiciones que estoy haciendo. Déjeme un comentario si me equivoco con alguna de ellas. Voy a actualizar la respuesta adecuadamente.

  • Supongo que los archivos que está cargando no son enormes y pueden caber en una cantidad de memoria razonable, digamos, más pequeña que un megabyte.
  • Supongo que el programa que ya ha escrito para generar el CSV a partir del archivo de texto está en Python, y que tiene (o, probablemente, podría cambiarse fácilmente para tener) una función que toma una cadena que contiene el contenido del archivo de texto y devuelve los contenidos que se deben escribir en el CSV.

Si ambos son el caso, entonces la mejor manera de estructurar su aplicación Flask sería manejar todo dentro de Flask. Un ejemplo de código vale más que mil palabras, así que aquí hay uno simple que reúno y que le permite al usuario cargar un archivo de texto, lo ejecuta a través de una función llamada transform (que es donde la función de su programa de conversión se ubicaría dentro de la mía). simplemente reemplaza = con , largo del archivo), y envía los resultados al navegador. Hay una versión en vivo de esta aplicación en PythonAnywhere aquí .

from flask import Flask, make_response, request app = Flask(__name__) def transform(text_file_contents): return text_file_contents.replace("=", ",") @app.route(''/'') def form(): return """ <html> <body> <h1>Transform a file demo</h1> <form action="/transform" method="post" enctype="multipart/form-data"> <input type="file" name="data_file" /> <input type="submit" /> </form> </body> </html> """ @app.route(''/transform'', methods=["POST"]) def transform_view(): request_file = request.files[''data_file''] if not request_file: return "No file" file_contents = request_file.stream.read().decode("utf-8") result = transform(file_contents) response = make_response(result) response.headers["Content-Disposition"] = "attachment; filename=result.csv" return response

Respecto a tus otras preguntas:

  • Plantillas: no usé una plantilla para este ejemplo, porque quería que todo encajara en una sola pieza de código. Si lo estuviera haciendo correctamente, pondría las cosas generadas por la vista de form en una plantilla, pero eso es todo.
  • ¿Puede hacerlo escribiendo en archivos? Sí, puede, y el archivo cargado se puede guardar utilizando el método de save( nombre de archivo ) en el objeto de file que estoy usando la propiedad de stream . Pero si sus archivos son bastante pequeños (como supongo anteriormente), entonces probablemente tenga más sentido procesarlos en la memoria como lo hace el código anterior.

Espero que todo ayude, y si tiene alguna pregunta, simplemente deje un comentario.