python streaming python-imaging-library flask temporary-files

python - ¿Cómo enviar imágenes generadas por PIL al navegador?



streaming python-imaging-library (4)

Estoy usando matraz para mi aplicación. Me gustaría enviar una imagen (generada dinámicamente por PIL) al cliente sin guardar en el disco.

Alguna idea de cómo hacer esto ?


¡Resulta que el matraz proporciona una solución (¡a mí mismo!):

from flask import abort, send_file try: return send_file(image_file) except: abort(404)


Aquí hay una versión sin archivos temporales y similares (ver here ):

def serve_pil_image(pil_img): img_io = StringIO() pil_img.save(img_io, ''JPEG'', quality=70) img_io.seek(0) return send_file(img_io, mimetype=''image/jpeg'')

Para usar en tu código simplemente hazlo

@app.route(''some/route/'') def serve_img(): img = Image.new(''RGB'', ...) return serve_pil_image(img)


Primero, puede guardar la imagen en un tempfile y eliminar el archivo local (si tiene uno):

from tempfile import NamedTemporaryFile from shutil import copyfileobj from os import remove tempFileObj = NamedTemporaryFile(mode=''w+b'',suffix=''jpg'') pilImage = open(''/tmp/myfile.jpg'',''rb'') copyfileobj(pilImage,tempFileObj) pilImage.close() remove(''/tmp/myfile.jpg'') tempFileObj.seek(0,0)

En segundo lugar, configure el archivo temporal para la respuesta (según esta pregunta de ):

from flask import send_file @app.route(''/path'') def view_method(): response = send_file(tempFileObj, as_attachment=True, attachment_filename=''myfile.jpg'') return response


También estaba luchando en la misma situación. Finalmente, encontré su solución usando una aplicación WSGI, que es un objeto aceptable para "make_response" como argumento.

from Flask import make_response @app.route(''/some/url/to/photo'') def local_photo(): print(''executing local_photo...'') with open(''test.jpg'', ''rb'') as image_file: def wsgi_app(environ, start_response): start_response(''200 OK'', [(''Content-type'', ''image/jpeg'')]) return image_file.read() return make_response(wsgi_app)

Reemplace las operaciones de "imagen de apertura" con las operaciones de PIL apropiadas.