Django部署Heroku后Postgres上传数据闲置丢失问题求助
Heroku上Django媒体文件丢失问题的解决方案
你的问题核心是Heroku的临时文件系统特性导致的:虽然用了Heroku Postgres存储数据,但用户上传的媒体文件(比如图片、文档)是存在应用本地的media目录里,而Heroku的本地存储是临时的——每次应用部署、dyno重启(包括自动缩放、睡眠唤醒、平台维护),本地存储的所有文件都会被重置为部署时的状态,所以早期上传的文件会丢失,只有当前dyno生命周期内上传的文件能访问,而Postgres里只保存了文件的路径记录,所以后台还能看到条目,但实际文件已经不存在了。
解决步骤:
- 改用云存储服务存储媒体文件(这是Heroku部署Django处理用户上传文件的标准方案,推荐AWS S3、Cloudinary、Google Cloud Storage等)
- 以AWS S3为例,具体配置:
- 安装依赖:
并把这两个包添加到pip install django-storages boto3requirements.txt中 - 修改
settings.py的媒体文件配置,替换原有的MEDIA_ROOT和MEDIA_URL:# 新增云存储配置 AWS_ACCESS_KEY_ID = env.str("AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = env.str("AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = env.str("AWS_STORAGE_BUCKET_NAME") AWS_S3_REGION_NAME = env.str("AWS_S3_REGION_NAME", default="us-east-1") AWS_S3_FILE_OVERWRITE = False AWS_DEFAULT_ACL = "public-read" # 根据文件隐私需求调整 AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com" # 替换媒体文件存储后端 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/" # 注释或删除原本地存储配置 # MEDIA_ROOT = os.path.join(BASE_DIR, 'media') - 在Heroku的配置变量中添加对应的AWS密钥、桶名、区域信息
- 安装依赖:
- 迁移现有文件:如果需要保留已有的文件,需手动将本地
media目录里的文件上传到你的S3桶中,确保文件路径和Postgres里记录的一致 - 验证:部署更新后的代码,上传新文件,然后重启Heroku dyno(执行
heroku restart命令),测试是否能正常访问新旧文件
补充说明:
Heroku的临时文件系统仅适合存储编译后的静态文件(你用Whitenoise处理静态文件是没问题的,因为静态文件是部署时打包上传的),但用户上传的动态文件必须用外部存储服务,否则必然会出现丢失问题。
内容的提问来源于stack exchange,提问作者arl
相关产品推荐
相关产品推荐

