我有一个 Python dash 应用程序,它有一个用于从 docker 下载 Excel 文件的按钮。下面是一个用于此目的的最小示例。当文件夹是我的本地驱动器时,按钮按预期工作,并开始下载。但是,当 FOLDER 是 docker 路径 (/app/data) 按钮时不起作用,我得到这个:
有办法解决这个问题吗?
谢谢!!
import dash
import dash_bootstrap_components as dbc
from dash import html
from flask import send_from_directory
app = dash.Dash(external_stylesheets=[dbc.themes.SIMPLEX])
server = app.server
FOLDER = 'C:/TEST'
# FOLDER = '/app/data'
app.layout = html.Div([
dbc.Button(
children="Test",
href=f'/{FOLDER}/abc.xlsx',
download="abc.xlsx",
external_link=True
)
])
@server.route(f'/{FOLDER}/<path:filename>')
def download_file(filename):
try:
return send_from_directory(FOLDER, filename, as_attachment=True)
except Exception as e:
return str(e)
if __name__ == '__main__':
# app.run_server(host='0.0.0.0', port='8085', debug=True)
app.run_server(debug=True)
您可能想使用 docker 查看卷安装 - 根据设计,容器内部的路径无法从父系统访问,但您可以通过 docker cli 或通过 docker compose 卷挂载特定目录,将容器内的特定目录挂载到磁盘外部的路径,然后更改要加载的 URL 以从那里提取数据。
在 docker compose 中,例如:
services:
frontend:
image: python3.9 #or whatever you like
volumes:
- C:/test/:/app/data
现在您的容器可以写入 /app/data,您将在 C:/test/ 中看到它。
有很多方法可以强化这一点(例如,通过 .env var 传递目录) - 您可能还可以更好地从 Flask 应用程序内部的相对路径提供文件,但如果您需要它们之外的文件容器、体积安装是您最好的选择