Как мне выводить графики из matplotlib в html-шаблон в flask на сервере ubuntu?

#python #ubuntu #matplotlib #flask #gunicorn

#python #ubuntu #matplotlib #flask #gunicorn

Вопрос:

Я пытаюсь настроить побочный проект на DigitalOcean и использую git framework из https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvii-deployment-on-linux для начала.

В рамках этой структуры я добавил код в один из маршрутов flask (/ explore ), в котором я генерирую график с помощью matplotlib, и я хочу вернуть этот график как объект, когда я визуализирую шаблон как функцию возврата этого маршрута. Мне не нужно сохранять график, если его можно отправить в шаблон, не делая этого (например, с помощью ввода-вывода.BytesIO()) , но я не смог получить правильный синтаксис, чтобы использовать этот подход и получить график для отображения в результирующем шаблоне.

Пока мои попытки с io.Если функция BytesIO() не удалась, если это поможет вывести результаты с помощью такого подхода, пожалуйста, дайте мне знать, как ее наилучшим образом использовать, и я попытаюсь запустить этот код с предлагаемыми изменениями и сообщить о результатах.

Заранее спасибо!

Я попытался сохранить файл и отправить его в шаблон, а также отправить данные файла через BytesIO(), но ни один из подходов не сработал для меня.

Ниже приведена моя попытка сохранить файл в статический каталог и отправить изображение в шаблон, но решение, которое работает в этой среде с io.BytesIO() или аналогичный без сохранения файла было бы еще лучше.

Вот код, который я добавил в маршрут исследования в /app/main/routes .py, чтобы сохранить изображение графика в статическом каталоге и вернуть путь к шаблону:

 new_graph_name = url_for('static', filename='tmp_png.png')

plt.savefig(new_graph_name)

return render_template('index.html', url=new_graph_name)
 

Вот код, который я добавил в index.html шаблон:

 {% if url %}

    <img src={{ url }} alt="Chart" height="42" width="42" />

{% endif %}
 

Ответ №1:

Что касается сохранения графика и последующего его отображения, не могли бы вы попробовать что-то похожее на приведенный ниже код? Это сработало для меня недавно.

В routes.py:

 @app.route("/")
def index():
   new_graph_name = 'tmp_png'
   plt.savefig('static/images/'   new_graph_name)
   return render_template("index.html", new_graph_name=new_graph_name)
 

В index.html:

 <img src="{{ url_for('static', filename='images/'   new_graph_name   '.png') }}"
 

С байтами.IO Я думаю, что я пробовал что-то подобное раньше:

В routes.py:

 import io
from io import BytesIO
import base64

img = io.BytesIO()
fig.savefig(img)
img.seek(0)
buffer = b''.join(img)
b2 = base64.b64encode(buffer)
barplot=b2.decode('utf-8')
 

Я не могу вспомнить, как я отобразил его в шаблоне .html, но может ли это быть просто вопросом передачи его как переменной?