What is the difference between override_settings and modify_settings in Django?

Django docs on the testing tools mention both @override_settings and @modify_settings decorators for use in tests, but it is not clear from the documents (at least for me) what the difference is between them.

So what is it?

+4
source share
1 answer

override_settingscompletely change the object stored on the installation side. That is, the original value will be destroyed. modify_settingswill change an existing object in place. This works using parameters append, prependand remove. The object that you see in the documentation is not an object MIDDLEWARE, it is a list of steps that you must follow for the object MIDDLEWAREto change it. For example, given the following MIDDLEWARE, defined in 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',
]

If you use:

@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',
    ],
})

It gives the final settings:

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'
]

The same result with override_settingswill require the entire resulting object above.

The problem is obvious. If we change the initial settings MIDDLEWAREin settings.py, we will have to update our test. If we use modify_settings, we will probably still be fine.

, , , 'append' , .

+4

Source: https://habr.com/ru/post/1672726/


All Articles