#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, но может ли это быть просто вопросом передачи его как переменной?