如何将S3存储桶中的CSV文件提供给部署在Heroku上的Python应用
解决Heroku上Dash应用无法读取静态文件的问题
可能的原因及解决方案
1. 本地文件路径不匹配Heroku环境
Heroku的文件系统结构和本地开发环境不同,绝对路径会失效,建议用动态路径获取:
- 使用
os.path模块拼接相对路径,示例:import os # 获取当前脚本所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接静态文件路径 csv_path = os.path.join(current_dir, 'data', 'your_file.csv') html_map_path = os.path.join(current_dir, 'maps', 'your_map.html') - 部署前确认项目目录结构,确保静态文件在Git追踪范围内(没被
.gitignore排除)。
2. 利用已配置的AWS S3存储读取静态文件
既然已经完成AWS权限配置,直接从S3读取文件是更稳定的方案(Heroku临时文件系统重启后会丢失文件):
- 使用
boto3库从S3下载或直接读取文件内容:import boto3 import pandas as pd s3 = boto3.client('s3') # 读取CSV文件到DataFrame csv_obj = s3.get_object(Bucket='your-bucket-name', Key='path/to/your_file.csv') df = pd.read_csv(csv_obj['Body']) # 读取HTML地图文件内容 html_obj = s3.get_object(Bucket='your-bucket-name', Key='path/to/your_map.html') map_html = html_obj['Body'].read().decode('utf-8')
3. 验证文件是否已部署到Heroku
- 登录Heroku CLI,进入应用目录执行
heroku run bash,然后用ls命令查看文件是否存在于预期路径下:heroku run bash # 在Heroku容器内执行 ls data/ # 检查CSV所在目录 ls maps/ # 检查HTML地图所在目录 - 如果文件不存在,检查
.gitignore是否包含了这些文件/目录,确保它们被提交到Git并推送到Heroku。
4. 检查文件存在性与权限
- 在代码中添加文件存在性检查,快速定位路径问题:
import os csv_path = 'data/your_file.csv' if not os.path.exists(csv_path): raise FileNotFoundError(f"静态文件未找到:{csv_path}") - 本地文件权限设置无需特殊调整,Git提交后Heroku容器内会自动赋予合理权限。
内容的提问来源于stack exchange,提问作者kleo188
相关产品推荐
相关产品推荐

