Изменение настроек Django во время выполнения - PullRequest
43 голосов
/ 30 июня 2011

Я хотел бы предоставить некоторые (специфичные для приложения) настройки интерфейсу администратора, чтобы пользователи могли их удобно менять, а также не нужно было перезапускать 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-производный.html

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

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

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

Ответы [ 6 ]

17 голосов
/ 30 июня 2011

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

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

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

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

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

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

9 голосов
/ 11 мая 2016
6 голосов
/ 02 марта 2013

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

import django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
2 голосов
/ 30 мая 2013

Честно говоря, я получаю больше Джанго, когда анализирую его код. В версии 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 голосов
/ 21 декабря 2012

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

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

1 голос
/ 19 декабря 2018

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

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

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

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