¿Cómo modularizar django settings.py?

Cuando instala una nueva aplicación de django, debe agregar / modificar su módulo settings.py.

Para un proyecto, estoy tratando de hacer de ese módulo un subpaquete de python y crear un módulo para cada aplicación:

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

El problema al que me enfrento es cómo fusionar los atributos de settings.py (INSTALLED_APPS, por ejemplo, es una tupla de valores) que obtienen valores en los diferentes submódulos.

Gracias


Ok, hice la pregunta incorrecta (aunque obtuve la respuesta correcta). Mi pregunta debería haber sido, ¿cómo obtener atributos de todos los submódulos y combinarlos? Django importará la configuración y espera que todo esté allí.

Usted podría estar interesado en esta solución ; utiliza execfile () para cargar una serie de archivos de configuración en orden, donde cada archivo tiene acceso completo a la configuración de los archivos cargados anteriormente, para actualizar, modificar, etc.

“Cuando instala una nueva aplicación django, debe agregar / modificar su módulo settings.py”.

Creo que esto está bien como está.

No veo ninguna razón para cambiar o modificar esto en absoluto.

Lo que hacemos, sin embargo, es “subclasificar” el módulo de configuración del núcleo.

Nuestros archivos específicos de desarrollador y de instalación tienen nombres como settings_devxy_linux2 y settings_checkout_win32 , etc.

Cada uno de estos archivos comienza con la from settings import * para importar la configuración central y extender esa configuración central con anulaciones para una instalación y plataforma específica.

No requiere ningún trabajo real. Sin embargo, significa que hacemos la mayoría de las cosas con django-admin.py porque nuestra configuración no se llama settings .

He usado esta solución alternativa:

settings.py :

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

more_settings.py :

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

Tengo la misma estructura de archivos de configuración y hago lo siguiente para importar la configuración de los submódulos:

 def load_settings_file(file): file = open(os.path.join(INSTALL_DIR, '', 'settings', file + '.py')) content = file.read() file.close() return content for submodule in ['base', 'admin', 'feincms']: exec(load_settings_file(submodule)) 

Creé https://code.djangoproject.com/wiki/SplitSettings#SettingInheritancewithHierarchy como mi solución preferida. Permite la herencia de un archivo común en cualquier entorno de implementación.

Presumiblemente, la mejor manera de “fusionar” varía, atributos por atributos. Por ejemplo, dadas varias tuplas (de INSTALLED_APPS de varios submódulos), puede simplemente concatenarlas en una nueva tupla (para el atributo INSTALLED_APPS del paquete en su totalidad), o, si es posible, las duplicaciones son un problema, por lo que es más inteligente elimine las duplicaciones (en este caso es posible que no le importe el pedido, por lo que puede bastar con una tuple(set(tup1+tup2+tup3)) ).

Para otros casos (“fusionar” diccionarios, “fusionar” configuraciones que son solo escalares o cadenas, etc.) necesitará diferentes estrategias (tal vez sucesivas .update exija los diccionarios, elija solo uno de acuerdo con algunos criterios para los escalares o cadenas , etc., etc.) – Simplemente no veo un enfoque de “talla única” que funcione aquí.

Si prefieres más magia que en mi more_settings.modify() anterior de more_settings.modify() , prueba esto:

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

Pros: no hay necesidad de referirse a configuraciones con notación de dictado

Contras: debe definir la configuración modificada como kwargs para config()

sólo hay que poner

 from base import * from admin import * ... 

en ur init .py que debería funcionar

Lo usé para diferentes sitios

 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 

la configuración del sitio web importa la configuración común con

 from base.settings import * 

y definir atributos personalizados