Вопрос:
Итак, у меня есть установка flask + jinja, и я пытаюсь отобразить изображение в html файле, который отображается jinja.
В Python я конвертирую его в base64, а затем отправляю его в шаблон. Затем я использую тег изображения для отображения изображения.
<img src=»data:image/jpeg;base64,{{ myimage }}»>
Я подтвердил, что кодировка Python верна, она отображается так, как должна, когда я просто пишу html файл с встроенным в него базой64. Там, где это кажется неудачным, из шаблона немного модифицируется выход. В частности:
<img src=3D»data:;base64,/9j/4QAYR … baW4WqWj/2Q=3D=3D»/>
Кажется, что Jinja закручивается, добавляя текст 3D в пару мест, где похоже, что этого не должно быть. Я не указал ничего по-другому, и когда я распечатал myimage как текст, он подошел так, как я ожидал, начиная с /9j и заканчивая /2Q ==
Я не уверен, есть ли что-то с тем, как я интерпретирую его в Jijna или что, но он просто не загружается. Я вижу тег src изображения в источнике электронной почты, но нет ничего, где я ожидаю, что изображение будет загружено.
Ответ №1
Это выглядит как проблема кодирования URL-адреса, поскольку = – это символ, используемый в этом алфавите base64, а его URL-кодирование – %3D. Попробуйте выполнить urllib.quote на основе данных base64, прежде чем отображать его с помощью Jinja.
Ответ №2
myimage переменную myimage как безопасную:
<img src=»data:image/jpeg;base64,{{ myimage | safe }}»>
Простое однофайльное приложение (использует библиотеку запросов):
from flask import Flask, render_template_string import base64 import requests app = Flask(__name__) global _base64_encoded_image @app.route(‘/’) def index(): _html_template = »’ <p><img src=»data:image/jpeg;base64,{{ myimage | safe }}»><p> <p><img src=»data:image/jpeg;base64,{{ myimage | e }}»><p> <p><img src=»data:image/jpeg;base64,{{ myimage }}»><p> »’ global _base64_encoded_image return render_template_string(_html_template, myimage=_base64_encoded_image) @app.before_first_request def before_first_request(): global _base64_encoded_image _url = «http://via.placeholder.com/200?text=Flask/Jinja2» _r = requests.get(_url) _base64_encoded_image = base64.b64encode(_r.content) print _base64_encoded_image if __name__ == ‘__main__’: app.run()