Джанго JavaScript не может быть загружен после внесения изменений - PullRequest
0 голосов
/ 22 мая 2018

Ребята

В настоящее время я занимаюсь разработкой сайта Django Версия Django: 1.11.13

Я добавил статическую папку в каждое приложение.и DEBUG = True в settings.py

статические файлы (javascript и css) можно найти, но когда я изменил / добавил контент в css, его можно перезагрузить.но javascript не может.

, что я сделал:

<script src="{% static 'assets/js/dashboard.js' %}?{% cache_bust %}" type="text/javascript"></script>

cache_bust - это templatetags, которые добавят uuid в конце ссылки js. он не работает для перезагрузки javascript в браузере.

Я выбрал все время , чтобы очистить кеш в браузере. это не работает для перезагрузки JavaScript в браузере.

python manage.py collectstatic, это все еще не работает

только яможно было создать еще один файл js, это изменение может быть обнаружено браузером.

Я не думаю, что это имеет смысл.у вас есть такая же проблема, и как с ней разобраться?Любое предложение?

спасибо.

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

@ Chiefir

Я создал функцию cache_bust в tempatetags.

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)

и ссылки URL, как показано ниже:

<script src="{% static 'assets/js/dashboard.js' %}?{% cache_bust %}" type="text/javascript"></script>

, но она все еще не работалаДо тех пор, пока я не понял, что пользовательские js и css не должны оставаться в static / assets, поскольку Django не будет исследовать какие-либо изменения в этой папке.

Я переместил пользовательский javascript и css из ресурсов, и просто под статической папкой он работает нормально.

Например:

static / assets / js /user -fined.js перейти в static / js / user-defiend.js.

Надеюсь, я ответил на ваш вопрос.

0 голосов
/ 24 мая 2018

Наконец я нашел основную причину.В Django пользовательские файлы javascritpt, css должны находиться в статической папке, а не в static / assets в каждом приложении.

0 голосов
/ 27 мая 2018

Я нашел этот рецепт, как обновить файлы css и js, однако он все еще не работает для меня.Но я думаю, что мне не хватает git или BASE_DIR, потому что он показывает время последнего коммита, а не время последнего локального изменения ...

Если вы не хотите обновлять кэш браузера каждый разВы изменяете свои файлы CSS и JavaScript, или при стилизации изображений вам нужно динамически устанавливать STATIC_URL с изменяющимся компонентом пути.При динамически изменяющемся URL-адресе каждый раз, когда код обновляется, браузер посетителя будет принудительно загружать все новые некэшированные статические файлы.В этом рецепте мы зададим динамический путь для STATIC_URL, когда вы используете систему контроля версий Git.
Подготовка Убедитесь, что ваш проект находится под контролем версии Git, и у вас есть BASE_DIR, определенный в вашемнастройки

Как это сделать ... Процедура установки метки времени Git в настройке STATIC_URL состоит из следующих двух шагов:
1. Добавьте следующее содержимое к misc.pyфайл помещен в utils/: utils/misc.py

import subprocess
from datetime import datetime

def get_git_changeset(absolute_path):
    repo_dir = absolute_path
    git_show = subprocess.Popen(
        'git show --pretty=format:%ct --quiet HEAD',
        stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        shell=True, cwd=repo_dir, universal_newlines=True,
    )
    timestamp = git_show.communicate()[0].partition('\n')[0]
    try:
        timestamp = \
            datetime.utcfromtimestamp(int(timestamp))
    except ValueError:
        return ""
    changeset = timestamp.strftime('%Y%m%d%H%M%S')
    return changeset
Затем импортируйте вновь созданную функцию get_git_changeset () в настройках и используйте ее для пути STATIC_URL следующим образом: settings.py

from utils.misc import get_git_changeset STATIC_URL = "/static/%s/" % get_git_changeset(BASE_DIR)

Как это работает…
Функция get_git_changeset() принимает каталог absolute_path в качестве параметра и вызывает команду оболочки git show с параметрами, чтобы показать метку времени Unix ревизии HEAD в каталоге.Как указано в предыдущем рецепте, мы передаем функцию BASE_DIR, поскольку мы уверены, что она находится под контролем версий.Временная метка анализируется;преобразуется в строку, состоящую из года, месяца, дня, часа, минут и секунд;вернулся;и включен в определение STATIC_URL.
(c) Аидас Бендорайтис - Веб-разработка с кулинарной книгой Django, 2-е издание, стр. 21. - 2016.

ОБНОВЛЕНИЕ
И, наконец, я нашел рабочий код после этого вопроса.

import os
def get_file_changeset(absolute_path):
    timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static_polo'))))
    try:
        timestamp = datetime.utcfromtimestamp(int(timestamp))
    except ValueError:
        return ""
    changeset = timestamp.strftime('%Y%m%d%H%M%S')
    return changeset

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

0 голосов
/ 23 мая 2018

Я использовал Safari, чтобы открыть этот проект, измененный файл все еще не может быть загружен.это немного странноВ начале дня я думал о проблеме с браузером, но сейчас она определенно исходит от Django.Я не знаю, это связано с конфигурацией или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...