Изображения хранятся как двоичные данные в шаблон

у меня есть модель с изображением, хранящимся как двоичный blob. Я хочу отобразить это изображение вместе с другими данными об объекте в шаблоне. Поскольку изображение не является отдельным файлом, я не могу понять, как его отобразить. Я пробовал устанавливать заголовки или использовать send_file или render_template, но я либо не получаю изображение, либо только получить изображение, а не весь остальной шаблон. Как отобразить двоичный blob в виде изображения в шаблоне?

class A(ndb.Model):
    id= ndb.IntegerProperty()
    x= ndb.StringProperty()
    y= ndb.StringProperty()
    image = ndb.BlobProperty()

1 ответов


изображение хранится в виде байтов. Кодируйте его с помощью base64 и вставьте его в качестве uri данных в отображаемый html. Вы можете передать как объект, так и его закодированное изображение в шаблон.

from base64 import b64encode

@app.route('/show/<int:id>')
def show(id):
    obj = A.query(A.id == id).fetch(1)[0]
    image = b64encode(obj.image)
    return render_template('show_a.html', obj=obj, image=image)
<p>{{ obj.x }}<br/>
{{ obj.y }}</p>
<img src="data:;base64,{{ image }}"/>

это неоптимально, потому что URI данных отправляются каждый раз при отображении страницы, в то время как файл изображения может быть кэширован клиентом. Было бы лучше сохранить файл изображения в каталоге, сохранить путь в базе данных, и просто служить файл изображения отдельно.