姜戈不会刷新静态文件

我有一个在 django 模板上引用的 JavaScript 文件:

 <script src="{% static 'js/login.js' %} "></script>

我对那个 js 文件做了一些修改,然后刷新页面,看不到修改发生。

如果我从文件中删除 JavaScript 并将其放入 HTML 中,那么它会正常工作,但是如果我尝试使用外部 js 文件,那么它就不会正常工作。我试过关闭服务器和运行运行服务器好几次,我也试过从 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 仍然显示旧的句子。然后,我删除了对 login.js文件的引用,并将所有 js 放在 HTML 中的 script 标记中,当然,会出现新的句子。然后我包含 login.js文件,注释掉 html 中的 js,但是我删除了 login.js文件中的所有内容,使其成为一个空文件... ... 但是旧的句子仍然出现。

因此旧的 login.js文件必须在我不知道的地方兑现。然后我打开 Chrome,再试一次,同样的问题。

会是什么呢?是否有强制 django 刷新 staticfiles 的选项?我以为重启服务器就够了。我应该重新启动我的电脑吗?

105932 次浏览

要刷新静态文件,应该再次运行 python manage.py collectstatic

听起来你的两个浏览器都缓存了 javascript 文件。在 Chrome 中,你可以通过按 Ctrl + Shift + Del并点击“缓存图片和文件”来清除缓存。Firefox 可能也有类似的快捷方式。

您可以看看 这个问题中关于禁用开发服务器上静态文件缓存的提示。

  • 清除静态文件 python manage.py collectstatic --noinput --clear。这将事先清除静态文件。

  • 清除浏览器缓存

  • 在 js 文件 include 之后添加一个随机字符串,例如 jquery.js?rand=23423423,每次加载。

如果没有其他工作,搜索项目中的文件名并查找意外的副本。如果你保存到了错误的位置(不同的应用程序) ,或者从旧的应用程序中分离出一个新的应用程序,加载优先级可能会欺骗你。

我也为这个问题挣扎了好几个小时。我曾经尝试用 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)

然后您可以使用标记 {% static_no_cache '.../.../path...' %}来创建一个路径与随机参数!

希望这个能帮上忙!

您的浏览器将缓存图像和文件(包括 javascript)。首先,只清除缓存的图像和文件。然后使用匿名模式在铬或私人浏览火狐,而你正在进行更改您的。Js 文件,所以在页面刷新后可以立即看到它们

你得破解浏览器缓存。此模板标记将在 DEBUG=True时输出基于时间的 uuid。否则,它将寻找一个 ABc1环境变量。如果没有找到,它将输出一个静态版本号。

import os
import uuid
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"/>

不需要使用复杂的解决方案,您可以向模板中的包含添加额外的参数。

静态包括:

<script src="{% static 'js/polls/polls.js' %}?version=1"></script>

直接服务包括:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />

注意代码中的 ?version=1。每次修改 css/js 文件时,在模板中更改这个版本,这样浏览器将被迫重新加载该文件。

如果出于某种未知的原因想要避免缓存,可以使用当前时间戳代替 version:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />

如果您不想在每次更改 CSS 和 JavaScript 文件时或在设计图像样式时刷新浏览器缓存,则需要使用可变路径组件动态设置 STATIC_URL。对于动态更改的 URL,每当代码更新时,访问者的浏览器都会强制加载全新的未缓存静态文件。在这个菜谱中,我们将使用操作系统中最后一次编辑的时间为 STATIC_URL设置一个动态路径。< br > < br >

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)

工作原理:
get_file_changeset()函数将 absolute_path目录作为参数,并将 os.path.getmtime()调用到每个嵌套目录中的每个文件,并找到最后编辑的文件(其最大编辑时间)。时间戳被解析; 转换为由年、月、日、小时、分钟和秒组成的字符串; 返回; 并包含在 STATIC_URL的定义中。< br > < br > 注意: 使用这种方法,每次编辑静态文件时,都必须重新加载 dev 服务器。

一种解决方案是将设置更改为:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

这样做的目的是创建一个静态文件的副本,在文件名中包含一个内容散列(在运行 collectstatic时)。这样,当内容被更改时,文件名被更改,旧的缓存将不会被使用。唯一的问题是,它没有得到使用时,在 DEBUG = True模式,所以你必须做一个移位重新加载做一个硬重新加载。

你可以阅读 ManifestStaticFilesStorage 上的文档了解更多信息。

编辑: 我找到了一个 解决方案,以确保静态文件不缓存在开发并把它贴在了另一个问题上。

对我来说,重新收集静态文件后,只是变化反映给我。

$ python manage.py collectstatic --noinput --clear

现在运行您的服务器,希望它能正常工作。

$ python manage.py runserver

一个简单的方法摆脱,做一个硬刷新 cmd+shift+r/ctr+shift+r

硬刷新是为特定页面清除浏览器缓存的一种方法,强制它加载页面的最新版本。 浏览器 cmd+shift+r/ctr+shift+r

只要运行 python manage.py collectstatic就可以了。然后用 ctrl + F5硬刷新浏览器,这样就可以在所有浏览器上工作了。

静态文件的更改不起作用”可能有很多原因。

  1. 您的浏览器是静态文件的 storing cache

    解决方案(1) : 打开 Incognito/Private window

    解决方案(2) : 使用硬刷新:

    • 对于 mac: cmd + shift + r
    • 其他: ctr + shift + r
  2. 如果你在生产中遇到了这个问题,那么按照下面的步骤:

    • 通过以下命令删除 staticfiles文件夹: sudo rm -rf staticfiles[在您的项目目录中]

    • 现在运行 collectstatic命令: python3 manage.py collectstatic

    • 通过以下命令重新启动 gunicorn: sudo systemctl restart gunicorn

    • 通过以下命令重新启动 nginx: sudo systemctl restart nginx

有时浏览器会将静态文件数据(作为缓存)存储一段时间,几个小时后问题可能就解决了。

希望这能解决你的问题。

今晚我在追踪一个 CSS 静态文件的修改,正在看一个 Django 教程。 我的 Django html 页面不会在 base.css 文件中显示更新后的 css。

我会看到原始的 base.css,但是没有看到对文件的更新。

我不认为 django 缓存静态开发,只有在运行 coll 狂喜的生产。

为了快速解决这个问题,我更改了测试站点的名称。Css 文件到 base1.css,html 页面链接到 base1.css

重新加载的页面和我更新的 CSS 生效。没有最好的解决方案。但快速修复。

对于一个窗口用户来说,ctrl + f5在开发服务器上完成这项工作,如果这不起作用,那么使用命令 python management. py Collectstatic 就可以了。有些答案中提到的其他方法也是有风险的,所以最好备份你的静态文件。

首先运行 python manage.py collectstatic --link -l然后 python manage.py collectstatic不要使用 python manage.py collectstatic --noinput --clear它将带来你的服务器。