Как показать изображение из базы данных MySql во Flask

0

У меня есть следующая модель. Я успешно вставляю данные в базу данных mysql, но я не могу показать изображение на индексной странице. Как я могу показать объект LargeBinary из mysql как изображение в моем шаблоне?

class ginfo(db.Model):

    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(20))
    comment=db.Column(db.String(1000))
    picdata=db.Column(db.LargeBinary)

Я получил переменные со страницы:

        name=request.form['name']
        comment=request.form['comment']
        file=request.files['inputFile']

и вставьте данные в mysql с:

    signature=ginfo(name=name,comment=comment,picdata=file.read())
    db.session.add(signature)
    db.session.commit()

Я запрашиваю целые строки и столбцы:

    result=ginfo.query.all()
    return render_template('index.html',result=result)

Я пытаюсь показать данные следующим образом:

{%for r in result%}
<div class="page-header">
<h1>{{r.name}}</h1>
</div>
<div class="well">
<p>{{r.comment}}</p>
</div>
<img src={base64.decodestring(r.picdata)}/>
{%endfor%}
  • 0
    <img src ссылается на URL, поэтому, возможно, вам нужен другой контроллер, который загружает изображение и обслуживает его как таковой?
  • 0
    Вы можете сохранить изображение в файловой системе вашего сервера. И сохраните путь к изображению в вашей базе данных.
Показать ещё 1 комментарий
Теги:
flask
image

1 ответ

1

Вы могли бы решить это, например, имея маршрут для подачи ваших данных изображения в качестве ответа, например, создать:

@app.route('/img/<int:img_id>')
def serve_img(img_id):
    pass # look up via id, create response with appropriate mimetype

И в шаблоне, обратитесь к этому маршруту:

{% for r in result %}
<img src="{{ url_for('serve_img', img_id=r.id)}}"
{% endfor %}

Другим подходом было бы прямое встраивание изображения в ваш ответ с использованием URL- адреса данных, в основном base64 кодировать ваши данные и напрямую включать его в вашу отображаемую страницу обработки.

Я бы лично избегал второго подхода, поскольку кодирование, поскольку base64 увеличит размер примерно на 30%, а наличие изображения, внедренного как URL-адрес данных, также предотвратит эффективное кэширование клиентом.

  • 0
    Спасибо за ваши предложения, я попробую :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню