在Django应用程序中共享信息

时间:2018-04-10 17:53:12

标签: python django

我有一个非常简单的模型,其中包含我需要在我的应用程序的不同位置使用的数据:

class Setting(models.Model):
    name = models.CharField()
    value = models.TextField()

我希望能够将这些信息加载到字典中,然后将这些数据传送到我的应用程序中,这样我就不必对数据库进行重复调用。我这样做的尝试是将逻辑包装在一个类似的模块中(print语句用于调试):

my_settings.py

from myapp import models
class Settings:
    __settings = {}

    def __init__(self):
        if(not self.__class__.__settings):
            print("===== Loading settings from table =====")
            qs = models.Setting.objects.all()
            for x in qs:
                self.__class__.__settings[x.name] = x.value

    def get(self, key, default=None):
        return self.__class__.__settings.get(key, default)

    def getint(self, key, default=0):
        return int(self.__class__.__settings.get(key, default))

使用此模块将如下所示:

from my_settings import Settings

# Down in some view somewhere...
settings = Settings()
data = settings.get("some_key")

...

# Now we might be in a helper function somewhere, but still in the
# same view context as above. Note that we should not have made
# a database round trip here; we're using our memory store instead.
settings = Settings()
data = settings.get("another_key")

这似乎工作正常,但它的缺点是数据在初始实例化时被加载一次(并且只加载一次)。如果设置数据库表中的任何数据发生更改,则这些更改不会反映在此类持有的相应字典中。

这里有更好的方法吗?我不介意每个请求都有一个数据库查询,但我也不想在函数之间传递字典。我希望一个模块级的包装器能让我获得我所希望的“单身” - 但它显然比我想象的更积极地缓存事物。

1 个答案:

答案 0 :(得分:0)

我不会担心它,一旦你投入生产,你可以使用cachalot进行全面缓存,或者为这个模型编写自己的粗略缓存。