为什么用@ webapp2.cached_property装饰Jinja2实例

时间:2012-09-05 15:57:21

标签: caching properties jinja2 webapp2

webapp2网站(http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html)有一个关于如何使用webapp2_extras.jinja2的教程,代码如下。

我的问题是:为什么要按webapp2_extras.jinja2.Jinja2缓存return jinja2.get_jinja2(app=self.app)实例返回?我检查了@webapp2.cached_property的代码,发现它将Jinja2实例缓存在BaseHandler的实例中,这个实例将在请求后被销毁,那么为什么还要缓存呢?我在这里错过了什么吗?

import webapp2

from webapp2_extras import jinja2

class BaseHandler(webapp2.RequestHandler):

    @webapp2.cached_property
    def jinja2(self):
        # Returns a Jinja2 renderer cached in the app registry.
        return jinja2.get_jinja2(app=self.app)

    def render_response(self, _template, **context):
        # Renders a template and writes the result to the response.
        rv = self.jinja2.render_template(_template, **context)
        self.response.write(rv)

1 个答案:

答案 0 :(得分:1)

Here您可以找到有关cached_property

的文档

稍后将经常调用BaseHandler类。我的理解是,为了避免每次调用jinja2.get_jinja2(app=self.app)的开销,这种引用仅在第一次进行评估,然后在很多时候返回,即每次调用一个视图时。

要在代码中看到这种情况,请参阅this示例,其中每个视图都来自同一个BaseHandler类。