Django - Lazy使用上下文处理器

时间:2011-02-12 17:56:45

标签: django

我正在开发一个django项目,该项目需要大部分常见的页面数据是动态的。每个页面上显示的内容,例如电话号码,地址,主要联系电子邮件等都需要通过管理面板进行编辑,因此将它们存储在settings.py文件中是行不通的。

为了解决这个问题,我创建了一个自定义上下文处理器,它充当了我的“实时设置”模型的抽象引用。该模型如下所示:

class LiveSetting(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255, blank=False, null=False)
    description = models.TextField(blank=True, null=True)
    key = models.CharField(max_length=100, blank=False, null=False)
    value = models.CharField(max_length=255, blank=True)

上下文处理器就像这样:

from livesettings.models import LiveSetting

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = LiveSetting.objects.get(request)
        setattr(self, val.key, val.value)
        return val.value

l = LiveSettingsProcessor()

def livesetting_processors(request):
    return {'settings':l}

它非常好用,在我的模板中我可以使用{{settings.primary_email}}并从数据库中获取相应的值。

上述代码的问题是它单独处理每个实时设置请求,并且每次在模板中使用{{settings。*}}标记时都会访问数据库。

有没有人知道我是否可以使这个过程变得懒惰,所以不是检索值并返回它,而是更新QuerySet然后在呈现页面之前的一次点击中返回结果?

2 个答案:

答案 0 :(得分:2)

你正试图发明一些复杂的东西,这些都没有理由。像这样简单的东西可以很好地解决你的问题:

def livesetting_processors(request):
    settings = LiveSetting.objects.get(request)
    return {'settings':settings}

编辑:

这是您在当前实施中解决问题的方法:

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = getattr(self, '_settings', LiveSetting.objects.get(request))
        setattr(self, val.key, val.value)
        return val.value

@Hanpan,我已经更新了我的答案,以展示你如何解决你的问题,但我想说的是你想要实现的目标并没有带来任何实际的胜利,但它增加了复杂性您的时间。稍后在所有这些上设置缓存也可能更难。启用缓存后,这根本不会改善性能。

我不知道你以前是否听过这个:过早的优化是邪恶的根源。我认为SO上的这个帖子对于阅读是有用的:https://stackoverflow.com/questions/211414/is-premature-optimization-really-the-root-of-all-evil

答案 1 :(得分:1)

也许你可以试试Django's caching

特别是,您可能需要查看low-level caching feature。看起来这比你计划的工作少得多。