it-swarm.com.ru

Изменение настроек Django во время выполнения

Я хотел бы предоставить некоторые (специфичные для приложения) настройки интерфейсу администратора, чтобы пользователи могли их удобно менять, а также не нужно перезапускать Django.

Как я должен идти об этом?

Я проверил приложения на http://djangopackages.com/grids/g/live-setting/ (кстати, Django-constance был самым привлекательным), но на самом деле все эти приложения делают хранение значений в базе данных. предоставление веб-интерфейса для их изменения и кэширование. Разве первые две функции уже не встроены в Django?

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

Разве я не могу просто сделать это?

  1. Создайте модель для моих настроек (это дает мне различные типы и проверку)
  2. Создайте один такой объект для хранения моих настроек (это позволяет пользователям редактировать их в интерфейсе администратора) - я могу сбросить настройки по умолчанию, как и для других моделей.
  3. Заверните файл settings.py, чтобы он выполнял запрос базы данных для моих настроек - http://www.loose-bits.com/2011/04/extending-Django-settings-with-derived.html

С моей нынешней наивной точки зрения единственными недостатками, которые я вижу, являются:

  1. Добавление или изменение доступных настроек требует переноса схемы (на юг). - Я могу жить с этим.
  2. У меня есть модель с несколькими экземплярами, но мне нужен только синглтон. - Это может быть полезной функцией в какой-то момент.
  3. Производительность/Кэширование: Глядя на http://code.djangoproject.com/svn/Django/trunk/Django/conf/ мне нужно было бы добавить немного хитрости в оболочку настроек и/или модель, так что модель меняет очистить или обновить кэшированные значения. - не похоже на ракетостроение.
  4. Выполнение того же в другом проекте потребует аналогичных усилий снова. - Я думаю, что единственная словарная константа в settings.py, содержащая названия моделей и имена полей для поиска, - это все, что будет отличаться.

Разве это не лучшее из обоих миров - администратор времени выполнения (со всеми его привилегиями), серверная часть базы данных, кэширование и ни одна из моих настроек .USED_TO_BE_IN_SETTINGS_DOT_PY не потребует каких-либо изменений. Я что-то пропустил?

41
Danny W. Adair

AFAIK, настройки Django должны быть неизменными. Для этого есть несколько причин, наиболее очевидным из которых является то, что Django не знает о модели выполнения сервера (prefork/multi-thread).

Кроме того, вы не можете загрузить сами настройки из модели Django, потому что настройки должны быть загружены, прежде чем вы сможете использовать что-либо в ORM.

Итак, в принципе, у вас есть два решения:

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

Первый - невероятный взлом, и я не предлагаю этого. Второе намного более прямое и понятное, но требует от вас изменения привычных привычек (from Django.conf import settings).

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

16
André Caron
9
Chuck

DATABASES является диктатом. Таким образом, вы можете манипулировать, как словарь:

import Django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
6
arannasousa

Честно говоря, я получаю больше Джанго, когда анализирую его код. В версии 1.4.5 сделал это (следуя модулю ниже):

  • myProject\manage.py

  • Django\core\management__init __. Py ## метод - execute_manager

  • Django\conf__init __. Py ## class - LazySettings; attr - _wrapped

  • Django\utils\functions.py ## class LazyObject; важный метод - new_method_proxy

Функциональный вариант, но у него есть свои риски. В питоне "_" считает атрибут защищенным.

from Django.conf import settings

settings._wrapped.INSTALLED_APPS = () ## *really work*

В следующем проекте: https://github.com/alexsilva/DJPlugins Вы можете видеть, как эта переменная изменяется во время выполнения. Идея проекта уже работает.

2
alex

Посмотрите: https://bitbucket.org/bkroeze/Django-livesettings * Django-Livesettings - это проект, отделенный от Satchmo Project_. Он обеспечивает возможность настройки параметров через интерфейс администратора, а не путем редактирования «settings.py». *

Может быть, это может быть полезно для вас.

2
raphaelwct

Вы можете использовать рекомендованный метод .configure() модуля settings:

from Django.conf import settings
settings.configure(DEBUG=True)

Модуль settings имеет дополнительные удобные функции. Проверьте документы .

1
Fusion