如何修改Django中上传至Amazon S3文件的访问URL?
问题
文件存储在Amazon S3中,正确访问URL为https://certsstorenordic.s3.eu-west-3.amazonaws.com/certificate/2022/11/filename.pdf,在Django admin中可正常打开,但网站前端访问时URL变为错误的本地地址:http://127.0.0.1:8000/certificate/2022/11/28/filename.pdf,需修改上传文件的URL前缀,让前端显示正确的S3地址。
相关代码如下:
urls.py
urlpatterns = [] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
settings.py
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.eu-west-3.amazonaws.com' STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'static' MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/' MEDIA_ROOT = BASE_DIR / 'media'
models.py
certificate = models.FileField(upload_to='certificate/%Y/%m/%d/', blank=True, null=True)
HTML模板
{% for i in response %} <tr> <td>{{i.component.description}}</td> <td><a href="{{ i.certificate }}">Download</a></td> </tr> {% endfor %}
解决方法
1. 安装依赖包
安装对接S3所需的依赖:
pip install django-storages boto3
2. 配置S3文件存储后端
修改settings.py,指定使用S3作为文件存储后端,让Django自动生成S3格式的文件URL:
# 新增:指定文件存储后端 DEFAULT_FILE_STORAGE = 'django_storages.backends.s3boto3.S3Boto3Storage' # 确保桶名配置正确 AWS_STORAGE_BUCKET_NAME = 'certsstorenordic' # 替换为你的实际S3桶名 AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.eu-west-3.amazonaws.com' STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'static' MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/' # 使用S3后无需本地存储路径,可注释或删除该行 # MEDIA_ROOT = BASE_DIR / 'media'
3. 移除本地MEDIA静态服务路由
修改urls.py,删除DEBUG模式下的本地MEDIA路由配置——因为文件已存储在S3,不需要Django本地处理:
urlpatterns = [] # 注释或删除以下代码 # if settings.DEBUG: # urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4. 验证效果
重启Django服务后,前端模板中的{{ i.certificate }}会自动渲染为正确的S3 URL,用户点击下载将直接访问S3上的文件。
内容的提问来源于stack exchange,提问作者Dmytro Zinchenko
相关产品推荐
相关产品推荐

