Django中的override_settings和modify_settings有什么区别?

时间:2017-03-20 14:07:37

标签: python django

Django的docs on testing tools提到了@override_settings和@modify_settings修饰符用于测试,但是从文档(至少对我来说)来看它们之间有什么区别是不清楚的。

那么,它是什么?

1 个答案:

答案 0 :(得分:8)

override_settings将完全更改存储在设置旁边的对象。也就是说,原始值将被销毁。 modify_settings将修改现有对象。这可以通过获取appendprependremove参数来实现。您在文档中看到的对象不是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'是一个特殊的关键字,例如。