You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django部署Heroku后Postgres上传数据闲置丢失问题求助

Heroku上Django媒体文件丢失问题的解决方案

你的问题核心是Heroku的临时文件系统特性导致的:虽然用了Heroku Postgres存储数据,但用户上传的媒体文件(比如图片、文档)是存在应用本地的media目录里,而Heroku的本地存储是临时的——每次应用部署、dyno重启(包括自动缩放、睡眠唤醒、平台维护),本地存储的所有文件都会被重置为部署时的状态,所以早期上传的文件会丢失,只有当前dyno生命周期内上传的文件能访问,而Postgres里只保存了文件的路径记录,所以后台还能看到条目,但实际文件已经不存在了。

解决步骤:

  • 改用云存储服务存储媒体文件(这是Heroku部署Django处理用户上传文件的标准方案,推荐AWS S3、Cloudinary、Google Cloud Storage等)
  • 以AWS S3为例,具体配置:
    1. 安装依赖:
      pip install django-storages boto3
      
      并把这两个包添加到requirements.txt中
    2. 修改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')
      
    3. 在Heroku的配置变量中添加对应的AWS密钥、桶名、区域信息
  • 迁移现有文件:如果需要保留已有的文件,需手动将本地media目录里的文件上传到你的S3桶中,确保文件路径和Postgres里记录的一致
  • 验证:部署更新后的代码,上传新文件,然后重启Heroku dyno(执行heroku restart命令),测试是否能正常访问新旧文件

补充说明:

Heroku的临时文件系统仅适合存储编译后的静态文件(你用Whitenoise处理静态文件是没问题的,因为静态文件是部署时打包上传的),但用户上传的动态文件必须用外部存储服务,否则必然会出现丢失问题。

内容的提问来源于stack exchange,提问作者arl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:10:26