Как строить графики в Flask на Google App Engine?

Всем привет.

Для построения графика использую такой рецепт (сначала построение и сохранение в .png, затем уже .png в теле HTML берётся из папки).

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.plot(x_1, y_1, 'r-',
             x_2, y_2, 'b-')

plt.savefig('static/img/plot.png')


<img src="static/img/plot.png" alt="Image Placeholder" height="400">


Но в случае с GAE matplotlib работает не совсем корректно.
Да, я создал отдельную папку lib и поместил туда matplotlib со всеми зависимостями, но даже при таком раскладе мне выдаёт разномастные ошибки:
ImportError: dynamic module does not define init function (init_path)

lib/numpy/core/__init__.py", line 6, in
from . import multiarray
ImportError: cannot import name multiarray


Может кто-то уже сталкивался с такой связкой и знает рецепт построения графиков? Возможно с использованием других библиотек.

Спасибо.
  • Вопрос задан
  • 1546 просмотров
Решения вопроса 1
tibhar940
@tibhar940 Автор вопроса
Отвечу сам на свой вопрос.
Возможно для таких же ламеров, как я, будет полезно.

1. Прежде чем использовать какую-либо библиотеку в GAE, необходимо удостовериться, поддерживается ли она или нет. Идём по этой ссылке: https://cloud.google.com/appengine/docs/python/too...

2. Если она поддерживается (как в случае c matplotlib), смотрим в какой степени: смотрим Supported version. У нас это "1.2.0""latest"

3. Исходя из этого корректируем свой файл app.yaml
libraries:
- name: jinja2
version: "2.6"
- name: markupsafe
version: "0.15"
- name: matplotlib
version: "latest"


4. Затем уже в нашем main.py (ну или views.py - смотря как вы назвали файл, который обрабатывает представления и в зависимости от структуры проекта) делаем импорт как обычно
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


Итоговый рецепт плоттирования в Flask с помощью matplotlib в GAE выглядит так:
import StringIO
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

def func():
    plt.plot(x1, y1, 'r-',
                 x2, y2 'b-')

    output = StringIO.StringIO()
    plt.savefig(output, format="png")
    img = 'data:image/png;base64,%s' % output.getvalue().encode("base64").strip()
    return img

## Само представление

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
@app.route('/index')
def index():
    img = func() ## Я создал отдельную функцию (см. выше) для формирования и вызываю её при заходе на страницу
    return render_template(
        'index.html',
        img = img)


index.html
<img src="{{ img }}" alt="Image Placeholder" height="400">
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы