Django 不会刷新静态文件
Django won't refresh staticfiles
我在 django 模板上引用了一个 JavaScript 文件:
<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还是老样子。然后我删除了对login.js
文件的引用,把所有js里面的script标签都放在了HTML里,当然新的语句出现了。然后我包含login.js
文件,注释掉html里面的js但是我删除了login.js
文件里面的所有内容,使它成为一个空文件......但是老话还在出现了。
因此旧的 login.js
文件必须在我不知道的地方兑现。然后我打开 Chrome 并再次尝试,同样的问题。
它可以是什么?是否有强制 Django 刷新静态文件的选项?我认为重新启动服务器就足够了。我应该重新启动计算机吗?
要刷新静态文件,您应该再次 运行 python manage.py collectstatic
。
听起来您的两个浏览器都缓存了 javascript 文件。在 Chrome 中,您可以通过按 Ctrl
+ Shift
+ Del
并勾选 'Cached images and files' 来清除缓存。 Firefox 可能有类似的快捷方式。
您可以查看 this question 有关在开发服务器上完全禁用静态文件缓存的提示。
正在清除静态文件python manage.py collectstatic --noinput --clear
。这将事先清除静力学。
清除浏览器缓存
在每次加载 js 文件后添加一个随机字符串,例如 jquery.js?rand=23423423
。
如果没有别的办法,在项目中搜索文件名,寻找意外的副本。如果您在某个时候保存到错误的位置(不同的应用程序),或者从旧的应用程序中分离出一个新的应用程序,加载优先级可能会欺骗您。
我也为这个问题苦苦挣扎了几个小时。我曾尝试使用 Javascript 注入随机字符串,但这种方法看起来很愚蠢而且 ugly-looking。处理此问题的一种可能方法是引入自定义标记。有关详细信息,请参阅此 document:
具体来说,您需要在您创建的任何应用程序中创建一个名为 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 文件时在 chrome 中使用隐身模式或在 firefox 中使用隐私浏览,以便在页面刷新后立即看到它们
您需要清除浏览器缓存。此模板标签将在 DEBUG=True
时输出基于时间的 uuid。否则它将查找 PROJECT_VERSION
环境变量。如果找不到,它将输出一个静态版本号。
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 文件时,请在模板中更改此版本,这样浏览器将被强制重新加载文件。
如果你出于某种未知原因想要完全避免缓存,你可以使用当前时间戳而不是版本:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
如果您不想在每次更改 CSS 和 JavaScript 文件或设置图像样式时刷新浏览器缓存,您需要 STATIC_URL
动态设置一个变化的路径组件。随着动态变化 URL,每当代码更新时,访问者的浏览器将强制加载全新的未缓存静态文件。在本节中,我们将使用 os.
中的最后编辑时间为 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)
工作原理:
get_file_changeset()
函数将 absolute_path
目录作为参数,并调用 os.path.getmtime()
到每个嵌套目录中的每个文件,并找到最后编辑的文件(及其最大编辑时间)。解析时间戳;转换为由年、月、日、时、分、秒组成的字符串;回来;并包含在 STATIC_URL
.
的定义中
注意:有了这个,你每次编辑静态文件时都必须重新加载开发服务器。
一种解决方案是将设置更改为以下内容:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
这样做是创建静态文件的副本,文件名中包含内容哈希(当 运行 collectstatic
时)。这样,当内容更改时,文件名也会更改,并且不会使用旧缓存。唯一的问题是它在 DEBUG = True
模式下不会被使用,因此您必须进行 shift-reload 才能进行硬重新加载。
您可以阅读 docs on ManifestStaticFilesStorage 了解更多信息。
编辑: 我找到了一个 solution for making sure static files are not cached in dev 并将其发布在另一个问题上。
对我来说,在重新收集静态文件后,只是为我反映了更改。
$ 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
硬刷新浏览器,这应该适用于所有浏览器。
"静态文件的更改不起作用"。这可能有多种原因。
您的浏览器是 storing cache
个静态文件。
解决方法(1):打开Incognito/Private window
解决方法(2):使用硬刷新:
- 对于mac:
cmd + shift + r
- 对于其他人:
ctr + shift + r
如果您在生产中遇到此问题,请按照以下步骤操作:
通过以下命令删除 staticfiles
文件夹:
sudo rm -rf staticfiles
[在你的项目目录中]
现在运行collectstatic
命令:python3 manage.py collectstatic
通过以下命令重新启动 gunicorn
:sudo systemctl restart gunicorn
通过以下命令重新启动 nginx
:sudo systemctl restart nginx
有时浏览器会将这些静态文件数据(作为缓存)存储一段时间。几个小时后,问题可能会消失。
希望这能解决您的问题。
我今晚正在追逐 css 静态文件更改。通过 Django 教程。
我的 Django html 页面不会将更新后的 css 显示到我的 base.css 文件中。
我会看到原来的 base.css 但我对 file.This 的更新不是在开发环境中。
我不认为 django 在开发中缓存了静态,并且只有在 运行 在生产中 coll 欣喜若狂。
为了快速解决问题,我更改了测试站点的名称。 base.css 文件到 base1.css 和 html 页面 link 到 base1.css
重新加载页面和我更新的 css 生效。没有最佳解决方案。但快速修复。
对于 window 用户,ctrl+f5 在开发服务器上完成工作,如果这不起作用,则使用命令 python manage.py collectstatic 可以正常工作 其他某些答案中提到的方法确实有风险,因此最好备份静态文件。
首先 运行 python manage.py collectstatic --link -l
然后 python manage.py collectstatic
不要使用 python manage.py collectstatic --noinput --clear
它会降低你的服务器。
我在 django 模板上引用了一个 JavaScript 文件:
<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还是老样子。然后我删除了对login.js
文件的引用,把所有js里面的script标签都放在了HTML里,当然新的语句出现了。然后我包含login.js
文件,注释掉html里面的js但是我删除了login.js
文件里面的所有内容,使它成为一个空文件......但是老话还在出现了。
因此旧的 login.js
文件必须在我不知道的地方兑现。然后我打开 Chrome 并再次尝试,同样的问题。
它可以是什么?是否有强制 Django 刷新静态文件的选项?我认为重新启动服务器就足够了。我应该重新启动计算机吗?
要刷新静态文件,您应该再次 运行 python manage.py collectstatic
。
听起来您的两个浏览器都缓存了 javascript 文件。在 Chrome 中,您可以通过按 Ctrl
+ Shift
+ Del
并勾选 'Cached images and files' 来清除缓存。 Firefox 可能有类似的快捷方式。
您可以查看 this question 有关在开发服务器上完全禁用静态文件缓存的提示。
正在清除静态文件
python manage.py collectstatic --noinput --clear
。这将事先清除静力学。清除浏览器缓存
在每次加载 js 文件后添加一个随机字符串,例如
jquery.js?rand=23423423
。
如果没有别的办法,在项目中搜索文件名,寻找意外的副本。如果您在某个时候保存到错误的位置(不同的应用程序),或者从旧的应用程序中分离出一个新的应用程序,加载优先级可能会欺骗您。
我也为这个问题苦苦挣扎了几个小时。我曾尝试使用 Javascript 注入随机字符串,但这种方法看起来很愚蠢而且 ugly-looking。处理此问题的一种可能方法是引入自定义标记。有关详细信息,请参阅此 document:
具体来说,您需要在您创建的任何应用程序中创建一个名为 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 文件时在 chrome 中使用隐身模式或在 firefox 中使用隐私浏览,以便在页面刷新后立即看到它们
您需要清除浏览器缓存。此模板标签将在 DEBUG=True
时输出基于时间的 uuid。否则它将查找 PROJECT_VERSION
环境变量。如果找不到,它将输出一个静态版本号。
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 文件时,请在模板中更改此版本,这样浏览器将被强制重新加载文件。
如果你出于某种未知原因想要完全避免缓存,你可以使用当前时间戳而不是版本:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
如果您不想在每次更改 CSS 和 JavaScript 文件或设置图像样式时刷新浏览器缓存,您需要 STATIC_URL
动态设置一个变化的路径组件。随着动态变化 URL,每当代码更新时,访问者的浏览器将强制加载全新的未缓存静态文件。在本节中,我们将使用 os.
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)
工作原理:
get_file_changeset()
函数将 absolute_path
目录作为参数,并调用 os.path.getmtime()
到每个嵌套目录中的每个文件,并找到最后编辑的文件(及其最大编辑时间)。解析时间戳;转换为由年、月、日、时、分、秒组成的字符串;回来;并包含在 STATIC_URL
.
的定义中
注意:有了这个,你每次编辑静态文件时都必须重新加载开发服务器。
一种解决方案是将设置更改为以下内容:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
这样做是创建静态文件的副本,文件名中包含内容哈希(当 运行 collectstatic
时)。这样,当内容更改时,文件名也会更改,并且不会使用旧缓存。唯一的问题是它在 DEBUG = True
模式下不会被使用,因此您必须进行 shift-reload 才能进行硬重新加载。
您可以阅读 docs on ManifestStaticFilesStorage 了解更多信息。
编辑: 我找到了一个 solution for making sure static files are not cached in dev 并将其发布在另一个问题上。
对我来说,在重新收集静态文件后,只是为我反映了更改。
$ 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
硬刷新浏览器,这应该适用于所有浏览器。
"静态文件的更改不起作用"。这可能有多种原因。
您的浏览器是
storing cache
个静态文件。解决方法(1):打开
Incognito/Private window
解决方法(2):使用硬刷新:
- 对于mac:
cmd + shift + r
- 对于其他人:
ctr + shift + r
- 对于mac:
如果您在生产中遇到此问题,请按照以下步骤操作:
通过以下命令删除
staticfiles
文件夹:sudo rm -rf staticfiles
[在你的项目目录中]现在运行
collectstatic
命令:python3 manage.py collectstatic
通过以下命令重新启动
gunicorn
:sudo systemctl restart gunicorn
通过以下命令重新启动
nginx
:sudo systemctl restart nginx
有时浏览器会将这些静态文件数据(作为缓存)存储一段时间。几个小时后,问题可能会消失。
希望这能解决您的问题。
我今晚正在追逐 css 静态文件更改。通过 Django 教程。 我的 Django html 页面不会将更新后的 css 显示到我的 base.css 文件中。
我会看到原来的 base.css 但我对 file.This 的更新不是在开发环境中。
我不认为 django 在开发中缓存了静态,并且只有在 运行 在生产中 coll 欣喜若狂。
为了快速解决问题,我更改了测试站点的名称。 base.css 文件到 base1.css 和 html 页面 link 到 base1.css
重新加载页面和我更新的 css 生效。没有最佳解决方案。但快速修复。
对于 window 用户,ctrl+f5 在开发服务器上完成工作,如果这不起作用,则使用命令 python manage.py collectstatic 可以正常工作 其他某些答案中提到的方法确实有风险,因此最好备份静态文件。
首先 运行 python manage.py collectstatic --link -l
然后 python manage.py collectstatic
不要使用 python manage.py collectstatic --noinput --clear
它会降低你的服务器。