首页 > 解决方案 > 在 django 中为静态文件分配版本号以避免缓存的最简单方法?

问题描述

我想在静态文件上引入版本控制,这样浏览器就不会缓存它们,因为我会经常进行更改。所以目前在我的index.html,我打电话给我的两个文件index.cssindex.js就像这样

{% extends "base.html" %} {% load staticfiles %}

<link rel="stylesheet" href="{% static 'css/index.css' %}">

<script type="text/javascript" src="{% static 'js/index.js' %}"></script>

现在我想引入版本控制,这样当我用一些更改更新文件时,浏览器就会强制获取最新的文件。当然,这并不意味着它应该总是获取新文件,而是当我要求它时。

所以要做到这一点,我需要注册一个模板标签。所以我创建了一个名为的文件夹并将其保存在我和templatetags所在的同一级别。(将其保存在其他地方 Django 会引发错误)。我将文件命名为. 这是文件里面的内容models.pyurls.pyassign_version.py

import time
from django import template

register = template.Library()

@register.simple_tag
def static_version():
        print("version changed!!")
        version = int(round(time.time() * 1000))
        return version

templatetags文件夹看起来像

assign_version.py  assign_version.pyc  __init__.py  __init__.pyc

现在我改变我index.html的引用这两个标签像这样

{% extends "base.html" %} {% load staticfiles %} {% load assign_version %}

<link rel="stylesheet" href="{% static 'css/index.css' %}?v={{ static_version }}"> 

<script type="text/javascript" src="{% static 'js/index.js' %}?v={{ static_version }}"></script>

然后我重新启动我的服务器。但什么也没有发生。我没有看到print我已经确认是否在重新启动时调用此模板。更改jscss重新启动似乎也不会强制浏览器获取新文件。我究竟做错了什么?

标签: pythondjangocachingdjango-templates

解决方案


首先请注意,模板标签与 . 一起使用{% your_tag %},而不与{{ your_tag }}. 所以{{ static_version }}在你的模板中用 {% static_version %} 替换。

但是,由于每次 django 从您的模板生成 html 页面时都会使用该标签,因此每次加载页面时都会将新的“版本”放入您的页面中。所以你可能不会达到你想要的效果。

如果您想在每次重新启动服务器时节省时间,我能想到的一种方法是AppConfig在您的apps.py. 它在应用程序重新加载时调用。所以也许是这样的:

在您assing_version.py添加变量“版本”作为“全局”变量并将其用作您的版本:

#assign_version.py

import time
from django import template

register = template.Library()

version = 0

@register.simple_tag
def static_version():
    print("version changed!!")

    return version

在你的 apps.py 中设置版本

from django.apps import AppConfig

import time

from . templatetags import assign_version

class YourappConfig(AppConfig):
    name = 'yourapp'

    def ready(self):
        assign_version.version = int(round(time.time() * 1000))

为此,您需要使用“yourapp.apps.YourappConfig”加载您的应用程序,settings.py而不仅仅是“yourapp”。


推荐阅读