【问题标题】:Django javascript cannot be loaded after doing changes更改后无法加载 Django javascript
【发布时间】:2018-05-22 20:37:12
【问题描述】:

伙计们

目前,我正在做 Django 网站开发 Django 版本:1.11.13

我在每个应用程序中添加了静态文件夹。 和 DEBUG = True 在 settings.py 中

可以找到静态文件(javascript 和 css),但是当我在 css 中更改/添加内容时,可以重新加载它。但是javascript不能。

我所做的是:

<script src="{% static 'assets/js/dashboard.js' %}?{% cache_bust %}" type="text/javascript"></script>

cache_bust 是模板标签,它将在 js 链接的末尾添加 uuid。 它不适用于在浏览器中重新加载 javascript。

我选择了所有时间来清除浏览器中的缓存。 它不适用于在浏览器中重新加载 javascript。

python manage.py collectstatic,还是不行

只有我能做的就是创建另一个js文件,这个变化可以被浏览器检测到。

我认为这没有意义。你有同样的问题,如何解决?有什么建议吗?

谢谢。

【问题讨论】:

  • 我在使用带有 CSS 文件的 Pycharm IDE 时遇到了类似的问题。对我来说,每次编辑文件时都会帮助重命名文件。但也不知道这里有什么问题。
  • 我将通过查看客户端浏览器调试控制台开始调试。查看应用程序发送的 HTML 输出,然后“清除浏览器缓存”并仔细查看浏览器在加载页面时经历的 HTTP 交换列表。
  • @Chiefir:我也在使用 PyCharm。我已经切换到在 Eclipse 中使用控制台和编辑,问题没有改变。我认为您可能需要在每个静态文件的末尾添加缓存崩溃。让我们来看看它。我研究了一段时间,它适用于某些人,但它不适合我。 github.com/mgrp/django-cachekiller
  • @MikeRobinson 是的,这就是我所做的。我们可以看到django服务器发来的静态文件,javascript文件没有变化,django端已经更新了。

标签: javascript django static


【解决方案1】:

我使用 Safari 打开这个项目,更改的文件仍然无法加载。这有点奇怪。 我早些时候认为是浏览器问题,但现在,它肯定来自 Django。 我不知道它与配置或其他有关。

【讨论】:

    【解决方案2】:

    终于,我找到了根本原因。 在Django中,用户定义的javascritpt、css文件应该在static文件夹下,而不是每个应用程序中的static/assets。

    【讨论】:

    • 你能解释一下你的意思吗?我不能在static 文件夹中嵌套cssjs 文件夹?
    【解决方案3】:

    我找到了如何刷新 css 和 js 文件的方法,但是它仍然对我不起作用。但我认为我缺少 git 或 BASE_DIR 的东西,因为它显示了最后一次提交的时间,而不是最后一次本地更改的时间......

    如果您不想在每次更改 CSS 和 JavaScript 文件时或在设置图像样式时刷新浏览器缓存,则需要使用可变路径组件动态设置 STATIC_URL。使用动态变化的 URL,每当更新代码时,访问者的浏览器将强制加载全新的未缓存静态文件。在这个秘籍中,当您使用 Git 版本控制系统时,我们将为 STATIC_URL 设置一个动态路径。
    准备工作 确保您的项目在 Git 版本控制下,并且您在设置中定义了 BASE_DIR

    怎么做…… 将 Git 时间戳放入 STATIC_URL 设置的过程包括以下两个步骤:
    1、在utils/中放置的misc.py文件中添加如下内容: utils/misc.py

    import subprocess
    from datetime import datetime
    
    def get_git_changeset(absolute_path):
        repo_dir = absolute_path
        git_show = subprocess.Popen(
            'git show --pretty=format:%ct --quiet HEAD',
            stdout=subprocess.PIPE, stderr=subprocess.PIPE,
            shell=True, cwd=repo_dir, universal_newlines=True,
        )
        timestamp = git_show.communicate()[0].partition('\n')[0]
        try:
            timestamp = \
                datetime.utcfromtimestamp(int(timestamp))
        except ValueError:
            return ""
        changeset = timestamp.strftime('%Y%m%d%H%M%S')
        return changeset
    
    1. 然后,在settings中导入新建的get_git_changeset()函数,用于STATIC_URL路径,如下:settings.py

    from utils.misc import get_git_changeset STATIC_URL = "/static/%s/" % get_git_changeset(BASE_DIR)

    它是如何工作的……
    get_git_changeset() 函数以absolute_path 目录为参数,调用带参数的git show shell 命令显示目录中HEAD 修订的Unix 时间戳。如上一节所述,我们将 BASE_DIR 传递给函数,因为我们确信它处于版本控制之下。时间戳被解析;转换为由年、月、日、时、分、秒组成的字符串;回来;并包含在 STATIC_URL 的定义。
    (c) Aidas Bendoraitis - 使用 Django Cookbook 进行 Web 开发,第 2 版,第 21 页。- 2016 年。

    更新
    最后我在this question 之后找到了一个工作代码。

    import os
    def get_file_changeset(absolute_path):
        timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static_polo'))))
        try:
            timestamp = datetime.utcfromtimestamp(int(timestamp))
        except ValueError:
            return ""
        changeset = timestamp.strftime('%Y%m%d%H%M%S')
        return changeset
    

    将其添加给您STATIC_URL,如上所述,并在您每次编辑静态文件时重新加载开发服务器。

    【讨论】:

      【解决方案4】:

      @Chiefir

      我在 tempatetags 中创建了 cache_bust 函数。

      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)
      

      和下面的网址链接:

      <script src="{% static 'assets/js/dashboard.js' %}?{% cache_bust %}" type="text/javascript"></script>
      

      但它仍然没有工作,直到我意识到用户定义的 js 和 css 不应该留在静态/资产下,因为 Django 不会研究这个文件夹下的任何更改。

      我将用户定义的 javascript 和 css 从资产中移出,就在静态文件夹下,它工作正常。

      例如:

      static/assets/js/user-defined.js 移动到 static/js/user-defiend.js。

      希望我回答了你的问题。

      【讨论】:

        猜你喜欢
        • 2017-11-28
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        相关资源
        最近更新 更多