как модулировать django settings.py? - PullRequest
22 голосов
/ 10 января 2010

Когда вы устанавливаете новое приложение django, вы должны добавить / изменить свой модуль settings.py.

Для проекта я пытаюсь сделать этот модуль подпакетом Python и создать модуль для каждого приложения:

settings\
    __init__.py
    base.py
    admin.py
    feincms.py
    ...

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

Спасибо


Хорошо, я задал неправильный вопрос (хотя получил правильный ответ на него). Мой вопрос должен был быть, как получить атрибуты из всех подмодулей и объединить их? Django импортирует настройки и ожидает, что все будет там.

Ответы [ 8 ]

6 голосов
/ 10 января 2010

"Когда вы устанавливаете новое приложение django, вы должны добавить / изменить свой модуль settings.py."

Я думаю, что это нормально, как есть.

Я не вижу причин менять или модифицировать это вообще.

Однако мы делаем «подкласс» модуля основных настроек.

Наши файлы для разработчиков и установки имеют имена, такие как settings_devxy_linux2 и settings_checkout_win32 и т. Д.

Каждый из этих файлов начинается с from settings import * для импорта настроек ядра и расширения этих настроек ядра с помощью переопределений для конкретной установки и платформы.

Это не требует никакой реальной работы. Это, однако, означает, что мы делаем большинство вещей с django-admin.py, потому что наши настройки не называются settings.

5 голосов
/ 10 января 2010

Вас может заинтересовать это решение ; использует execfile () для загрузки последовательности файлов настроек по порядку, где каждый файл имеет полный доступ к настройкам из ранее загруженных файлов, для обновления, изменения и т. д.

4 голосов
/ 18 января 2010

Я использовал этот обходной путь:

settings.py

INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())

more_settings.py

def modify(settings):
    settings['INSTALLED_APPS'] += ('another_app',)
1 голос
/ 16 сентября 2011

Я создал https://code.djangoproject.com/wiki/SplitSettings#SettingInheritancewithHierarchy в качестве моего предпочтительного решения. Позволяет наследовать от общего файла в любой среде развертывания.

1 голос
/ 03 июля 2011

У меня такая же структура файлов настроек, и я делаю следующее для импорта настроек субмодулей:

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))
0 голосов
/ 25 июня 2010

просто положить

from base import *
from admin import *
...

в ур 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 *

и определение пользовательских атрибутов

0 голосов
/ 18 января 2010

Если вы предпочитаете больше магии, чем в моем предыдущем 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))

Плюсы: нет необходимости ссылаться на настройки с условным обозначением

Минусы: необходимо определить измененные настройки как kwargs для config()

0 голосов
/ 10 января 2010

Предположительно лучший способ «слияния» варьируется, атрибуты по атрибутам. Например, учитывая несколько кортежей (из INSTALLED_APPS различных подмодулей), вы можете просто объединить их в новый кортеж (для атрибута INSTALLED_APPS пакета в целом) или, если возможны дублирования, так что что-то умнее, чтобы удалить дубликаты (в этом случае вы можете не заботиться о порядке, поэтому достаточно просто tuple(set(tup1+tup2+tup3))).

Для других случаев («объединение» словарей, «объединение» настроек, которые являются просто скалярами или строками и т. Д.) Вам потребуются разные стратегии (возможно, последовательные .update вызовы словарей, выберите только одну в соответствии с некоторыми скаляры или строки, и т. д., и т. д.) - я просто не вижу работающего здесь подхода «один размер подходит всем».

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