Django无法刷新静态文件

88

我在 Django 模板中引用了一个 JavaScript 文件:

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

我对那个js文件进行了一些更改。然后,我刷新页面,但是我看不到更改发生。
如果我从文件中删除JavaScript并将其放入HTML中,则它可以正常工作,但是如果我尝试使用外部js文件,则不行。我已经尝试关闭服务器并多次运行runserver,还尝试从Firefox更改为Chrome。这完全没有意义。请帮助我理解,虽然我可以在HTML中包含所有js,但我无法以正常方式完成它让我烦恼。
关于此错误的更多详细信息(我发现的最奇怪的事情):
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刷新静态文件?我认为重新启动服务器就足够了。我需要重启电脑吗?

6
你尝试过运行python manage.py collectstatic吗?听起来像是你正在修改工作副本中的JavaScript文件,而它引用了已收集但过期的文件。 - cziemba
33
你尝试过按下Ctrl-F5以清除缓存并刷新页面了吗? - Andrew_Lvov
1
谢谢您的评论和宝贵时间。我已经找到了错误,确实是一个奇怪的错误。我发现Django将本地环境的静态文件指向了我在部署时使用的AWS Bucket。因此...运行collectstatic可能是解决方案的一部分,其余部分是重新配置我的静态文件设置和解决AWS Bucket问题。 - Alejandro Veintimilla
如果您正在使用uwsgi与django,则可能需要重新启动uwsgi以避免提供旧内容。https://dev59.com/jWjWa4cB1Zd3GeqPvfGu#12632061 - Edward Moffett
1
我不确定这是否仍然相关,但在开发环境中如果您设置了staticfiles_dirs而不仅仅是静态根目录,则Django会从_dirs而不是_root中提供静态文件。这就是我的情况所在。如果我在根目录中处理静态文件,则在运行collectstatic之前不会应用任何更改。如果我在_dir中处理静态文件,则Ctrl+F5才会应用更改。 - Greg
18个回答

1
只需运行 python manage.py collectstatic 即可。然后使用 ctrl + F5 强制刷新浏览器,在所有浏览器上都应该有效。

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

接下来在你的设置中进行更改:

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的定义中。

注意:使用此功能时,每次编辑静态文件都必须重新加载开发服务器。


0

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


6
他正在使用runserver运行在开发服务器上。静态文件直接从它们原来的位置加载,因此collectstatic不会改变任何东西。 - knbk

0

如果其他方法都不起作用,可以在项目中搜索文件名并查找意外的副本。如果您曾经保存到错误的位置(不同的应用程序),或者从旧应用程序分离出一个新应用程序,加载优先级可能会对您产生影响。


0

今晚我在追踪CSS静态文件更改。正在进行Django教程。 我的Django HTML页面无法显示对base.css文件的更新。

我只看到原始的base.css,但没有看到我的文件更新。这是在开发环境中。

我认为Django不会在开发环境中缓存静态文件,只有在生产环境中运行coll ecstatic后才会缓存。

为了快速解决问题,我将测试站点的base.css文件名更改为base1.css,并将HTML页面链接更改为base1.css

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


0
对于Windows用户来说,在开发服务器上,使用ctrl+f5可以完成任务。如果这不起作用,那么使用命令python manage.py collectstatic是有效的,否则在一些答案中提到的其他方法真的很危险,所以最好备份您的静态文件。

0

私密标签对我很管用。因此在开发时,我们应该使用私密标签。


-1

你的浏览器会缓存图片和文件(包括 JavaScript)。首先,清除你的缓存图片和文件。然后,在你修改 .js 文件时,使用 Chrome 的无痕模式或 Firefox 的私密浏览模式,这样在页面刷新后就可以立即看到更改后的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接