Django - 预渲染信号?

时间:2011-04-07 08:23:14

标签: django django-templates

我有一个“实时设置”应用,用于存储某些全局网站设置。我网站的某些页面引用了这些设置,但通常它们一次只使用2-3个。我使用自定义模板标记访问这些设置,如下所示:

{% settings site_name %}

每次我使用这个标签时,模型都会从数据库中检索设置,所以如果我有类似的东西:

{% settings site_name %} {% settings num_articles %} 

数据库将被查询两次。

我想做的是,如果我可以获取页面上使用的所有设置,然后点击数据库以检索所有设置值,那么每个页面的设置值不会多次访问数据库,这将是多少更好。

我查看了文档,看来Django没有预渲染信号,我可以使用它来更新对设置的任何引用,所以有人有任何建议我如何优化这个系统?是的,显然缓存是明显的答案,但我还是希望在没有缓存页面时对此进行改进。

3 个答案:

答案 0 :(得分:1)

Django 1.3包含新的TemplateResponse类,它允许您稍后在渲染过程中修改响应 - 例如在middleware中。看起来它可能会做你想要的。

答案 1 :(得分:1)

同意丹尼尔process_template_response是你正在寻找的钩子。我不知道你有多少设置,但是一次检索所有设置也是有意义的,并将它们存储在一些类似字典的结构中,这样你就可以随时访问它们而无需访问数据库。每次请求都可以检索一次,或者 - 即使你的设置几乎没有改变 - 当django初始化时。您还可以使用django的信号来更新删除或更新时的缓存设置。

如果你看一下django-dbsettings,你会看到它做类似的事情!

答案 2 :(得分:0)

如果您希望坚持类似于您已有的方案,我将实现一个过滤器,该过滤器接收一个键列表并返回一个包含所有相关值的dict。

示例过滤器:

def get_settings(key_list):
    # take values from conf.settings. In practice, can be from any source
    return dict((k, getattr(settings, k, None)) for k in key_list.split(","))
register.filter("get_settings", get_settings)

用法:

{# load multiple values with a single call #}
{% with "KEY1,KEY2"|get_settings as settings %}
     setting values {{ settings.KEY1 }} and {{ settings.KEY2 }}
{% endwith %}

请注意,我使用了过滤器而不是标记,因为with内置版需要as之前的单个值。