Ошибка приложения Matplotlib Flask Heroku - PullRequest
0 голосов
/ 05 января 2019

Я уже много лет перебираю эту проблему. Я успешно развернул веб-сайт с флягой, содержащей граф .png изображение, которое я создал с помощью matplotlib.

Однако я хотел включить код matplotlib в свое приложение для работы с колбами, чтобы каждый раз при обновлении экрана график менялся, поскольку он использует случайно сгенерированные данные.

Я могу успешно развернуть свое приложение с помощью matplotlib, но я постоянно получаю сообщение об ошибке приложения, когда проверяю свой веб-сайт. Он работает локально на моем компьютере без каких-либо проблем.

Вот шаги, которые я выполнил в командном терминале:

  1. Создание виртуальной среды
  2. pip install datetime, pandas, matplotlib, lorem, gunicorn
  3. easy_install -U распространять
  4. замораживание пунктов> needs.txt
  5. Создал и протестировал разные Procfile, чтобы посмотреть, будет ли что-нибудь работать.

    web: gunicorn gettingstarted.wsgi --log-file -

    web: gunicorn --bind 0.0.0.0:$PORT app: app

    веб: gunicorn -b: $ ПОРТ приложение: приложение

6

 git init
heroku git:remote -a name-of-app
git add .
git commit -am "random text message"
git push heroku master

Он развернут, но продолжает появляться ошибка приложения. Если я не включу matplotlib, он будет работать нормально.

Вот мой код для app.py

from flask import Flask
from flask import Flask, render_template, url_for, redirect

from datetime import datetime as dt
import numpy as np
import matplotlib.pyplot as plt
import lorem

app = Flask(__name__)

data = {["AAPL", "MSFT", "GOOG"][i]: np.random.randint(100, 400, 12) for i in range(3)}
data
plt.figure(figsize=(8, 5))

plt.plot(data["AAPL"])
plt.plot(data["MSFT"])
plt.plot(data["GOOG"])

plt.title("APPL v MSFT v GOOG Stock 2019", fontsize= 20)
plt.xlabel("Months", fontsize=20)
plt.ylabel("Price in $", fontsize = 20)
plt.legend(list(data.keys())[:3], fontsize=14, loc="best")
path = "C:/Users/Michael/Desktop/WEB4/flaskdeploy/static/"
plt.savefig(path + "stock.png", dpi = 300, bbox_inches = "tight");
#plt.show();
plt.tight_layout()

date = dt.now().strftime("%Y/%m/%d")
timeNow = dt.now().strftime("%H:%M:%S")


text = lorem.text()[:100]

@app.route("/")
def index():

    return render_template("home.html", text = text, date=date, timeNow=timeNow)


if __name__ == "__main__":
    app.run(debug=True)

Файл Мои требования .txt. Любая помощь будет принята с благодарностью. Спасибо!

certifi==2018.11.29
Click==7.0
cycler==0.10.0
DateTime==4.3
Flask==1.0.2
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10
kiwisolver==1.0.1
lorem==0.1.1
MarkupSafe==1.1.0
matplotlib==3.0.2
numpy==1.15.4
pandas==0.23.4
pyparsing==2.3.0
python-dateutil==2.7.5
pytz==2018.7
six==1.12.0
Werkzeug==0.14.1
wincertstore==0.2
zope.interface==4.6.0

1 Ответ

0 голосов
/ 08 января 2019

Во-первых, если вы хотите, чтобы Flask генерировал новые случайные данные каждый раз при обновлении страницы, то вы должны построить эти данные в def index(). В настоящее время ваши объекты data и plt создаются только при инициализации и пробуждении сервера Flask.

Во-вторых, данные вашего графика сохраняются в жестко заданном пути на локальном диске C: - это не будет работать в среде хостинга Heroku!
Heroku использует «эфемерную» файловую систему, которая будет возвращаться в исходное состояние при каждом перезапуске динамометра. Вы можете создавать временные файлы (например, экспортированный график), но они исчезнут, как только ваше приложение перестанет работать или перезапустится.

Я бы порекомендовал создать папку «tmp» в вашем проекте (вам нужно создать простой статический файл, чтобы она не была пустой папкой), а затем экспортировать там свой график, например, /tmp/stock.png, и обновите свой шаблон соответственно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...