【问题标题】:Content not refreshing in Dash / Flask app after Heroku deploymentHeroku 部署后 Dash / Flask 应用程序中的内容不刷新
【发布时间】: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


【解决方案1】:

找不到新文件的原因似乎是因为Heroku has an “ephemeral” hard drive,这意味着在Heroku上部署容器时,新上传的文件不会保留在磁盘上。

正如 Heroku 所建议的,解决方案不是将上传的文件存储到磁盘,最佳做法是利用云文件存储服务,例如 Amazon 的 S3。

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2015-05-20
    • 2021-07-27
    相关资源
    最近更新 更多