es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo evito que mi aplicación Flask se agote utilizando Heroku?

Creando una aplicación de Flask donde el usuario puede enviar un archivo de Excel y recibirá un archivo de Excel actualizado.

El problema es que a veces la actualización del archivo de Excel tarda demasiado y Heroku agota el tiempo de espera ya que no he devuelto nada.

Usando formularios HTML, solicitudes POST.

Quiero enviar el código de estado para que funcione como una confirmación y para evitar que se agote el tiempo de espera.

Luego, una vez que se haya terminado de actualizar el archivo, la aplicación descarga el archivo para el usuario.
(se utilizará una cola de trabajos)

Dado que necesitaré devolver 2 cosas para 1 ruta, ¿cómo funcionará?

Necesito devolver un código de estado y el archivo usando send_from_directory().

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Aplicación Flask para actualizar archivos de Excel

    Para crear una aplicación Flask en la que el usuario pueda enviar un archivo de Excel y recibir un archivo de Excel actualizado, podemos utilizar formularios HTML y solicitudes POST. Sin embargo, a veces puede llevar demasiado tiempo actualizar el archivo de Excel y Heroku puede agotar el tiempo de espera ya que no hemos devuelto nada.

    Para evitar el tiempo de espera y proporcionar confirmación al usuario, podemos enviar un código de estado cuando se recibe la solicitud POST. Luego, podemos usar una cola de trabajo para actualizar el archivo de Excel en segundo plano. Una vez que se haya completado el trabajo, la aplicación puede descargar el archivo actualizado para el usuario.

    Para manejar la devolución tanto del código de estado como del archivo en una sola ruta, podemos utilizar la función send_from_directory() para enviar el archivo como respuesta. Aquí hay un ejemplo de cómo podría verse la ruta de Flask:

    from flask import Flask, request, send_from_directory
    import os
    import time
    
    app = Flask(__name__)
    
    @app.route('/actualizar-archivo-excel', methods=['POST'])
    def actualizar_archivo_excel():
        # recibir el archivo de la solicitud POST
        archivo = request.files['archivo']
    
        # enviar el código de estado que indica que se recibió el archivo
        codigo_estado = 200
    
        # agregar trabajo a la cola para actualizar el archivo de Excel en segundo plano
        # esto puede llevar algún tiempo dependiendo del tamaño del archivo
        actualizar_archivo_excel_en_segundo_plano(archivo)
    
        # esperar a que se actualice el archivo
        while not os.path.exists(ruta_archivo_actualizado):
            time.sleep(1)
    
        # enviar el archivo actualizado como respuesta
        return send_from_directory(directory=os.path.dirname(ruta_archivo_actualizado), filename=os.path.basename(ruta_archivo_actualizado)), codigo_estado
    

    En este ejemplo, primero recibimos el archivo de Excel de la solicitud POST y enviamos un código de estado que indica que se recibió el archivo. Luego agregamos el trabajo para actualizar el archivo de Excel en segundo plano y esperamos a que se complete. Una vez que se actualiza el archivo, utilizamos send_from_directory() para enviar el archivo actualizado como respuesta, junto con el código de estado anterior.

    Es importante tener en cuenta que ruta_archivo_actualizado debe reemplazarse por la ruta al archivo actualizado una vez que se haya completado el trabajo. Esta ruta dependerá de dónde esté almacenando el archivo y cómo lo esté nombrando.

    Con este enfoque, el usuario recibirá una confirmación inmediata de que se recibió su archivo y la aplicación no agotará el tiempo de espera mientras actualiza el archivo.

Comments are closed.