Django javascript 在进行更改后无法加载



伙计们

目前,我正在做Django网站开发 姜戈版本:1.11.13

我在每个应用程序中添加了静态文件夹。 和 DEBUG = 在 settings.py 中为 True

可以找到静态文件(JavaScript和CSS(,但是当我在CSS中更改/添加内容时,可以重新加载。

我所做的是:

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

cache_bust是模板标签,它将在js链接的末尾添加uuid。它不适用于在浏览器中重新加载JavaScript。

我选择了所有时间来清除浏览器中的缓存。它不适用于在浏览器中重新加载JavaScript。

python manage.py 收集静态,它仍然不起作用

我唯一能做的是创建另一个js文件,浏览器可以检测到此更改。

我认为这没有意义。 你有同样的问题吗,如何解决? 有什么建议吗?

谢谢。

我正在使用Safari打开这个项目,但仍然无法加载更改的文件。 这有点奇怪。 我在当天早些时候想到的是浏览器问题,但现在,它肯定来自 Django。 我不知道它与配置或其他内容有关。

最后,我找到了根本原因。 在 Django 中,用户定义的 javascritpt 文件,css 应该在静态文件夹下,而不是每个应用程序中的静态/资产。

我找到了这个食谱如何刷新 css 和 js 文件,但它仍然对我不起作用。但我认为我缺少 git 或BASE_DIR一些东西,因为它显示了上次提交的时间,而不是上次本地更改的时间......

如果您不想在每次更改 CSS 和 JavaScript 文件时或在设置图像样式时刷新浏览器缓存,则需要使用不同的路径组件动态设置STATIC_URL。使用动态更改的URL,每当代码更新时,访问者的浏览器都会强制加载全新的未缓存静态文件。在此配方中,我们将在您使用 Git 版本控制系统时为STATIC_URL设置动态路径。
做好准备确保你的项目在 Git 版本控制下,并且你BASE_DIR在你的设置中进行了指定

怎么做...将 Git 时间戳放入STATIC_URL设置的过程包括以下两个步骤:
1. 将以下内容添加到放置在utils/中的misc.py文件中: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
  1. 然后,在设置中导入新创建的 get_git_changeset(( 函数,并将其用于STATIC_URL路径,如下所示:设置.py

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

它是如何工作的...
get_git_changeset()函数将 absolute_path 目录作为参数,并调用带有参数的 git show shell 命令,以显示目录中 HEAD 修订版的 Unix 时间戳。如前面的配方中所述,我们将BASE_DIR传递给函数,因为我们确信它受版本控制。解析时间戳;转换为由年、月、日、小时、分钟和秒组成的字符串;返回;并包含在 STATIC_URL的定义。
(c( Aidas Bendoraitis-使用Django Cookbook进行Web开发,第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将其添加到您,并在每次编辑静态文件时重新加载开发服务器。

@Chiefir

我在临时标签中创建了cache_bust函数。

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)

和网址链接如下:

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

但它仍然不起作用,直到我意识到用户定义的 js 和 css 不应该留在静态/资产下,因为 Django 不会研究此文件夹下的任何更改。

我将用户定义的 javascript 和 css 从资产中移出,就在静态文件夹下,它工作正常。

例如:

static/assets/js/user-defined.js移动到static/js/user-defiend.js。

希望我回答了你的问题。

面临同样的问题。我的 CSS 和 js 文件在进行一些更改后无法正常工作。 因此,对我有用的事情是更改文件名(CSS或JS不起作用(,并在您调用该文件的地址内更改文件的名称。它会起作用。