Хранение важных единичных значений в Django - PullRequest
1 голос
/ 28 декабря 2010

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

Один из способов, которым я могу это сделать, - создать модель, в которой хранятся эти значения, но это звучит как перебор (так как у меня будет только однапример).Другой способ - сохранить эти значения в файле settings.py, но если я захочу изменить их, мне кажется, что мне потребуется перезапустить веб-сервер, чтобы они вступили в силу.Мне было интересно, что будет лучшей практикой в ​​Django для такого рода вещей.

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Вы можете сохранить их в settings.py. Хотя в этом нет ничего плохого (вы даже можете организовать свои настройки в несколько разных файлов, если у вас есть много пользовательских настроек), вы правы, что вы не можете изменить их во время выполнения.

Мы решали ту же проблему, где я работал, и придумали простое приложение под названием django-constance (вы можете получить его из github по адресу https://github.com/comoga/django-constance).. Это позволяет хранить ваши настройки в settings.py, но как только вам нужно превратить их в параметры, настраиваемые во время выполнения, вы можете переключиться на хранилище данных Redis с помощью интерфейса администратора django. Вы даже можете использовать значение из параметров по умолчанию. Я предлагаю вам попробовать это приложение.

Изменения в вашем коде довольно минимальны, так как при вставке из документов вы инициализируете свои динамические настройки следующим образом:

CONSTANCE_CONFIG = {
    'MY_SETTINGS_KEY': (42, 'the answer to everything'),
}

И затем вместо импорта настроек из django conf вы делаете следующее:

from constance import config

if config.MY_SETTINGS_KEY == 42:
    answer_the_question()
0 голосов
/ 28 декабря 2010

Если вы хотите, чтобы определенный набор переменных был доступен для всех ваших шаблонов, вам нужны контекстные процессоры.

http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors

Дополнительные ссылки

http://www.b -list.org / блог / 2006 / июнь / 14 / Джанго-подсказка-шаблон-контекстные процессоры / http://blog.madpython.com/2010/04/07/django-context-processors-best-practice/

Код для ваших контекстных процессоров, может жить где угодно в вашем проекте. Вам просто нужно добавить его в файл settings.py под:

TEMPLATE_CONTEXT_PROCESSORS =

Вы можете сохранить свои константы в файле settings.py или даже в файле constants.py и просто

from constants import *

Однако, как вы упомянули, вам нужно будет перезагружать сервер каждый раз, когда обновляются настройки. Я думаю, вам сначала нужно выяснить, как часто вы будете изменять эти настройки? Стоит ли прилагать дополнительные усилия для автоматической перезагрузки настроек?

Если вы хотите автоматически включить настройки, каждый раз, когда они обновляются, вы можете сделать следующее:

  1. Сохранение настроек в БД
  2. После сохранения / изменения записать вывод в файл
  3. settings.py / constants.py читает файлы
  4. перезагрузить сервер

Кроме того, вы посмотрите на мезонинный проект , который позволяет вам обновлять настройки из интерфейса администратора django и также перезагружается.

См .: http://mezzanine.jupo.org/docs/configuration.html

Если переменные, которые вам нужны, будут обновляться нечасто, я предлагаю просто сохранить их в settings.py и добавить собственный процессор контекста.

Если вы используете систему контроля версий, такую ​​как GIT , обновление будет довольно простым, вы можете просто обновить файл и отправить его на свой сервер. Для действительно простой перезагрузки сервера вы также можете создать ловушку после получения для git, которая будет автоматически перезагружать сервер при нажатии нового кода.

Я бы предложил другой вариант, только если вы обновляете настройки довольно регулярно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...