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

Django 4.2+DigitalOcean Spaces静态文件(CSS/JS)无法加载求助

问题:Django 4.2 配置DigitalOcean Spaces后CSS/JS无法加载(图片正常)

我使用Django 4.2搭建项目,已配置Django Storage与DigitalOcean Spaces,部署在DigitalOcean Droplets上。执行collectstatic后所有文件已上传至Spaces,图片可正常显示,但CSS和JavaScript无法加载,已排查两周未解决。

当前配置信息

AWS_ACCESS_KEY_ID = env('aws_s3_access_key')
AWS_SECRET_ACCESS_KEY = env('aws_s3_secret_key')

AWS_S3_REGION_NAME = env('aws_s3_region_name')
AWS_STORAGE_BUCKET_NAME = env('aws_storage_bucket_name')
AWS_S3_ENDPOINT_URL = "https://mogdynamics.nyc3.digitaloceanspaces.com"

AWS_STATIC_LOCATION = 'static'
AWS_DEFAULT_ACL = "public-read"
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}


# DIGITIALOCEAN SPACES CONFIGURATION
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.s3.S3Storage",
        "OPTIONS": {
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl":  AWS_DEFAULT_ACL
        },
    },
    "staticfiles": {
        "BACKEND": "storages.backends.s3.S3Storage",
        "OPTIONS": {
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "region_name": AWS_S3_REGION_NAME,
            "default_acl":  AWS_DEFAULT_ACL
        },
    },
}


STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
STATIC_URL = f'https://{AWS_S3_ENDPOINT_URL}/{AWS_STATIC_LOCATION}/'

错误信息

点击页面源码中的CSS链接时,返回以下错误:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message/>
<RequestId>tx000003614bd933f0201e8-00657ea2de-4e1a3-nyc3d</RequestId>
<HostId>4e1a3-nyc3d-nyc3-zg04</HostId>
</Error>

解决方案

1. 修复STATIC_URL的拼接错误

你的AWS_S3_ENDPOINT_URL已经包含https://前缀,当前STATIC_URL拼接后会生成重复的协议前缀,导致路径错误。修改为:

STATIC_URL = f'{AWS_S3_ENDPOINT_URL}/{AWS_STATIC_LOCATION}/'

或者使用更规范的域名拼接方式:

STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.{AWS_S3_REGION_NAME}.digitaloceanspaces.com/{AWS_STATIC_LOCATION}/'

2. 为staticfiles存储指定location

在STORAGES的staticfiles配置中添加location参数,确保静态文件上传到指定的前缀目录,避免路径混乱:

"staticfiles": {
    "BACKEND": "storages.backends.s3.S3Storage",
    "OPTIONS": {
        "bucket_name": AWS_STORAGE_BUCKET_NAME,
        "region_name": AWS_S3_REGION_NAME,
        "default_acl": AWS_DEFAULT_ACL,
        "location": AWS_STATIC_LOCATION  # 新增该行
    },
},

3. 检查DigitalOcean Spaces的CORS配置

即使图片能显示,CSS/JS可能因CORS规则被浏览器拦截。进入Spaces控制台,找到对应bucket的Settings -> CORS Configuration,添加以下规则:

[
    {
        "AllowedHeaders": ["*"],
        "AllowedMethods": ["GET"],
        "AllowedOrigins": ["*"],  // 建议替换为你的项目域名,如https://your-domain.com
        "ExposeHeaders": []
    }
]

4. 确认静态文件的ACL权限

确保上传的CSS/JS文件权限为public-read。可手动在Spaces控制台查看文件权限,或重新执行collectstatic并清除旧文件:

python manage.py collectstatic --clear

5. 清除浏览器缓存

浏览器可能缓存了错误的静态文件链接,使用Ctrl+Shift+R强制刷新页面,或用无痕模式测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:33