2021年1月7日星期四

Django-Compressor won't work in offline mode with custom S3 domain

I get the following error whenever a custom domain for the S3 endpoint is used.

#  WORKS   AWS_S3_CUSTOM_DOMAIN = 'example.fra1.digitaloceanspaces.com/{}'.format(AWS_STORAGE_BUCKET_NAME)  #  DOES NOT WORK ⁉️   AWS_S3_CUSTOM_DOMAIN = 'cdn.example.com/{}'.format(AWS_STORAGE_BUCKET_NAME)    

CommandError: An error occurred during rendering /home/<user>/<app>/templates/public/index.html: 'https://cdn.example.com/storage/static/node_modules/nouislider/distribute/nouislider.min.css' isn't accessible via COMPRESS_URL ('https://example.fra1.digitaloceanspaces.com/storage/static/') and can't be compressed

If I go to either url the file is accessible, hence its likely that the CDN is ok, URLs are correctly defined, CORS are fine too. Also without django-compressor subdomain delivery had been working fine, leading me to believe the issue is not with django-storages

I've been trying for several hours and ultimately had to do a temporary fix by setting the AWS_S3_CUSTOM_DOMAIN to be the same as the AWS_S3_ENDPOINT_URL. However this is not ideal.

Please see the implementation below.

/requirements.txt

Django==3.1.4  ...  boto3~=1.16.46  botocore~=1.19.46  s3transfer~=0.3.3  ...  django-storages~=1.11.1  django-compressor~=2.4  

/config/settings.py

...  # ==========================================================  #  DJANGO-STORAGES  # ==========================================================  if LOCALHOST_MODE:      MEDIA_URL = '/media/'      MEDIA_ROOT = os.path.join(BASE_DIR, 'media')        STATIC_URL = '/static/'      STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static/'), ]  else:      AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")      AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")        AWS_STORAGE_BUCKET_NAME = 'storage'      AWS_S3_ENDPOINT_URL = 'https://example.fra1.digitaloceanspaces.com'           #  WORKS ⚠️       AWS_S3_CUSTOM_DOMAIN = 'example.fra1.digitaloceanspaces.com/{}'.format(AWS_STORAGE_BUCKET_NAME)      #  DOES NOT WORK ⁉️       AWS_S3_CUSTOM_DOMAIN = 'cdn.example.com/{}'.format(AWS_STORAGE_BUCKET_NAME)          AWS_S3_OBJECT_PARAMETERS = {          'CacheControl': 'max-age=86400',      }      AWS_LOCATION = 'static'      AWS_DEFAULT_ACL = 'public-read'        STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )      STATIC_URL = '{}/{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_STORAGE_BUCKET_NAME, AWS_LOCATION)      STATICFILES_STORAGE = 'storage_backends.CachedS3Boto3Storage'        MEDIA_ROOT = os.path.join(BASE_DIR, "media")      MEDIA_URL = '{}/{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_STORAGE_BUCKET_NAME, 'media')      DEFAULT_FILE_STORAGE = 'storage_backends.MediaStorage'    # ==========================================================  # DJANGO-COMPRESSOR  # ==========================================================  COMPRESS_ENABLED = True  STATIC_DEPS = True  COMPRESS_ROOT = os.path.join(BASE_DIR, "static")    COMPRESS_FILTERS = {      'css': ['compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.rCSSMinFilter'],      'js': ['compressor.filters.jsmin.JSMinFilter']  }    if LOCALHOST_MODE:      COMPRESS_OFFLINE = False  else:      COMPRESS_OFFLINE = True      COMPRESS_STORAGE = STATICFILES_STORAGE      COMPRESS_URL = STATIC_URL    STATICFILES_FINDERS = [      'django.contrib.staticfiles.finders.FileSystemFinder',      'django.contrib.staticfiles.finders.AppDirectoriesFinder',      'compressor.finders.CompressorFinder',  ]  ...  

/storage_backends.py

from django.core.files.storage import get_storage_class  from storages.backends.s3boto3 import S3Boto3Storage    from config import settings      class MediaStorage(S3Boto3Storage):      bucket_name = settings.AWS_STORAGE_BUCKET_NAME      location = 'media'      class CachedS3Boto3Storage(S3Boto3Storage):      def __init__(self, *args, **kwargs):          super(CachedS3Boto3Storage, self).__init__(*args, **kwargs)          self.local_storage = get_storage_class(              "compressor.storage.CompressorFileStorage")()        def save(self, name, content):          self.local_storage._save(name, content)          super(CachedS3Boto3Storage, self).save(name, self.local_storage._open(name))          return name  
https://stackoverflow.com/questions/65536285/django-compressor-wont-work-in-offline-mode-with-custom-s3-domain January 02, 2021 at 01:26PM

没有评论:

发表评论