[英]Content not refreshing in Dash / Flask app after Heroku deployment
我有一個嵌入在 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 有一個“臨時”硬盤驅動器,這意味着在 Heroku 上部署容器時,新上傳的文件不會保留在磁盤上。
正如 Heroku 所建議的,解決方案不是將上傳的文件存儲到磁盤,而是利用雲文件存儲服務,例如 Amazon 的 S3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.