Django's docs on testing tools mention both the @override_settings and the @modify_settings decorators for usage in tests, but it is unclear from the docs (at least to me) what is the difference between them.
So, what is it?
override_settings
will completely change the object stored in side the setting. That is, the original value will be destroyed. modify_settings
will modify the existing object in place. This works by taking the append
, prepend
, and remove
parameters. The object you're seeing in the documentation is not the MIDDLEWARE
object, it's a list of steps to perform on the MIDDLEWARE
object to modify 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 yields 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_settings
would require the entire resulting object above.
The problem here is obvious. If we change the original MIDDLEWARE
settings in settings.py
, we will have to update our test. If we use modify_settings
, we would likely still be good to go.
I agree that the docs aren't clear because it doesn't really make it clear that 'append'
is a special keyword, for example.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With