Я использую флягу для своего приложения. Я бы хотел отправить изображение (динамически генерируемое PIL) клиенту без сохранения на диске.
Есть идеи, как это сделать?
Я использую флягу для своего приложения. Я бы хотел отправить изображение (динамически генерируемое PIL) клиенту без сохранения на диске.
Есть идеи, как это сделать?
Сначала вы можете сохранить изображение в tempfile и удалить локальный файл (если он у вас есть):
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)
Во-вторых, установите временный файл в ответ (как этот вопрос в стеке):
from flask import send_file
@app.route('/path')
def view_method():
response = send_file(tempFileObj, as_attachment=True, attachment_filename='myfile.jpg')
return response
Здесь версия без каких-либо временных файлов и т.п. (см. здесь):
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')
Чтобы использовать в своем коде просто
@app.route('some/route/')
def serve_img():
img = Image.new('RGB', ...)
return serve_pil_image(img)
Я тоже боролся в той же ситуации. Наконец, я нашел свое решение, используя приложение WSGI, которое является приемлемым объектом для "make_response" в качестве аргумента.
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)
Пожалуйста, замените операции "открытие изображения" на соответствующие операции PIL.
Оказывается, что колба предоставляет решение (rtm для себя!):
from flask import abort, send_file
try:
return send_file(image_file)
except:
abort(404)