我有一个‘实时设置’的应用程序,我用来存储某些全球网站设置。我的网站的某些页面引用了这些设置,尽管它们通常一次只使用2-3个。我使用自定义模板标记访问这些设置,如下所示:
{% settings site_name %}每次我使用这个标记时,模型都会从数据库中检索设置,所以如果我有这样的设置:
{% settings site_name %} {% settings num_articles %} 数据库将被查询两次。
我想要做的是,对于设置值,每个页面不会访问数据库一次以上,如果我可以获得页面上使用的所有设置,然后访问数据库来检索它们,那就更好了。
我看了一下文档,Django似乎没有预渲染信号,我可以使用它来更新对设置的任何引用,所以有没有人有任何建议,我可以如何优化这个系统?是的,显然缓存是显而易见的答案,但我仍然希望在页面不缓存的情况下改进这一点。
发布于 2011-04-07 16:59:17
同意丹尼尔的观点,process_template_response就是你要找的钩子。我不知道你有多少设置,但一次检索所有设置,并将它们存储在类似字典的结构中也是有意义的,这样你就可以在不访问数据库的情况下随时访问它们。您可以在每个请求中检索它们一次,或者在django初始化时检索它们-即使您的设置几乎没有更改。您还可以使用django的信号在删除或更新时更新缓存的设置。
如果你看一看django-dbsettings,你会发现它做了类似的事情!
发布于 2011-04-07 16:45:43
Django 1.3包含了新的TemplateResponse类,它允许您稍后在渲染过程中修改响应-例如在middleware中。这看起来像是你想要的。
发布于 2011-04-07 17:04:28
如果您希望坚持使用与已有方案类似的方案,我将实现一个过滤器,该过滤器接受一个键列表,并返回一个包含所有相关值的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之前只需要一个值。
https://stackoverflow.com/questions/5578051
复制相似问题