Django 德扬戈元';刷新静态文件

Django 德扬戈元';刷新静态文件,django,django-staticfiles,Django,Django Staticfiles,这很烦人。我在django模板上引用了一个javascript文件: <script src="{% static 'js/login.js' %} "></script> 因此,我更改了js并重新启动了服务器,但html仍然显示了旧的句子。然后我删除了对login.js文件的引用,并将所有的js-inside脚本标记放在HTML中,当然,新的句子出现了。然后我包括login.js文件,注释掉html中的js,但我删除了login.js文件中的所有内容,使其成为一个空

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

 <script src="{% static 'js/login.js' %} "></script>
因此,我更改了js并重新启动了服务器,但html仍然显示了旧的句子。然后我删除了对login.js文件的引用,并将所有的js-inside脚本标记放在HTML中,当然,新的句子出现了。然后我包括login.js文件,注释掉html中的js,但我删除了login.js文件中的所有内容,使其成为一个空文件。。。但这句老话仍然出现了。因此,旧的login.js文件必须在我不知道的地方兑现。然后我打开Chrome,再试一次,同样的问题


可能是什么?是否有强制django刷新静态文件的选项?我觉得重新启动服务器就足够了。。我应该重新启动计算机吗?:/哈哈。

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

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

您可以查看一下在开发服务器上禁用静态文件缓存的提示

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

  • 清除浏览器缓存

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


有帮助吗?

如果没有其他办法,请在项目中搜索文件名并查找意外副本。如果您在某个时候保存到错误的位置(不同的应用程序),或者从旧应用程序中分离出一个新应用程序,则加载优先级可能会对您造成影响。

我也为这个问题挣扎了数小时。我曾尝试使用Javascript注入随机字符串,但这种方法看起来既愚蠢又丑陋。处理此问题的一种可能方法是引入自定义标记。有关详细信息,请参见:

具体来说,您需要在您创建的任何应用程序中创建一个名为
templatetags
的包(如果需要,也可以创建一个新的包)。在这个包中创建任何文件,并编写如下内容:

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.
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)
{% load cache_bust %}

<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
然后您可以使用tag
{%static\u no\u cache'./../path…'%}
创建一个带有随机参数的路径


我希望这会有帮助

您的浏览器将缓存图像和文件(包括javascript)。首先,只清除缓存的图像和文件。然后在chrome中使用隐名模式,或在firefox中使用私人浏览,同时更改.js文件,以便在页面刷新后立即看到它们

您需要关闭浏览器缓存。当
DEBUG=True
时,此模板标记将输出基于时间的uuid。否则,它将查找
PROJECT\u版本
环境变量。如果没有找到,它将输出一个静态版本号

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)
您可以在这样的模板中使用:

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.
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)
{% load cache_bust %}

<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
{%load cache\u bust%}
以下是结果输出:

<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>

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

对于静态,包括:

<script src="{% static 'js/polls/polls.js' %}?version=1"></script>
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />  

如果不想在每次更改CSS和JavaScript文件时或在设置图像样式时刷新浏览器缓存,则需要使用不同的路径组件动态设置
STATIC\u URL
。随着URL的动态变化,每当代码更新时,访问者的浏览器将强制加载所有新的未缓存静态文件。在此配方中,我们将使用操作系统中上次编辑的时间为
静态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\u file\u changeset()
函数将
absolute\u path
目录作为参数,对每个嵌套目录中的每个文件调用
os.path.getmtime()
,并查找最后编辑的文件(及其最大编辑时间)。时间戳被解析;转换为由年、月、日、小时、分钟和秒组成的字符串;返回;并包含在
静态URL
的定义中


注意:每次编辑静态文件时,都必须重新加载dev服务器。

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

STATICFILES\u STORAGE='django.contrib.STATICFILES.STORAGE.ManifestStaticFilesStorage'
这样做的目的是创建静态文件的副本,文件名中包含内容哈希(运行
collectstatic
时)。这样,当内容更改时,文件名将更改,旧缓存将不被使用。唯一的问题是,它在
DEBUG=True
模式下无法使用,因此必须执行shift重载才能执行硬重载

有关更多信息,请阅读


编辑:我找到了一个问题,并将其发布到另一个问题上。

对于我来说,重新收集静态文件后,只是反映了对我的更改

$ 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
就可以了。然后使用
ctrl+F5
硬刷新浏览器,该选项应适用于所有浏览器。

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

  • 您的浏览器正在存储静态文件的缓存

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

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

    • 对于mac:
      cmd+shi