我已经很久没有解决这个问题了。 我成功地用flask部署了一个网站,其中包含一个使用matplotlib创建的图形,.png图像。
但是,我想在我的烧瓶应用程序中包含matplotlib代码,以便每次刷新屏幕时,图形都会更改,因为它使用的是随机生成的数据。
我可以使用matplotlib成功部署我的应用程序,但是当我检查网站时,反复出现“应用程序错误”。 它可以在我的计算机上本地运行,但是没有任何问题。
这是我在命令终端中执行的步骤:
创建并测试了不同的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
答案 0 :(得分:1)
首先,如果您希望Flask每次刷新页面时都生成新的随机数据,则应在def index()
中构建该数据。
当前,您的data
和plt
对象仅在Flask服务器初始化并唤醒时才构建。
第二,您的绘图数据将保存到本地C:驱动器上的硬编码路径-在Heroku托管环境中将无法使用!
Heroku使用“临时”文件系统,每次重新启动测功机时,该文件系统都会重置回其原始状态。您可以创建临时文件(例如导出的图),但是一旦您的应用休眠或重新启动,它们就会消失。
我建议您在项目中创建一个“ tmp”文件夹(您需要在其中创建一个简单的静态文件,因此它不是一个空文件夹),然后在其中导出绘图,例如/tmp/stock.png
,并相应地更新模板...