Django不会刷新静态文件

Ale*_*lla 42 django django-staticfiles

这很烦人.我在django模板上引用了一个javascript文件:

 <script src="{% static 'js/login.js' %} "></script>
Run Code Online (Sandbox Code Playgroud)

我对那个js文件做了一些更改.然后,我刷新页面,我看不到发生的变化.

如果我从文件中删除javascript并将其放入HTML中,它可以正常工作,但如果我尝试使用外部js文件,那么它不会.我试过关闭服务器并多次运行runserver,我也尝试过从Firefox更改为Chrome.这根本没有意义.请帮助我理解,我可以在HTML中包含所有js,但令我困扰的是,我不能以正常的方式做到这一点.

有关此错误的更多详细信息(我发现的#$&%#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.
Run Code Online (Sandbox Code Playgroud)

所以,我改变了js并重新启动服务器,html仍显示旧句子.然后我删除了对login.js文件的引用,并将所有js放在HTML中的脚本标记内,当然,出现了新的句子.然后我包含login.js文件,注释掉html里面的js但我删除了login.js文件中的所有内容,使其成为一个空文件......但是旧句子仍然显示出来.因此旧的login.js文件必须在我不知道的地方兑现.然后我打开Chrome并再次尝试,同样的问题.

它能是什么?有强制django刷新静态文件的选项吗?我以为重启服务器就足够了...我应该重启我的电脑吗?:/ 大声笑.

Dan*_* Tz 55

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

  • 清除浏览器缓存

  • 在js文件包含后添加随机字符串,例如jquery.js?rand = 23423423,每次加载.

它有帮助吗?

  • 这破坏了我的服务器!它删除了我的整个git存储库.为什么这是选定的答案? (5认同)
  • 我尝试了你的第一个方法,它删除了我所有的静态文件 - .- (3认同)
  • 如何将随机参数添加到<script src ="{%static'js/login.js'%}"> </ script>? (2认同)

knb*_*nbk 22

听起来你的浏览器都缓存了javascript文件.在Chrome中,您可以通过按Ctrl+ Shift+ Del并选中"缓存的图像和文件" 来清除缓存.Firefox可能有类似的快捷方式.

您可以查看有关在开发服务器上完全禁用静态文件缓存的提示的问题.

  • 没办法,作为一个优秀的程序员,你不希望客户以这种方式刷新:( (3认同)

Der*_*old 16

您需要破坏浏览器缓存.此模板标记将在何时输出基于时间的uuid DEBUG=True.否则它将寻找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)
Run Code Online (Sandbox Code Playgroud)

你会在这样的模板中使用:

{% load cache_bust %}

<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
Run Code Online (Sandbox Code Playgroud)

这是结果输出:

<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
Run Code Online (Sandbox Code Playgroud)


Far*_*dLU 9

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

  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

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

希望这会解决您的问题。


The*_*her 8

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

对于静态包括:

<script src="{% static 'js/polls/polls.js' %}?version=1"></script>
Run Code Online (Sandbox Code Playgroud)

对于直接包括:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />  
Run Code Online (Sandbox Code Playgroud)

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

如果您想完全避免出于某种未知原因缓存,您可以使用当前时间戳而不是版本:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
Run Code Online (Sandbox Code Playgroud)


Tim*_*all 6

一种解决方案是将设置更改为以下内容:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)

其作用是创建静态文件的副本,文件名中包含内容哈希(运行时collectstatic)。这样,当内容更改时,文件名也会更改,并且不会使用旧的缓存。唯一的问题是它在模式下不会被使用DEBUG = True,所以你必须进行移位重新加载来进行硬重新加载。

您可以阅读ManifestStaticFilesStorage 上的文档以获取更多信息。

编辑: 我找到了一个确保静态文件不会缓存在开发中的解决方案,并将其发布在另一个问题上。