Matplotlib Flask Heroku应用程序错误

时间:2019-01-05 06:46:58

标签: python matplotlib heroku flask deployment

我已经很久没有解决这个问题了。 我成功地用flask部署了一个网站,其中包含一个使用matplotlib创建的图形,.png图像。

但是,我想在我的烧瓶应用程序中包含matplotlib代码,以便每次刷新屏幕时,图形都会更改,因为它使用的是随机生成的数据。

我可以使用matplotlib成功部署我的应用程序,但是当我检查网站时,反复出现“应用程序错误”。 它可以在我的计算机上本地运行,但是没有任何问题。

这是我在命令终端中执行的步骤:

  1. 创建虚拟环境
  2. pip安装日期时间,熊猫,matplotlib,lorem,gunicorn
  3. easy_install -U分发
  4. 冻结冻结> requirements.txt
  5. 创建并测试了不同的Procfile,以查看是否有任何效果。

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

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

    web:gunicorn -b:$ PORT app:app

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)

我的requirements.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 :(得分:1)

首先,如果您希望Flask每次刷新页面时都生成新的随机数据,则应在def index()中构建该数据。 当前,您的dataplt对象仅在Flask服务器初始化并唤醒时才构建。

第二,您的绘图数据将保存到本地C:驱动器上的硬编码路径-在Heroku托管环境中将无法使用!
Heroku使用“临时”文件系统,每次重新启动测功机时,该文件系统都会重置回其原始状态。您可以创建临时文件(例如导出的图),但是一旦您的应用休眠或重新启动,它们就会消失。

我建议您在项目中创建一个“ tmp”文件夹(您需要在其中创建一个简单的静态文件,因此它不是一个空文件夹),然后在其中导出绘图,例如/tmp/stock.png,并相应地更新模板...