python - el libro de django 2.0 pdf
Configuración de django por aplicación-¿Mejor práctica? (2)
Esto está algo relacionado con esta pregunta.
¿Por qué la configuración de django es un objeto LazyObject?
En mi proyecto django tengo varias aplicaciones. Cada aplicación puede tener su propio archivo de configuración no trivial.
proj/
proj/
settings.py
app/
settings.py
views.py
¿Cuál es la mejor práctica general aquí?
debe app / settings.py hacer
from django.conf import settings
APP_SETTING= lambda: settings.getattr(''APP_SETTING'', ''custom_value'')
PROJ_SETTING= lambda: settings.PROJ_SETTING
y luego en app / views.py do
import .settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
¿O debería modificar el objeto de configuración perezosa de django en app / settings.py según el estilo de codificación de django?
from django.conf import settings
# not even sure how I would check for a default value that was specified in proj/settings.py
settings.configure(APP_SETTING=''custom_value'')
y luego, cada aplicación / views.py solo consume proj / settings.py a través de la configuración de django.conf?
from django.conf import settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
Obviamente hay muchas otras permutaciones, pero creo que mi intención es clara.
Gracias por adelantado.
La solución más sencilla es usar el getattr(settings, ''MY_SETTING'', ''my_default'')
que mencionas. Sin embargo, puede ser un poco tedioso tener que hacer esto en múltiples lugares.
Recomendación adicional: use un prefijo por aplicación como MYAPP_MY_SETTING
.
Sin embargo, hay una aplicación django que se deshace de getattr
y maneja el prefijo por ti. Ver http://django-appconf.readthedocs.org/en/latest/
Normalmente creas un conf.py
por aplicación con contenidos como este:
from django.conf import settings
from appconf import AppConf
class MyAppConf(AppConf):
SETTING_1 = "one"
SETTING_2 = (
"two",
)
Y en tu código:
from myapp.conf import settings
def my_view(request):
return settings.MYAPP_SETTINGS_1 # Note the handy prefix
En caso de que necesite personalizar la configuración en su sitio, todo lo que necesita hacer es una entrada regular en la settings.py
su sitio:
MYAPP_SETTINGS_1 = "four, four I say"
No estoy seguro sobre las mejores prácticas, pero no tengo ningún problema con el siguiente estilo:
proj / settings.py
OPTION_A = ''value''
# or with namespace
APP_NAMESPACE = ''APP''
APP_OPTION_B = 4
app / settings.py
from django.conf import settings
from django.utils.functional import SimpleLazyObject
OPTION_A = getattr(settings, ''OPTION_A'', ''default_value'')
# or with namespace
NAMESPACE = getattr(settings, APP_NAMESPACE, ''APP'')
OPTION_B = getattr(settings, ''_''.join([NAMESPACE, ''OPTION_B'']), ''default_value'')
OPTION_C = getattr(settings, ''_''.join([NAMESPACE, ''OPTION_C'']), None)
if OPTION_C is None:
raise ImproperlyConfigured(''...'')
# lazy option with long initialization
OPTION_D = SimpleLazyObject(lambda: open(''file.txt'').read())
app / views.py
from .settings import OPTION_A, OPTION_B
# or
from . import settings as app_settings
app_settings.OPTION_C
app_settings.OPTION_D # initialized on access