Ответ 1
Вам может быть интересно это решение; использует execfile() для загрузки ряда файлов настроек по порядку, где каждый файл имеет полный доступ к настройкам из ранее загруженных файлов, для обновления, изменения и т.д.
При установке нового приложения django вам необходимо добавить/изменить свой модуль settings.py.
Для проекта я пытаюсь сделать этот модуль подпакетом python и создать модуль для каждого приложения:
settings\
__init__.py
base.py
admin.py
feincms.py
...
Проблема, с которой я столкнулся, заключается в том, как объединить атрибуты settings.py(INSTALLED_APPS, например, является кортежем значений), которые получают значения в разных подмодулях?
Спасибо
Хорошо, я задал неправильный вопрос (получил правильный ответ). Мой вопрос должен был быть, как получить атрибуты от всех подмодулей и объединить их? Django импортирует настройки и ожидает, что все будет там.
Вам может быть интересно это решение; использует execfile() для загрузки ряда файлов настроек по порядку, где каждый файл имеет полный доступ к настройкам из ранее загруженных файлов, для обновления, изменения и т.д.
"Когда вы устанавливаете новое приложение django, вам нужно добавить/изменить ваш модуль settings.py."
Я думаю, что все в порядке.
Я не вижу причин изменять или изменять это вообще.
Однако мы делаем это для "подкласса" основного модуля настроек.
Наши специфичные для разработчиков и файлы, относящиеся к установке, имеют такие имена, как settings_devxy_linux2
и settings_checkout_win32
и т.д.
Каждый из этих файлов начинается с from settings import *
, чтобы импортировать основные настройки и расширить эти основные настройки с помощью переопределений для конкретной установки и платформы.
Это не требует никакой реальной работы. Это, однако, означает, что мы делаем большинство вещей с django-admin.py
, потому что наши настройки не называются settings
.
Я использовал эту работу:
settings.py
INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())
more_settings.py
def modify(settings):
settings['INSTALLED_APPS'] += ('another_app',)
У меня такая же структура файлов настроек, и я делаю следующее, чтобы импортировать настройки подмодулей:
def load_settings_file(file):
file = open(os.path.join(INSTALL_DIR, '<projectname>', 'settings', file + '.py'))
content = file.read()
file.close()
return content
for submodule in ['base', 'admin', 'feincms']:
exec(load_settings_file(submodule))
Я создал https://code.djangoproject.com/wiki/SplitSettings#SettingInheritancewithHierarchy в качестве своего предпочтительного решения. Позволяет наследовать от общего файла в любой среде развертывания.
Предположительно, лучший способ "слить" меняется, атрибуты по атрибутам. Например, учитывая несколько кортежей (из INSTALLED_APPS
различных подмодулей), вы можете просто объединить их в новый кортеж (для атрибута INSTALLED_APPS
пакета в целом) или, если возможно, дублирование является проблемой, поэтому что-то умнее, чтобы удалить дубликаты (в этом случае вам может не нравиться упорядочение, поэтому просто tuple(set(tup1+tup2+tup3))
может быть достаточно).
В других случаях ( "слияние" словарей, "слияние" настроек, которые являются только скалярами или строками и т.д.), вам понадобятся разные стратегии (возможно, последовательные .update
вызовы для словарей, выберите один из них в соответствии с некоторыми критериями для скаляры или строки и т.д. и т.д.). Я просто не вижу здесь подход "одного размера подходит всем".
Если вы предпочитаете больше магии, чем в моем предыдущем подходе more_settings.modify()
, попробуйте следующее:
settings.py
INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())
more_settings.py
def config(INSTALLED_APPS=(), **other_settings):
INSTALLED_APPS += ('another_app',)
del other_settings
return locals()
def modify(settings):
settings.update(config(**settings))
Плюсы: нет необходимости ссылаться на настройки с нотной записью dict
Минусы: должны определять измененные настройки как kwargs для config()
просто поместите
from base import *
from admin import *
...
в ur init.py которые должны работать
Я использовал его для разных сайтов
base/settings.py # common settings: db, apps, ...
base/sites/website1/settings.py # site_id, custom middleware
base/sites/website2/settings.py # site_id, custom middleware
параметры веб-сайта импортируют общие настройки с помощью
from base.settings import *
и определить пользовательские атрибуты