Подтвердить что ты не робот

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

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

Как мне это сделать?

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

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

Не могу ли я просто сделать это?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 3

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

import django.conf as conf

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

Ответ 4

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

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

Ответ 5

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

  • MyProject\manage.py

  • django\core\management__init __. py ## method - execute_manager

  • django\conf__init __. py ## class - LazySettings; attr - _wrapped

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

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

from django.conf import settings

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

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

Ответ 6

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

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

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