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...' %} создать путь со случайными аргументами!

надеюсь, это поможет!


обновить статические файлы, вы должны выполнить python manage.py collectstatic снова.


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


вместо использования сложных решений вы можете добавить дополнительный параметр к вашим услугам в шаблоны.

для статических включает в себя:

<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 файлы, так что вы видите их сразу после обновления страницы