Django不会刷新静态文件

时间:2015-01-12 21:30:43

标签: django django-staticfiles

这很烦人。我在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。

16 个答案:

答案 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)

更改静态文件无效”。可能有多种原因。

  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

    • 通过以下命令重新启动gunicornsudo systemctl restart gunicorn

    • 通过以下命令重新启动nginxsudo 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中的隐私浏览,以便在页面刷新后立即看到它们