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.

Estamos sirviendo cientos de imágenes a través de una API de flask, ¿es esta la mejor práctica?

Actualmente tenemos una configuración en la que servimos imágenes a través de una API de Flask con Gunicorn. El token y el nombre de la imagen se pasan como parámetros de la URL. Hacemos esto para una biblioteca completa de imágenes (hasta 500). Por lo tanto, en una sola solicitud de frontend, se realizarán 500 solicitudes. Me gustaría saber si esta es una mejor práctica, o si hay alguna forma de servir toda la biblioteca de una vez, con una sola solicitud GET, algo como send_all(images)?

El problema con nuestra solución es que, para cada solicitud GET, es necesario realizar una solicitud y una verificación. Esto funciona, pero si consideras que el servidor recibe 500 solicitudes al mismo tiempo y realiza 500 verificaciones simultáneas, no estoy seguro de si es lo más eficiente.

¡Muchas gracias de antemano! 🙂

Ejemplo de Solicitud: \
http://localhost:5000/image-server&image_name=alpha.png&token="xxx-yyy-zzz"

Semipseudocódigo:
python
@app.route("/image-server", methods=['GET])
def get_image():
image_name = request.args.get("image_name")
token = request.args.get("id_token")
if verify_token(token):
return send_file(f"{image_name}")
else:
return Response(404)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Servir 500 imágenes con 500 solicitudes, cada una con su propia verificación de token, no es una práctica óptima. Puede causar una carga alta en el servidor y ralentizar la aplicación.

    Una solución para servir toda la biblioteca de imágenes con una sola solicitud GET es utilizar un formato de archivo comprimido como tar o zip. El servidor puede comprimir las imágenes, servir el archivo comprimido al cliente y el cliente puede extraer las imágenes.

    Otra solución es utilizar una Red de Distribución de Contenido (CDN), que almacena en caché las imágenes en varios servidores y las sirve al cliente desde el servidor más cercano. Esto puede reducir en gran medida la carga en el servidor y aumentar la velocidad de la aplicación.

    En Flask, podemos usar el método send_from_directory para servir las imágenes desde el directorio del servidor. Podemos crear una nueva ruta que tome una lista de nombres de imágenes y devuelva un archivo comprimido o una respuesta JSON que contenga las URL de las imágenes. Podemos usar el método make_response para crear un objeto de respuesta y establecer el tipo de contenido adecuado.

    Aquí tienes un ejemplo de fragmento de código:

    import os
    from flask import Flask, request, make_response, send_from_directory
    import tarfile
    
    app = Flask(__name__)
    
    IMAGE_DIR = '/ruta/a/imagenes'
    
    @app.route('/imagenes', methods=['GET'])
    def obtener_imagenes():
        nombres_imagenes = request.args.getlist('nombre_imagen')
        token = request.args.get('id_token')
    
        if verificar_token(token):
            # construir una lista de rutas de imágenes
            rutas_imagenes = [os.path.join(IMAGE_DIR, nombre) for nombre in nombres_imagenes]
    
            # crear un archivo comprimido
            with tarfile.open('/tmp/imagenes.tar.gz', 'w:gz') as tar:
                for ruta in rutas_imagenes:
                    tar.add(ruta)
    
            # servir el archivo comprimido
            respuesta = make_response(send_from_directory('/tmp', 'imagenes.tar.gz', as_attachment=True))
            respuesta.headers['Content-Type'] = 'application/x-gzip'
            return respuesta
        else:
            return Response(status=401)
    
    

    En este código, comprimimos las imágenes utilizando tarfile y servimos el archivo comprimido utilizando send_from_directory.

    Nota: Este código es solo con fines ilustrativos y puede necesitar modificaciones en función de los requisitos exactos.

Comments are closed.