3

我一直在我的 django 应用程序中实现缓存,并通过缓存 API 和模板片段缓存使用每个视图缓存。在我的一些页面上,我使用了一个自定义的 django 模板标签,这个标签是通过第三方开发人员提供的,它在模板标签中接受一些参数,然后向远程服务器发出请求,通过 XML 获取响应,然后然后在我的页面中呈现结果。太好了 - 我认为我可以使用片段缓存轻松缓存它,所以我:

{% load cache %}
{% cache 500 request.user.username %}
{% load third party custom tags %}
{% expensive custom tag set that gets stuff from a third party server via xml %}
{{ some.stuff}}
{% endcache %}

问题是无论我做什么,请求仍然会被发送到远程服务器,似乎 Django 不喜欢缓存这些自定义模板标签。我知道 memcached 运行良好,对于其他视图和模板,一切正常。我在做与片段缓存不兼容的事情吗?有办法绕过吗?

4

4 回答 4

3

如果您尝试缓存的模板片段无法被腌制,memcached 将无法存储它并引发异常。据我所知,渲染 Django 模板时生成的异常被抑制。由于您的自定义标签正在执行 HTTP 请求,因此套接字对象(无法腌制)可能会以某种方式存储到模板片段中。

如果是这种情况,我能想到的唯一解决方法是修改自定义标签以摆脱任何剩余的套接字对象。

于 2009-11-05T10:05:25.533 回答
0

Have you tried to use a different name for the cache fragment? There could be a problem with using request.user.username for a couple of reasons:

  • If a user is not signed in, request.user.username could be empty, resulting in a non-named cache fragment

  • If a user is signed in, this will call the 3rd party template tag at least once for each user every 3 mintues

Maybe it's worth trying to rename the cache fragment name to test:

{% cache 500 customxml %}

I'd also try loading of the 3rd party template tag outside the cache tag like so:

{% load cache third_party_custom_tags %}
{% cache 500 request.user.username %}
{% expensive custom tag set that gets stuff from a third party server via xml %}
{{ some.stuff}}
{% endcache %}

What I'm not sure of is if the cache framework caches the results of a template tag. If that doesn't work, I'd take a look at what the template tag is doing under the hood and re-implement the template tag using Django's low-level cache.

于 2009-10-31T02:58:47.097 回答
0

我认为这与自定义标签无关。

我们最终重写了 Django 缓存标记,因为我们需要比提供的控制更多的控制。您可以自己制作一份副本,并在其中粘贴一些调试打印语句。特别是检查文件名(假设您正在缓存到文件)并查看正在生成的内容。可能是它在不应该改变的时候(出于某种未知原因)而改变,这意味着它总是需要重新渲染然后封闭的块。

查看 django/templatetags/cache.py。它只有 63 行代码。

于 2009-11-03T23:40:42.067 回答
0

正如您所建议的,我认为问题出在自定义标签上。

我不同意 request.user.username 是一个问题,因为该主题的文档实际上给出了这个示例,并且我在测试中将它与内部缓存(例如帖子数)一起使用,并且效果很好.

低级缓存可能很有用,但我会查看您的自定义标签,看看哪些内容不会被缓存。没有代码很难猜测,但我的猜测可能是返回时间或其他变量,导致它强制更新(如果 XML 提取任何更改的数据,Django 可能会强制更新,具体取决于在其他设置上)。我的 Django 缓存结果好坏参半,所以我会查看您的 XML 提要,看看它是否导致任何东西停止缓存。

于 2009-10-31T04:25:43.120 回答