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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:05:41