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.