Как реализовать организацию отдачи статического контента с учетом версионирования?

Есть проект на django 1.4.3 в котором достаточно много статичного контента (js, css, иконки и прочая шалупонь).
Сейчас при релизе, производится изменение пути STATIC_URL чтобы скинуть весь кеш в браузерах пользователей. Например
текущий релиз: STATIC_URL = '/assets-01/'
в следующем STATIC_URL = '/assets-02/'
и так далее. Понтно что на уровне nginx это все разруливается и делается alias в папку со статикой.

И все бы это хорошо, если бы не одно НО. У нас достаточно частые релизы и хотфиксы, бывает и несколько раз в день. При смене очередной смене STATIC_URL (если релиз относился к фронтенду) у всех пользователей скидывается кеш, что:
a. Плохо для сервера
б. Плохо для клиента
в. Вообще не правильно

Понятно что нужно как то скидывать кеш только на измененные файлы, но что то не могу сообразить как это сделать. Тут надо учесть что проект большой а времени мало. Так что какие - то глобальные изменения не подходят. Нужен какой нибдь удобный костыльно-велосипедный вариант.

Да и хотелось бы услышать как это вообще по правильному делать.
  • Вопрос задан
  • 3505 просмотров
Решения вопроса 3
Vintorez
@Vintorez
Костылей городить не нужно. В Джанго все уже есть. Для версий от 1.4.х до 1.6.х специально для этого предусмотрено хранилище статики CachedStaticFilesStorage. Как подключать - по ссылке все описано. А смысл, если вкратце, такой:
Командой collectstatic создаются копии ваших статических файлов с добавлением хэша к именам файлов (хэш вычисляется из контента самого файла). Таким образом, если контент файла изменяется, то изменяется и его название, поэтому браузер вынужден получать новый файл статики с вашего сервера. Если файл не менялся - тянем с кэша браузера, как обычно.
Если вы в самом проекте используете темплейт-тег static (как и должно быть), а не переменную STATIC_URL, то проблем с подключением этого хранилища статики у вас возникнуть не должно.
Да, есть тут один момент. В созданных новых файлах статики все имеющиеся ссылки на другую статику (например в css-файле есть ссылка на картинку) тоже изменяются. Если у вас в файлах есть битые ссылки на статику, то collectstatic свалится с ошибкой.
Ответ написан
@gro
Завязывать URL на время изменения этого файла.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
попробуйте добавлять к имени или указывать как get-параметр хэш последнего коммита относящийся к этому файлу (у меня к примеру не выйдет реализовывать это с датой последнего изменения, ибо сборка происходит каждый раз с нуля и некоторые такие данные затираются).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы