【发布时间】:2020-11-20 11:31:38
【问题描述】:
我有一个嵌入在 Flask 应用程序中的 Dash 仪表板。该应用程序使用 Heroku Container Registry 部署在 Heroku 上。
一个 python 脚本 (get_data.py) 使用 Heroku Scheduler 每 10 分钟运行一次。此脚本调用 Yahoo Finance API 获取数据,创建图表并将其保存为 image.png(注意:旧图像被新文件覆盖)。 Heroku 调度程序作业:
python app-folder/get_data.py
预期的行为是在刷新浏览器时显示新图像或当破折号间隔组件每 N 秒更新一次内容时。
这在本地工作。当我在本地运行应用程序并手动调用get_data.py 时,新的image.png 会在浏览器刷新或 Dash 间隔组件定期触发回调以返回时显示新图像。以下是我在应用程序在本地运行时刷新数据的方式:
docker-compose run website bash -c "python app-folder/get_data.py"
这可能是因为服务器返回了一个缓存/过时的响应,还是对 Heroku 有某种我不知道的限制?
编辑:为清楚起见,image.png 更新后应用程序不会重新启动。
这是 Dash 仪表板,但我认为这不是问题所在:
url_base = '/plotlydash/'
def create_dashboard(server):
dash_app = dash.Dash(
server=server,
routes_pathname_prefix=url_base,
)
def serve_layout():
"""
App.layout to a function so it can serve a dynamic layout on
every page load.
By default, Dash apps store the app.layout in memory. This
ensures that the layout is only computed once at start -
Don't want this!
"""
return html.Div([
html.Div(id='image-div', children=[]),
dcc.Interval(
id='interval-component',
interval=6*10000, # 10 seconds
n_intervals=0
)
])
dash_app.layout = serve_layout
@dash_app.callback(Output('image-div', 'children'),
[Input('interval-component', 'n_intervals')])
def update_image(n):
img_path = "app-folder/static/images/image.png"
encoded_image = base64.b64encode(
open(img_path, 'rb').read())
return html.Img(src='data:image/png;base64,{}'\
.format(encoded_image.decode()), style={"height": "600px"})
return dash_app.server
【问题讨论】:
-
Heroku 文件存储不是持久的。重新启动应用程序后,您更改或创建的任何文件都将丢失。见devcenter.heroku.com/articles/active-storage-on-heroku
-
明白。但是应用程序没有重新启动,并且大概在应用程序仍在运行时应该可以访问新的 image.png 文件?
标签: python flask heroku plotly-dash