Django的@override_settings确实允许没有字典?

问题描述 投票:7回答:2

我是新来的Python装饰所以也许我失去了一些东西简单,这里是我的情况:

这对我的作品:

def test_something(self):
    settings.SETTING_DICT['key'] = True #no error
    ...

但是,这将引发“语法错误:关键字不能是一个表达式”:

@override_settings(SETTING_DICT['key'] = True) #error
def test_something(self):
   ...

只要是明确的,正常使用的替代设置工作:

@override_settings(SETTING_VAR = True) #no error
def test_something(self):
   ...

有没有办法使用与设置字典装饰的方式,还是我做错了什么?

提前致谢!

python django unit-testing testing django-settings
2个回答
12
投票

你应该覆盖整个字典:

@override_settings(SETTING_DICT={'key': True})
def test_something(self):
   ...

或者,你可以使用override_settings作为一个上下文管理器:

def test_something(self):
     value = settings.SETTING_DICT
     value['key'] = True
     with override_settings(SETTING_DICT=value):
         ...

0
投票

我不想要么覆盖整个字典,所以我复制有问题的字典从settings对象并修改我感兴趣的属性:

import copy
from django.conf import settings

settings_dict = deepcopy(settings.SETTINGS_DICT)
settings_dict['key1']['key2'] = 'new value'

@override_settings(SETTINGS_DICT=settings_dict)
def test_something(self):
    pass

它适合我的目的,但如果你想使这个更广泛的使用,你可以写一些参数可能做这样的事情动态短的功能。

注:我尝试使用settings.SETTINGS_DICT.copy()deepcopy(settings.SETTINGS_DICT)代替,但似乎在全球范围内覆盖所有测试设定...

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.