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

AWS部署更新后Django应用丢失用户上传图片该如何解决?

问题根因

你遇到的文件丢失问题核心原因是部署流程会覆盖整个项目目录,而你当前的MEDIA_ROOT配置在项目目录内部,每次部署的新版本代码包不包含历史用户上传的媒体文件,旧的媒体目录会被新部署的代码直接覆盖删除。你尝试的项目外目录方案受限于AWS权限无法落地,推荐使用对象存储作为媒体文件存储后端,这也是Django生产环境的标准实践。

解决步骤

方案一:对接AWS S3存储媒体文件(最适配AWS环境)

这是生产环境的首选方案,媒体文件完全和项目部署目录解耦,不存在部署覆盖风险,还可直接对接CloudFront做CDN加速。

  • 安装依赖包,执行命令:
    pip install django-storages boto3
    安装完成后将两个包添加到你的requirements.txt文件,避免部署时依赖缺失。
  • 修改settings.py配置:
    首先将storages添加到INSTALLED_APPS列表,再替换原有MEDIA相关配置:
    INSTALLED_APPS = [
        # 保留原有其他app配置
        'storages',
    ]
    
    # S3基础配置,密钥建议通过环境变量或IAM角色授权,不要硬编码到代码中
    AWS_ACCESS_KEY_ID = '你的AWS_ACCESS_KEY_ID'
    AWS_SECRET_ACCESS_KEY = '你的AWS_SECRET_ACCESS_KEY'
    AWS_STORAGE_BUCKET_NAME = '你提前创建的S3存储桶名称'
    AWS_S3_REGION_NAME = '存储桶所在区域,例:us-east-1'
    AWS_S3_FILE_OVERWRITE = False
    AWS_DEFAULT_ACL = 'public-read' # 不需要公开访问可修改为private
    
    # 媒体文件存储配置
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com/media/'
    
  • 迁移历史媒体文件:将之前本地Setup/media目录下的所有文件上传到S3存储桶的media目录下,历史新闻的图片即可正常访问。
  • 配置完成后所有新上传的媒体文件会直接存入S3,后续部署不会再影响已上传的媒体资源。

方案二:调整部署流程排除媒体目录(临时过渡方案)

如果暂时不想对接S3,可以修改部署规则避免覆盖媒体目录:

  • 若使用AWS Elastic Beanstalk部署:在项目根目录新增.ebignore文件,添加一行Setup/media/,部署时会自动忽略该目录,不会被新代码覆盖。
  • 若使用自定义脚本部署:给rsync/scp等传输命令添加排除参数,例:rsync命令增加--exclude=Setup/media/参数即可跳过该目录的同步。
注意事项
  • 生产环境不建议使用本地目录存储媒体文件,也不要用Django本身提供媒体文件的访问服务,稳定性和性能都远低于对象存储方案。
  • 对接S3时建议给云服务实例绑定有权限访问S3的IAM角色,不需要硬编码密钥到配置文件,安全性更高。
  • 定期备份媒体文件,避免误操作导致资源丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:03