对于文件系统中存在的文件,heroku 显示文件未找到/500

heroku shows file not found / 500 for files that exist in file system

我有一个在本地运行良好的 Flask + React 应用程序。当我部署到 heroku 时,尝试从 Flask 加载 metrics.yaml 文件时出现 500 错误:

app = Flask(__name__, static_folder='../build', static_url_path='/')

@app.route('/')
def index():
  metrics = load_metrics(url_for('static', filename='metrics.yaml'))

这会导致 500 服务器错误,整个站点无法加载。 heroku logs --tail 显示:

No such file or directory: '/metrics.yaml'

2021-07-15T16:44:56.490218+00:00 heroku[router]: at=info method=GET path="/metrics.yaml" host=react-flask-heroku-bp.herokuapp.com request_id=6c5561ad-e8b4-49da-bba0-5342052a19a0 fwd="73.25.235.134" dyno=web.1 connect=1ms service=45ms status=200 bytes=1320 protocol=https
2021-07-15T16:49:45.626217+00:00 heroku[router]: at=info method=GET path="/" host=react-flask-heroku-bp.herokuapp.com request_id=48f85a02-744c-4c1e-a52f-f063ee1213e8 fwd="73.25.235.134" dyno=web.1 connect=1ms service=17ms status=500 bytes=463 protocol=https

但是如果我将浏览器指向 https://[site].herokuapp.com/metrics.yaml 文件,我可以正常看到它。

让我感到困惑的一件事是 method=GET path="/metrics.yaml" 似乎显示 200 状态,然后 method=GET path="/" 显示 500 错误。这是为什么?

如何解决此问题,以便我可以从 Web 根目录加载 /metrics.yaml 文件而不会出现 500 错误?

---更新---

我注意到无论我在这里输入什么地址,即使是绝对路径:https:/mhtransfers.s3.us-west-2.amazonaws.com/metrics.yaml

结果

FileNotFoundError: [Errno 2] No such file or directory: 'https:/mhtransfers.s3.us-west-2.amazonaws.com/metrics.yaml'

这是构建文件夹结构:

我设法通过以下方式解决了这个问题:

from pathlib import Path
metrics_file = Path(__file__).parent / "metrics.yaml"
metrics = load_metrics(metrics_file)

这让我可以在没有环境特定变量的情况下定位正确的路径,并在服务器和本地使用相对路径。