Django的docs on testing tools提到了@override_settings和@modify_settings修饰符用于测试,但是从文档(至少对我来说)来看它们之间有什么区别是不清楚的。
那么,它是什么?
答案 0 :(得分:8)
override_settings
将完全更改存储在设置旁边的对象。也就是说,原始值将被销毁。 modify_settings
将修改现有对象。这可以通过获取append
,prepend
和remove
参数来实现。您在文档中看到的对象不是MIDDLEWARE
对象,它是在MIDDLEWARE
对象上执行以修改它的步骤列表。例如,给定MIDDLEWARE
中定义的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',
]
如果您使用:
@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',
],
})
它产生最终设置:
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'
]
与override_settings
相同的结果将需要上面的整个结果对象。
这里的问题很明显。如果我们更改MIDDLEWARE
中的原始 settings.py
设置,我们将不得不更新我们的测试。如果我们使用modify_settings
,我们可能仍然会很高兴。
我同意文档不明确,因为它并没有真正说明'append'
是一个特殊的关键字,例如。