Django и Google Cloud Storage - как кешировать изображения - PullRequest
0 голосов
/ 18 сентября 2018

Я занимаюсь разработкой приложения Django 2.1 и пытаюсь обслужить мультимедийные файлы через Google Cloud Storage (GCS).

Я создал корзину с открытым доступом для чтения и установил пакет django-storages .

Мне удалось заставить интеграцию работать, но я не знаю, как заставить браузер кэшировать изображения, загруженные из GCS.

Сейчас изображения загружаются даже для этих страниц.что я уже посетил.

Это мои настройки в settings.py :

# GCS INTEGRATION
# ------------------------
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = '<BUCKET>'
GS_DEFAULT_ACL = 'publicRead'
GS_CACHE_CONTROL = 'max-age=86400'

# MEDIA
# -------------------------
MEDIA_URL = 'https://storage.cloud.google.com/<BUCKET>/'
MEDIA_ROOT = 'https://storage.cloud.google.com/<BUCKET>/'

Я также установил переменную среды, которая указывает на учетную запись службы GCS JSON-файл

GOOGLE_APPLICATION_CREDENTIALS='<PATH-TO-JSON>'

В шаблон, который показывает список изображений, я поместил следующий код (внутри цикла):

<div class="uk-width-1-4 uk-card-media-left uk-cover-container">
    <img data-src="{{object.resource.url}}" alt="" uk-cover uk-img>
</div>

При визуализации сервером этот фрагменткод переводится следующим образом:

<div class="uk-width-1-4 uk-card-media-left uk-cover-container">
    <img data-src="https://storage.cloud.google.com/<BUCKET>/<PATH-TO-FILE>" alt="" uk-cover="" uk-img="" class="uk-cover" src="https://storage.cloud.google.com/<BUCKET>/<PATH-TO-FILE>" style="width: 169px; height: 126px;">
</div>

Я попытался поиграть с некоторыми тегами заголовков с помощью следующего миксина.

class CacheControlMixin(object):
    cache_timeout = 60*60

    def get_cache_timeout(self):
        return self.cache_timeout

    def dispatch(self, *args, **kwargs):
        response = super(CacheControlMixin, self).dispatch(*args, **kwargs)
        patch_response_headers(response, self.get_cache_timeout())
        patch_cache_control(response, public=True)
        return response

Само собой разумеется, это не сработало.

...