我有一个“实时设置”应用,用于存储某些全局网站设置。我网站的某些页面引用了这些设置,但通常它们一次只使用2-3个。我使用自定义模板标记访问这些设置,如下所示:
{% settings site_name %}
每次我使用这个标签时,模型都会从数据库中检索设置,所以如果我有类似的东西:
{% settings site_name %} {% settings num_articles %}
数据库将被查询两次。
我想做的是,如果我可以获取页面上使用的所有设置,然后点击数据库以检索所有设置值,那么每个页面的设置值不会多次访问数据库,这将是多少更好。
我查看了文档,看来Django没有预渲染信号,我可以使用它来更新对设置的任何引用,所以有人有任何建议我如何优化这个系统?是的,显然缓存是明显的答案,但我还是希望在没有缓存页面时对此进行改进。
答案 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
之前的单个值。