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