在Django应用程序中存储设置的位置?

时间:2011-08-12 12:33:13

标签: django settings

我希望能够在运行时更改settings.py文件中定义的一些设置。还应保留更改(在服务器重新启动后)。我发现https://github.com/jabapyth/django-appsettings但它缺乏对数组和元组的支持。还有更好的东西吗?

1 个答案:

答案 0 :(得分:3)

设置不应在运行时更改。

执行此操作可能会导致线程问题和不一致,因为每个工作程序在初始化时会加载它们,因此您在一个进程中更改它们,而其他进程没有更新的值。

https://docs.djangoproject.com/en/dev/topics/settings/#altering-settings-at-runtime

修改

如果您设法将这些设置存储到数据模型中,则可以利用低级缓存系统,因此几乎不会发生任何查询,更改unitl数据并手动使这些值无效。请参阅https://docs.djangoproject.com/en/1.3//topics/cache/#the-low-level-cache-api

<强> EDIT2

您可以添加一个非常简单和通用的设置模型,并通过管理界面或其他任何方式进行管理。

class Setting(models.Model):
    name = models.CharField(max_length=100)
    value = models.CharField(max_length=500)
    value_type = models.CharField(max_length=1, choices=(('s','string'),('i','integer'),('b','boolean'))

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    def actual_value(self):
        types = {
            's': str, 
            'i':int, 
            'b': (lambda v: v.lower().startswith('t') or v.startswith('1'))
        }
        return types[self.value_type](self.value)

对于网站范围的设置,请附加到网站模型,针对用户特定设置,附加到用户等。

<强> EDIT3

您可以使用Manager对象返回列表或词组:

class SettingManager(models.Manager):
    def dict_for_object(self, object):
        ct = ContentType.get_for_model(object)
        pk = object.pk
        return dict(self.filter(object_id=pk, content_type__id=ct.id).values_list('name', 'value'))