Самый простой способ присвоить номерам версий файлы * stati c в django, чтобы избежать кэширования? - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу представить версии для файлов * stati c, чтобы браузер не кэшировал их, так как я буду вносить изменения довольно часто. Так что в настоящее время в моем index.html я называю свои два файла index.css и index.js примерно так:

{% extends "base.html" %} {% load staticfiles %}

<link rel="stylesheet" href="{% static 'css/index.css' %}">

<script type="text/javascript" src="{% static 'js/index.js' %}"></script>

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

Так что для этого мне нужно зарегистрировать тег шаблона. Поэтому я создаю папку с именем templatetags и держу ее на том же уровне, где находятся мои models.py и urls.py. (Хранение в другом месте Django выдает ошибку). Я называю файл как assign_version.py. Это содержимое файла

import time
from django import template

register = template.Library()

@register.simple_tag
def static_version():
        print("version changed!!")
        version = int(round(time.time() * 1000))
        return version

Папка templatetags выглядит как

assign_version.py  assign_version.pyc  __init__.py  __init__.pyc

Теперь я изменил свой index.html, чтобы он ссылался на эти два тега, например

{% extends "base.html" %} {% load staticfiles %} {% load assign_version %}

<link rel="stylesheet" href="{% static 'css/index.css' %}?v={{ static_version }}"> 

<script type="text/javascript" src="{% static 'js/index.js' %}?v={{ static_version }}"></script>

Затем я перезагружаю свой сервер. Но ничего не происходит. Я не вижу print, который я положил, чтобы подтвердить, вызывается ли этот шаблон при перезапуске. Также изменение js или css и перезапуск не заставляют браузер загружать новые файлы. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Прежде всего, обратите внимание, что теги-шаблоны используются с {% your_tag %}, а не с {{ your_tag }}. Поэтому замените {{ static_version }} на {% static_version%} в вашем шаблоне.

Однако, поскольку тег используется каждый раз, когда django генерирует страницу html из вашего шаблона, новая "версия" помещается в ваша страница каждый раз, когда страница загружается. Таким образом, вы, вероятно, не достигнете того, что вы намереваетесь.

Если вы хотите сэкономить время при каждом перезапуске сервера, я могу придумать подход, использующий AppConfig в вашем apps.py. Это называется, когда приложение перезагружается. Так что, может быть, что-то вроде этого:

В вашем assing_version.py добавьте переменную "version" в качестве "глобальной" переменной и используйте ее в качестве своей версии:

#assign_version.py

import time
from django import template

register = template.Library()

version = 0

@register.simple_tag
def static_version():
    print("version changed!!")

    return version

Установите версию в вашем apps.py

from django.apps import AppConfig

import time

from . templatetags import assign_version

class YourappConfig(AppConfig):
    name = 'yourapp'

    def ready(self):
        assign_version.version = int(round(time.time() * 1000))

Чтобы это работало, вам нужно загрузить приложение в settings.py с помощью «yourapp.apps.YourappConfig», а не только с «yourapp».

0 голосов
/ 06 февраля 2020

Вы можете использовать ManifestStaticFilesStorage для достижения этой цели.

Из документов :.

Подкласс внутреннего хранилища StaticFilesStorage, в котором хранятся имена файлов, которые он обрабатывает, добавляя MD5 ha sh содержимого файла к имени файла. Например, файл css / styles. css также будет сохранен как css / styles.55e7cbb9ba48. css.

Ссылка: https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/#manifeststaticfilesstorage

...