【问题标题】:Where to store settings in Django application?在 Django 应用程序中存储设置的位置?
【发布时间】:2011-08-12 12:33:12
【问题描述】:

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

【问题讨论】:

    标签: django settings


    【解决方案1】:

    设置不应在运行时更改。

    这样做可能会导致线程问题和不一致,因为它们在初始化时由每个工作人员在开始时加载,因此您在一个进程中更改它们而其他进程没有更新的值。

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

    编辑

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

    编辑 2

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

    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)
    

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

    编辑 3

    您可以使用 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'))
    

    【讨论】:

    • 我不介意不一致,因为我只想更改配额、接受的文件扩展名等。
    • 这正是重点。假设您的 WSGI 服务器有 5 个工作人员,您可能希望通过请求更改您的 QUOTAS 设置。碰巧收到请求的工人可能会兑现您的更改,但其他四名工人不知道更改。最好的方法是更改​​实际设置,然后重新启动整个应用程序。
    • 或者,如果这些设置不被能够重新启动应用程序的人更改,那么它们并不真正属于settings.py 文件。考虑将它们放入您的数据模型中。
    • 有没有办法在 python/django 中定义静态字段?
    • 您不需要静态字段,单行表(一个实例模型)将满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 2010-10-21
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2015-11-24
    相关资源
    最近更新 更多