如何在Heroku部署的Django REST Framework项目中使用AWS S3存储上传图片
Django DRF对接AWS S3存储图片修改步骤
1. 安装依赖包
安装对接S3需要的两个工具包:
pip install django-storages boto3
安装完成后把两个包的版本信息更新到requirements.txt中,保证Heroku部署时能正常加载依赖。
2. 调整settings.py配置
首先把storages加入已安装应用列表:
INSTALLED_APPS = [ # 原有其他应用保持不变 'storages', ]
然后在settings.py末尾添加S3存储相关配置,所有敏感密钥通过环境变量读取,不要硬编码到代码中:
import os # 如果你没导入过os需要先加这行 # AWS S3基础配置 AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = os.getenv("AWS_STORAGE_BUCKET_NAME") AWS_S3_REGION_NAME = "替换为你的S3桶所属区域,例如us-east-1" # 同名文件自动重命名不覆盖,避免旧文件被误删 AWS_S3_FILE_OVERWRITE = False # 沿用S3桶默认的访问权限配置,无需额外设置公开权限 AWS_DEFAULT_ACL = None # 修改默认文件存储后端为S3 DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" # 媒体文件访问路径前缀,和原有upload_to配置兼容 MEDIA_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com/media/"
3. 模型代码无需修改
你现有的UploadImage模型不需要做任何调整,upload_to='media/images/'配置会自动生效,后续上传的图片会直接存入S3桶对应路径,接口返回的图片访问链接也会自动替换为S3的公网链接。
4. 配置环境变量
本地开发时可以把AWS相关密钥存入.env文件读取,部署到Heroku时需要到Heroku控制台的Config Vars页面,添加三个变量:AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_STORAGE_BUCKET_NAME,和你settings中读取的变量名保持一致即可。
额外注意事项
- 对接S3使用的IAM用户需要配置S3桶的读写权限,否则会出现上传失败的问题
- 提前配置S3桶的CORS规则,允许你的Heroku应用域名访问资源,避免前端跨域无法加载图片
- 此前已经上传到Heroku本地存储的旧图片需要手动迁移到S3桶,否则后续会随着Heroku实例重启丢失
内容的提问来源于stack exchange,提问作者Sushang Agnihotri
相关产品推荐
相关产品推荐

