【问题标题】:Does django caches function result in templatesdjango缓存功能是否会导致模板
【发布时间】:2012-12-30 08:05:37
【问题描述】:

我在models.py:

class Team(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()

    a = models.IntegerField()
    b = models.IntegerField()

    def get_stat(self):
        return {
            'xy': self.x + self.y,
            'ab': self.a + self.b
        }

    stat = property(get_stat)

team.html 我有:

xy stat: {{ team.stat.xy }}
ab stat: {{ team.stat.ab }}

问题是:“django 每次我调用stat 时都会执行get_stat 函数还是缓存结果?”

【问题讨论】:

    标签: python django templates caching


    【解决方案1】:

    不,property 不缓存任何结果。

    如果您希望将其缓存以进行大量重复访问,典型的设计模式是:

    def get_stat(self):
        if not hasattr(self, '__get_stat'):
             self.__get_stat =  {
                'xy': self.x + self.y,
                'ab': self.a + self.b
             }
        return self.__get_stat
    

    当然,如果正在做一些奇怪的事情,例如处理已就地修改但未提交到数据库的实例,这将不起作用。我相信 99% 的使用都涉及 DB->Object->Action

    【讨论】:

    • @imkost,没问题,但整数加法并不那么昂贵:D
    • @yuji-tomita-tomita,整数加法只是为了让例子更容易理解
    • @imkost,啊,罗杰。很好的例子。
    【解决方案2】:

    这不是一个具体的答案,因为您已经了解到它没有被缓存,而是一些一般性的建议。通常,确定此类内容是否被缓存(或调用一些随机代码)的方法是在其中添加一些日志记录或调试语句。

    def get_stat(self):
        # logging or debugging statement here, e.g. import ipdb; ipdb.set_trace()
        # for ipdb, you need to pip install ipdb
        return {
            'xy': self.x + self.y,
            'ab': self.a + self.b
        }
    

    您也可以在 django 自己的代码中使用它来查看您的页面被提供时所采用的执行路径。

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-10-25
      相关资源
      最近更新 更多