Где хранить настройки в приложении Django? - PullRequest
1 голос
/ 12 августа 2011

Я хочу иметь возможность изменять некоторые настройки, определенные в файле settings.py во время выполнения. Изменения также должны быть сохранены (после перезапуска сервера). Я нашел https://github.com/jabapyth/django-appsettings, но ему не хватает поддержки массивов и кортежей. Есть что-то лучше?

1 Ответ

3 голосов
/ 12 августа 2011

Настройки не должны изменяться во время выполнения.

Это может привести к проблемам с потоками и несоответствиям, так как они загружаются при запуске каждым рабочим при инициализации, поэтому вы изменяете их в одном процессе, а другие не имеют обновленного значения.

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.

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...