首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django -预渲染信号?

Django -预渲染信号?
EN

Stack Overflow用户
提问于 2011-04-07 16:23:14
回答 3查看 622关注 0票数 1

我有一个‘实时设置’的应用程序,我用来存储某些全球网站设置。我的网站的某些页面引用了这些设置,尽管它们通常一次只使用2-3个。我使用自定义模板标记访问这些设置,如下所示:

代码语言:javascript
运行
复制
{% settings site_name %}

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

代码语言:javascript
运行
复制
{% settings site_name %} {% settings num_articles %} 

数据库将被查询两次。

我想要做的是,对于设置值,每个页面不会访问数据库一次以上,如果我可以获得页面上使用的所有设置,然后访问数据库来检索它们,那就更好了。

我看了一下文档,Django似乎没有预渲染信号,我可以使用它来更新对设置的任何引用,所以有没有人有任何建议,我可以如何优化这个系统?是的,显然缓存是显而易见的答案,但我仍然希望在页面不缓存的情况下改进这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-07 16:59:17

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

如果你看一看django-dbsettings,你会发现它做了类似的事情!

票数 1
EN

Stack Overflow用户

发布于 2011-04-07 16:45:43

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-07 17:04:28

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

示例过滤器:

代码语言:javascript
运行
复制
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)

用法:

代码语言:javascript
运行
复制
{# load multiple values with a single call #}
{% with "KEY1,KEY2"|get_settings as settings %}
     setting values {{ settings.KEY1 }} and {{ settings.KEY2 }}
{% endwith %}

请注意,我使用的是过滤器而不是标记,因为with内置函数在as之前只需要一个值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5578051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档