这很烦人。我在django模板上引用了一个javascript文件:
<script src="{% static 'js/login.js' %} "></script>
我对该js文件进行了一些更改。然后,我刷新页面,我看不到发生的变化。
如果我从文件中删除javascript并将其放入HTML中,它可以正常工作,但如果我尝试使用外部js文件,那么它不会。我试过关闭服务器并多次运行runserver,我也尝试过从Firefox更改为Chrome。这根本没有意义。请帮助我理解,我可以在HTML中包含所有js,但是让我感到困扰的是我不能以正常的方式做到这一点。
有关此错误的更多详细信息(我发现的#$&amp;%#weirdest事件):
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中的脚本标记内,当然,出现了新的句子。然后我包含login.js文件,注释掉html里面的js但我删除了login.js文件中的所有内容,使其成为一个空文件......但是旧句子仍然显示出来。因此旧的login.js文件必须在我不知道的地方兑现。然后我打开Chrome并再次尝试,同样的问题。
它能是什么?有强制django刷新静态文件的选项吗?我以为重启服务器就足够了。 ..我应该重启我的电脑吗? :/ lol。
答案 0 :(得分:41)
清除静态文件python manage.py collectstatic --noinput --clear
。这将事先清除静电。
清除浏览器缓存
在js文件包含后添加一个随机字符串,例如jquery.js?rand = 23423423,每次加载。
有帮助吗?
答案 1 :(得分:21)
听起来你的浏览器都缓存了javascript文件。在Chrome中,您可以按Ctrl
+ Shift
+ Del
并仅勾选'缓存的图片和文件'来清除缓存。 Firefox可能有类似的快捷方式。
您可以查看this question有关在开发服务器上完全禁用静态文件缓存的提示。
答案 2 :(得分:15)
您需要破坏浏览器缓存。此模板标记将在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"/>
答案 3 :(得分:6)
“ 更改静态文件无效”。可能有多种原因。
您的浏览器是您静态文件的storing cache
。
解决方案(1):打开Incognito/Private window
解决方案(2):使用强制刷新:
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
有时浏览器会在一定时间内存储这些静态文件数据(作为缓存)。几个小时后,问题可能会消失。
希望这可以解决您的问题。
答案 4 :(得分:2)
我也在这个问题上挣扎了好几个小时。我试图使用Javascript注入随机字符串,但这种方法看起来很愚蠢。处理此问题的一种可能方法是引入自定义标记。有关详细信息,请参阅此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...' %}
来创建具有随机参数的路径!
我希望这会有所帮助!
答案 5 :(得分:1)
您可以在模板中为包含添加额外参数,而不是使用复杂的解决方案。
对于静态包括:
<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" %}" />
答案 6 :(得分:1)
一种简单的摆脱方法,进行一次硬刷新cmd+shift+r/ctr+shift+r
硬刷新是一种清除特定页面的浏览器缓存,以强制其加载页面最新版本的方法。
在浏览器cmd+shift+r/ctr+shift+r
答案 7 :(得分:1)
只需运行python manage.py collectstatic
就可以解决问题。然后使用ctrl + F5
强制刷新浏览器,该浏览器应可在所有浏览器上使用。
答案 8 :(得分:0)
要刷新静态文件,您应该再次运行python manage.py collectstatic
。
答案 9 :(得分:0)
如果没有其他工作,请在项目中搜索文件名并查找意外副本。如果您在某个时间点保存到错误的位置(不同的应用程序),或者从旧的应用程序中分离出新的应用程序,那么加载优先级可能会对您起作用。
答案 10 :(得分:0)
如果您不想在每次更改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
的定义中。
注意:这样,每次编辑静态文件时都必须重新加载dev服务器。
答案 11 :(得分:0)
一种解决方案是将设置更改为以下内容:
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,并将其发布在另一个问题上。
答案 12 :(得分:0)
对我来说,重新收集静态文件后,Just Changes会为我反映出来。
$ python manage.py collectstatic --noinput --clear
现在运行服务器,希望它能工作。
$ python manage.py runserver
答案 13 :(得分:0)
今晚我一直在追寻CSS静态文件的更改。通过Django教程。 我的Django html页面不会在我的base.css文件中显示更新的css。
我会看到原始的base.css,但没有看到我的文件更新。这是在开发环境中
我不认为django仅在生产环境中运行coll ecstatic时才在dev上缓存静态。
为了快速解决此问题,我更改了测试站点的名称。将base.css文件更改为base1.css,并将html页面链接至base1.css
重新加载的页面和我更新的CSS生效。没有最好的解决方案。但快速修复。
答案 14 :(得分:0)
对于窗口用户,ctrl+f5 在开发服务器上完成这项工作,如果这不起作用,那么使用命令 python manage.py collectstatic 正在工作,其他一些答案中提到的其他方式确实有风险,所以最好备份您的静态文件。
答案 15 :(得分:-1)
您的浏览器将缓存图像和文件(包含javascript)。首先,清除缓存的图像和文件。然后在对.js文件进行更改时使用chrome中的隐身模式或Firefox中的隐私浏览,以便在页面刷新后立即看到它们