我正在使用Django 1.8,我想在静态文件中添加一个参数来缓存半身像。
这就是我现在正在做的事情,设置一个手动参数:
<link href="{% static 'css/openprescribing.css' %}?q=0.1.1" rel="stylesheet">
但我觉得必须有更好的方法来更新参数。
我想通过模板传递设置会更加简洁(这样可以省去多个地方的更新)。
但是,如果Django可以自动更新它,那将是非常好的。
django-cachebuster上的注释表明现在可以在staticfiles中自动执行此操作,但我在staticfiles文档中找不到任何关于它的内容。
任何人都知道这样做的方法吗?
答案 0 :(得分:13)
是的,这可以通过contrib.staticfiles
自动完成。还有两个额外提供的存储类,它们将使用哈希重命名文件。这些
这里记录了ManifestStaticFilesStorage和CachedStaticFilesStorage
来自文档:
StaticFilesStorage存储后端的子类,它通过将文件内容的MD5哈希附加到文件名来存储它处理的文件名。例如,文件css / styles.css也将保存为css / styles.55e7cbb9ba48.css。
此存储的目的是在某些页面仍然引用这些文件的情况下继续提供旧文件,例如:因为它们是由您或第三方代理服务器缓存的。此外,如果您希望将远期的Expires标头应用于已部署的文件,以加快后续页面访问的加载时间,这将非常有用。
主要区别是
CachedStaticFilesStorage类似于ManifestStaticFilesStorage类,但使用Django的缓存框架来存储已处理文件的散列名称,而不是名为staticfiles.json的静态清单文件。这对于您无权访问文件系统的情况非常有用。
要启用它们,您需要将STATICFILES_STORAGE
设置更改为'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
或'django.contrib.staticfiles.storage.CachedStaticFilesStorage'
。文件名仅在生成DEBUG=False
时更改。
答案 1 :(得分:0)
我只是创建了一个简单的标签来实现这个技巧....
import time
from django import template
register = template.Library()
@register.simple_tag()
def cache_bust():
return int(time.time())
然后在你的模板中做这样的事情......
{% load cache_app %}
<img src="/captcha/?cache_bust={% cache_bust %}" class="captcha"/>
你有缓存破坏简单的方法。
答案 2 :(得分:-1)
我不是缓存方面的专家,但我认为让nginx处理缓存可能比使用Django更好。 Django有很多东西要处理,所以你可以让轻量级静态服务器做那个讨厌的工作。
我不使用cloudflare,但我使用此行缓存我的静态,但是,文件立即更改,Nginx传播最新文件(即同一文件):
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
这是一个片段from this gist我目前正在制作中使用该片段,所以我知道它有效。
我要指出的一件事是,确保MemCached不能正常工作并连接到您的django作为缓存后端。我之所以这么说,是因为我花了好几个小时的时间撞到了墙上,只是因为MemCached用我的每一个内容缓存我的页面长达10分钟。
使用此nginx位置配置,每当我更改.css或上传新文件(静态)时,新文件会立即接管,只要我python manage.py collectstatic
&#39; ed他们进入适当的目录
但我仍然需要纠正,如果那不是实际的部分。
证明以上内容适用于缓存清理(正如您所说)
sudo rm -rf static/
python manage.py collectstatic
Nginx非常聪明,可以缓存你的静态,但是当文件是新文件并重新加载时,会重新加载静态。