Django-gitrevision, автоматическое обновление статики на клиенте
Содержание:
В современных веб-проектах, статические файлы (css, js ...) обычно жестко кешируются с целью экономики трафика и для предупреждения лишней нагрузки на сервер. В тоже время важно чтобы при обновлении статики, особенно JavaScript файлов, старые клиенты получили обновленную версию.
В моем проекте используется Git и Django. И вполне логично допустить, что актуальная версия статики зависит от номера последнего коммита в Git.
Поэтому когда такая проблема возникла, я взял и написал очень простое django-приложение для отслеживания текущего Git коммита в проекте.
Note
На текущий момент данное приложение неактуально тк я сделал http://github.com/klen/dealer Последний пакет поддерживает несколько систем контроля версий включая git и mercurial. И несколько python веб-фреймворков, а не только Django.
Установка
Приложение можно установить из PyPi
easy_install django-gitrevision
# Или с помощью pip
pip install django-gitrevision
Настройка и использование
Необходимо добавить gitrevision в INSTALLED_APPS, settings.py:
INSTALLED_APPS += 'gitrevision',
Если вы предполагаете использовать gitrevision шаблонах (для обновления статики, этого достаточно) добавьте в settings.py:
TEMPLATE_CONTEXT_PROCESSORS += 'gitrevision.context_processors.gitrevision',
И используйте переменную GIT_REVISION в шаблонах:
<link href="/test.css?{{ GIT_REVISION }}" rel="stylesheet" type="text/css" media="screen" />
<script src="/test.js?{{ GIT_REVISION }}"></script>
Если идентификатор коммита нужен во views, хотя мне трудно представить такую ситуацию, то подключите gitrevision в MIDDLEWARE_CLASSES.
MIDDLEWARE_CLASSES += 'gitrevision.middleware.GitRevision',
Использование в views:
def superview( request ):
gitrevision = request.git_revision
...
В этом случае нет необходимости подключать CONTEXT_PROCESSOR так как в шаблонах идентификатор будет доступен через request.git_revision.
Note
Возможно вам понадобится добавить переменную с путем к вашему репозиторию в settings:
GIT_PATH = <path_to_your_git_repository>
Заключение
Приложение написано таким образом, что файловые операции происходят единожды при компиляции проекта. Таким образом нагрузки на сервер не создается.
Теперь в текущих проектах у меня не возникает головной боли по поводу устаревшей версии статики на клиентах.