python - 在 django 中为静态文件分配版本号以避免缓存的最简单方法?
问题描述
我想在静态文件上引入版本控制,这样浏览器就不会缓存它们,因为我会经常进行更改。所以目前在我的index.html
,我打电话给我的两个文件index.css
,index.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.py
urls.py
assign_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
我已经确认是否在重新启动时调用此模板。更改js
或css
重新启动似乎也不会强制浏览器获取新文件。我究竟做错了什么?
解决方案
首先请注意,模板标签与 . 一起使用{% 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”。