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

Django对接OCI存储桶:样式不生效问题求助

Django-storages对接OCI存储桶后样式不生效问题

配置信息

Django Settings 配置

AWS_S3_ACCESS_KEY_ID = env('AWS_BUCKET_KEY')
AWS_SECRET_ACCESS_KEY = env('AWS_BUCKET_SECRET')
AWS_BUCKET_NAMESPACE = env('AWS_BUCKET_NAMESPACE')
AWS_STORAGE_BUCKET_NAME = env('AWS_BUCKET_NAME')
AWS_S3_BUCKET_REGION = env('AWS_S3_BUCKET_REGION')

AWS_S3_ENDPOINT_URL = f'https://{AWS_BUCKET_NAMESPACE}.compat.objectstorage. {AWS_S3_BUCKET_REGION}.oraclecloud.com'
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = f'{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}'
AWS_DEFAULT_ACL = 'public-read'

STATICFILES_STORAGE = 'custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'

# Use AWS_S3_ENDPOINT_URL here if you haven't enabled the CDN and got a custom domain. 
STATIC_URL = '{}/{}/'.format(AWS_LOCATION, 'static')
STATIC_ROOT = 'var/static/'
STATICFILES_DIRS = [
    BASE_DIR / "static"
]

MEDIA_URL = '{}/{}/'.format(AWS_LOCATION, 'media')
MEDIA_ROOT = 'media/'

初始自定义存储类

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    location = 'static'

class MediaStorage(S3Boto3Storage):
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    location = 'media'

修改后的自定义存储类(已解决上传错误)

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    access_key = settings.AWS_S3_ACCESS_KEY_ID
    secret_key = settings.AWS_SECRET_ACCESS_KEY
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    region_name = settings.AWS_S3_BUCKET_REGION
    location = 'static'

class MediaStorage(S3Boto3Storage):
    access_key = settings.AWS_S3_ACCESS_KEY_ID
    secret_key = settings.AWS_SECRET_ACCESS_KEY
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    region_name = settings.AWS_S3_BUCKET_REGION
    location = 'media'

问题背景

最初执行文件上传时遇到签名错误:

botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the PutObject operation: 
The secret key required to complete authentication could not be found. The region must be specified if this is not the home region for the tenancy.

通过在自定义存储类中添加密钥和区域信息,该上传错误已解决。但目前所有静态文件路径能正常加载,应用却完全无法识别样式文件。

可能的原因及排查方向

  • 自定义存储类缺失endpoint_url配置:修改后的存储类未指定OCI兼容端点,可能导致生成的文件URL使用AWS默认地址,需在StaticStorage和MediaStorage中添加:
    endpoint_url = settings.AWS_S3_ENDPOINT_URL
    
  • STATIC_URL路径冗余错误:当前AWS_LOCATION已包含端点+桶名,STATIC_URL拼接后可能出现层级重复,可简化配置:
    STATIC_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/static/"
    
  • 静态文件权限未生效:全局配置的public-readACL未被自定义存储类继承,需在存储类中添加:
    default_acl = settings.AWS_DEFAULT_ACL
    
    同时检查OCI存储桶中静态文件的实际权限,确保可公开访问。
  • 浏览器缓存旧样式:CacheControl设置为max-age=86400会缓存文件一天,可强制刷新浏览器(Ctrl+F5),或临时修改为no-cache测试。
  • collectstatic执行不彻底:确认重新执行python manage.py collectstatic,且OCI桶中static/目录下存在最新样式文件,无路径错误或遗漏。
  • 模板加载语法错误:检查模板中是否正确使用{% load static %}和{% static 'path/to/style.css' %}语法,避免硬编码URL导致路径不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:45:22