Pregunta ¿Cuál es la diferencia entre override_settings y modify_settings en Django?


Django's documentos sobre herramientas de prueba mencionar los decoradores @override_settings y @modify_settings para su uso en las pruebas, pero no está claro desde el documento (al menos para mí) cuál es la diferencia entre ellos.

¿Así que qué es lo?


8
2018-03-20 14:07


origen


Respuestas:


override_settings cambiará por completo el objeto almacenado en el lado de la configuración. Es decir, el valor original será destruido. modify_settings modificará el objeto existente en su lugar. Esto funciona tomando el append, prependy remove parámetros. El objeto que está viendo en la documentación no es el MIDDLEWARE objeto, es una lista de pasos para realizar en MIDDLEWARE objeto para modificarlo. Por ejemplo, dado el siguiente MIDDLEWARE definido en settings.py:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Si utiliza:

@modify_settings(MIDDLEWARE={
    'append': 'django.middleware.cache.FetchFromCacheMiddleware',
    'prepend': 'django.middleware.cache.UpdateCacheMiddleware',
    'remove': [
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    ],
})

Otorga la configuración final:

MIDDLEWARE=[
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware'
]

El mismo resultado con override_settings requeriría todo el objeto resultante arriba.

El problema aquí es obvio. Si cambiamos el original  MIDDLEWARE ajustes en settings.py, tendremos que actualizar nuestra prueba. Si usamos modify_settings, probablemente todavía estaríamos bien para irnos.

Estoy de acuerdo en que los documentos no son claros porque realmente no deja claro que 'append' es una palabra clave especial, por ejemplo.


7
2018-03-20 14:10