Django не будет обновлять staticfiles
это раздражает. У меня есть файл javascript, на который ссылается шаблон django:
<script src="{% static 'js/login.js' %} "></script>
я внес некоторые изменения в этот файл js. Потом я обновил страницу и я не вижу изменений.
Если я удаляю javascript из файла и помещаю его в HTML, он работает правильно, но если я попытаюсь сделать это с помощью внешнего JS-файла, то это не так. Я попытался закрыть сервер и запустить runserver несколько раз, я также попытался перейти с Firefox на Chrome. В этом нет никакого смысла. Пожалуйста, помогите мне понять, я могу уйти от включения всех js внутри HTML, но меня беспокоит, что я больше не могу делать это нормально.
подробнее об этой ошибке (самая странная вещь, которую я нашел#$&%#):
javascript-это что-то вроде этого:
old_sentence = "Dig that hole, forget the sun" // this is what I want to change
$("#jqselector").text(old_sentence)
new_sentence = "Run, rabbit, run" // this is the new sentence, it just won't show up.
Итак, я изменил js и перезапустил сервер, все еще html показывает старое предложение. Затем я удалил ссылку на вход.JS файл и поместить все js внутри тегов скрипта в HTML, конечно же, появляется новое предложение. Затем я включаю логин.JS-файл, прокомментируйте js внутри html, но я удаляю все содержимое внутри логина.файл js, делая его пустым файлом... но старая фраза все равно всплывает. Поэтому старый логин.файл js должен быть обналичен где-то, я не знаю. Затем я открываю Chrome и пробую все это снова, та же проблема.
что это может быть? есть ли возможность заставить django обновить staticfiles? Я думал перезапустить сервера было достаточно. .. должен ли я перезагрузить компьютер? : / lol.
9 ответов
очистка статического файла
python manage.py collectstatic --noinput --clear
. Это очистит статику заранее.очистить кэш браузера
добавить случайную строку после JS-файла include, e.g jquery.Яш?rand=23423423, с каждой нагрузкой.
- это помогло?
похоже, что оба ваших браузера имеют кэшированный файл javascript. В Chrome вы можете очистить кэш, нажав Ctrl
+ Shift
+ Del
и тикают просто "кэшированные изображения и файлы". Firefox, вероятно,имеет аналогичный ярлык.
вы можете взглянуть на этот вопрос на советы, чтобы отключить кэширование статических файлов на сервере разработки в целом.
вам нужно сломать кэш браузера. Этот тег шаблона выведет UUID на основе времени, когда DEBUG=True
. В противном случае он будет искать PROJECT_VERSION
переменные среды. Если это не найдено, он выведет статический номер версии.
from django import template
from django.conf import settings
register = template.Library()
@register.simple_tag(name='cache_bust')
def cache_bust():
if settings.DEBUG:
version = uuid.uuid1()
else:
version = os.environ.get('PROJECT_VERSION')
if version is None:
version = '1'
return '__v__={version}'.format(version=version)
вы бы использовали в шаблоне, как это:
{% load cache_bust %}
<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
и вот результат:
<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
Я тоже боролся с этой проблемой в течение нескольких часов. Я попытался ввести случайную строку с помощью Javascript, но этот метод кажется глупым и уродливым. Один из возможных способов справиться с этой проблемой-ввести пользовательский тег. Смотрите это документ дополнительные сведения:
в частности, вам нужно создать пакет под названием templatetags
в любых созданных вами приложениях (или создайте новое, если хотите). И вы создаете любой файл в этом пакете, и пишете что-то вроде это:
from django import template
from django.utils.crypto import get_random_string
from django.templatetags import static
register = template.Library()
class StaticExtraNode(static.StaticNode):
def render(self, context):
return super().render(context) + '?v=' + get_random_string(32)
@register.tag('static_no_cache')
def do_static_extra(parser, token):
return StaticExtraNode.handle_token(parser, token)
def static_extra(path):
return StaticExtraNode.handle_simple(path)
тогда вы можете использовать tag {% static_no_cache '.../.../path...' %}
создать путь со случайными аргументами!
надеюсь, это поможет!
Если ничего не работает, найдите имя файла в проекте и найдите неожиданную копию. Если вы сохранили в неправильном месте (другое приложение) в какой-то момент или откололи новое приложение от старого, приоритет загрузки может сыграть с вами злую шутку.
вместо использования сложных решений вы можете добавить дополнительный параметр к вашим услугам в шаблоны.
для статических включает в себя:
<script src="{% static 'js/polls/polls.js' %}?version=1"></script>
для direct включает в себя:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />
Примечание ?version=1
в коде. Каждый раз, когда вы изменяете файл css/js, измените эту версию в шаблоне, поэтому браузер будет вынужден перезагрузить файл.
и если вы хотите избежать кэширования по какой-то неизвестной причине, вы можете использовать текущий метка времени вместо версии:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
если вы не хотите обновлять кэш браузера при каждом изменении файлов CSS и JavaScript или при стилизации изображений, вам нужно установить STATIC_URL
динамически с изменяющимся компонентом пути. С динамически изменяющимся URL, всякий раз, когда код обновляется, браузер посетителя будет принудительно загружать все новые некэшированные статические файлы. В этом рецепте мы установим динамический путь для STATIC_URL
использование времени последнего редактирования в ОС.
import os
from datetime import datetime
def get_file_changeset(absolute_path):
timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static'))))
try:
timestamp = datetime.utcfromtimestamp(int(timestamp))
except ValueError:
return ""
changeset = timestamp.strftime('%Y%m%d%H%M%S')
return changeset
и следующее изменение в вашей SETTINGS
:
from utils.misc import get_file_changeset
STATIC_URL = "/static/%s/" % get_file_changeset(BASE_DIR)
как работает:
The
Ваш браузер будет кэшировать изображения и файлы (включая javascript). Во-первых, очистите только кэшированные изображения и файлы. Затем используйте режим инкогнито в chrome или частный просмотр в firefox во время внесения изменений в свой .JS файлы, так что вы видите их сразу после обновления страницы