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

Как модулировать django settings.py?

При установке нового приложения django вам необходимо добавить/изменить свой модуль settings.py.

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

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

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

Спасибо


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

4b9b3361

Ответ 1

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

Ответ 2

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

Я думаю, что все в порядке.

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

Однако мы делаем это для "подкласса" основного модуля настроек.

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

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

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

Ответ 3

Я использовал эту работу:

settings.py

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

more_settings.py

def modify(settings):
    settings['INSTALLED_APPS'] += ('another_app',)

Ответ 4

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

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))

Ответ 6

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

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

Ответ 7

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

Ответ 8

просто поместите

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 *

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