Как сделать некоторые настройки Django доступными для персонала? - PullRequest
9 голосов
/ 02 декабря 2009

В Django настройки хранятся в файле settings.py. Этот файл является частью кода и входит в хранилище. Только разработчики имеют дело с этим файлом. Администратор имеет дело с моделями, данными в базе данных. Это данные, которые редактируют сотрудники, не занимающиеся разработкой, и посетители сайта видят их в виде шаблонов.

Дело в том, что наш сайт и многие другие имеют множество настроек, которые должны редактировать сотрудники, не являющиеся разработчиками. Мы говорим об отдельных константах всего сайта, которым действительно нет места в базе данных. Помещение их в базу данных приведет к многочисленным бессмысленным запросам. Кэширование может облегчить это, но это кажется излишне сложным для обработки того, что можно сделать с помощью одной строки в файле settings.py.

Я заметил это приложение dbsettings , но оно старое и не поддерживается. Я также заметил, что приложение электронной коммерции django, Satchmo, включает в себя разветвление для конкретного варианта использования этого приложения dbsettings. Мы могли бы встроить нечто похожее в наш сайт, приложение, которое хранит некоторые настройки в виде пар ключ / значение в одной таблице базы данных, но на самом деле это кажется неправильным подходом. Зачем помещать что-то в БД, которое там не принадлежит, просто чтобы его было легче редактировать не разработчикам?

У нас есть список общесистемных настроек на нашем сайте Django, которые мы хотим редактировать администраторам, не являющимся разработчиками. Как лучше всего это сделать?

Ответы [ 4 ]

6 голосов
/ 02 декабря 2009

Что-то вроде dbsettings (как вы упомянули) похоже на путь. Из причин существования для этого проекта:

Не все настройки принадлежат settings.py, так как у него есть некоторые Особые ограничения:

  • Настройки для всего проекта. Это не только требует приложений, чтобы загромождать settings.py, но также увеличивает шансы присвоения имен конфликты.

  • Настройки постоянны на протяжении всего экземпляра Django. Они не могут быть изменено без перезапуска приложения.

  • Для настройки требуется программист. Это правда даже если настройка ни на что не влияет функционально.

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

6 голосов
/ 02 декабря 2009

Я на самом деле большой поклонник dbsettings, и продолжаю иметь смысл публиковать мой форк, исправляющий его для работы с Django 1.1 (на самом деле не большое изменение) . Похоже, кто-то уже обновил его .

Однако вы, вероятно, правы, что это излишне для того, что вам нужно. Одна вещь, которую я сделал раньше, - это добавление в конец файла settings.py строки, которая импортирует и анализирует файл YAML. YAML - это простой язык разметки, который по своей сути является просто KEY: VALUE ...

CONSTANT1: MyValue
CONSTANT2: Anothervalue

Если вы поместите это куда-нибудь, редакторы смогут получить к нему доступ, тогда в конце settings.py вы просто сделаете:

import yaml
try:
    globals().update(yaml.load(open('/path/to/my/yaml/file.yml')))
except:
    pass

Вам понадобится библиотека Python YAML для анализа файла YML.

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

Отредактировано для добавления Не составит особого труда создать интерфейс, который мог бы редактировать этот файл, и предоставить кнопку, которая запускает скрипт для перезапуска Apache.

1 голос
/ 02 декабря 2009

Если вам необходимо избежать перезапуска сервера, то логичным местом для настроек является база данных, как сказали Доминик и Даниэль, но вам нужно будет аннулировать кэшированный объект настроек при каждом его обновлении.

Похоже, можно переустанавливать значения в кеше с помощью низкоуровневого API кеширования Django . Все, что вы хотите, должно быть достигнуто с помощью этих вызовов:

 cache.set('settings', local_settings)
 cache.add('settings', local_settings)
 local_settings = cache.get('settings')
 cache.delete('settings')
0 голосов
/ 02 декабря 2009

Как насчет размещения sitesettings.py (или чего-либо еще) где-нибудь, к которому ваши администраторы могут получить доступ, тогда в settings.py do

from sitesettings import *

Это кажется хорошим и простым, но я, возможно, неправильно понял или упростил вашу проблему:)

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