我正在研究一些通用的静电文件和更新问题的解决方案.

示例:假设有一个站点有/static/styles.css个文件-并且站点被长期使用-所以很多访问者在浏览器中缓存了这个文件

现在我们对这个CSS文件进行了修改,并在服务器上进行了更新,但是一些用户仍然有旧版本(尽管服务器返回了修改日期)

显而易见解决方案是向文件/static/styles.css?v=1.1添加一些版本,但是在这种情况下,开发人员必须跟踪该文件中的变化并手动增加版本

第二种解决方案是计算文件的md5散列,并将其添加到url /static/styels.css/?v={mdp5hashvalue}中,后者看起来更好,但md5应该以某种方式自动计算.

在我看来它们是可能的--创建一些模板标签,如下所示

{% static_file  "style.css" %}

它将呈现

<link src="/static/style.css?v=md5hash">

但是,我不希望这个标记在每次页面加载时都计算MD5,我也不想将散列存储在django-cache中,因为那样我们将不得不在更新文件后清除.

有什么 idea 吗?

推荐答案

Django 1.4现在包括CachedStaticFilesStorage个,它完全满足您的需求(好吧…almost).

因为Django 2.2应该使用ManifestStaticFilesStorage而不是CachedStaticFilesStorage.

你可以在manage.py collectstatic任务中使用它.与往常一样,所有静态文件都是从应用程序中收集的,但是这个存储管理器还会创建每个文件的一个副本,并将MD5哈希附加到文件名中.例如,假设你有一个css/styles.css文件,它也会创建类似css/styles.55e7cbb9ba48.css的东西.

当然,正如您所提到的,问题是您不希望视图和模板总是计算MD5散列来查找要生成的适当URL.解决方案是缓存.好的,您要求不使用缓存的解决方案,对不起,这就是我说almost的原因.但是没有理由拒绝缓存,真的.CachedStaticFilesStorage使用名为staticfiles的特定缓存.默认情况下,它将使用您现有的缓存系统,瞧!但是,如果您不希望它使用您的常规缓存,可能是因为它是分布式内存缓存,并且您希望避免仅仅为了获得静电文件名而进行网络查询的开销,那么您可以为staticfilesRAM设置一个特定的缓存.这比听起来容易多了:看看this excellent blog post个吧.下面是它看起来的样子:

CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
    'LOCATION': '127.0.0.1:11211',
  },
  'staticfiles': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'staticfiles-filehashes'
  }
}

Django相关问答推荐

Django Form标签和action属性

Django allauth 社交帐户注册中邮箱的模板变量

通过get_form_kwargs将请求传递给Django表单未能使表单访问self.request.user.

Django ImproperlyConfigured: AUTH_USER_MODEL指向尚未安装的模型'users.User'

如何在 django 的列表中查找所有对象作为对象?

在 Django 模板中呈现标签名称而不是整数字段

data._mutable= 在 Django REST 框架中为真

使用 args 和选项编写自定义管理命令 - 所需字段说明

关于Django中批量保存对象的问题

PyCharm:强制 Django 模板语法突出显示

当我告诉它时,如何使用 Django 的记录器来记录回溯?

获取结果集中返回的元素数的 django 模板标签是什么?

ModelForm 的 Django TextField max_length 验证

django-rest-framework 如何使模型序列化器字段成为必需

Django:在管理界面中显示图像

使用 Django 1.5 实现多种用户类型

这是验证 Django 模型字段的方法吗?

导入错误无法在windows环境下导入名称execute_manager

如何在该元素中的所有应用程序之间共享元素范围的模板标签

如何从 django 请求中获取完整的 url