PEP343'带'上下文管理器和django

时间:2013-10-29 07:29:45

标签: python django with-statement contextmanager

我正在使用django框架工作进行一些应用程序测试, 我有一个案例,我测试非活动用户是否可以登录,我喜欢这样

self.testuser.is_active = False
//DO testing
self.testuser.is_active = True
//Proceed 

我的问题是, 通过使用PEP343提供的上下文管理器 我试图这样做,但我失败了

with self.testuser.is_active = False :
//code

然后我试着做

with self.settings(self.__set_attr(self.testuser.is_active = False)):
//code

它也失败了

有办法解决这个问题吗?或者我必须定义一个将is_active设置为false的函数吗?

2 个答案:

答案 0 :(得分:0)

您必须编写自己的上下文管理器。这是针对您的案例(使用contextlib):

import contextlib
@contextlib.contextmanager
def toggle_active_user(user):
    user.is_active = False
    yield
    user.is_active = True

with toggle_active_user(self.testuser):
    // Do testing

更好的方法是先保存状态然后恢复:

import contextlib
@contextlib.contextmanager
def toggle_active_user(user, new_value):
    previous_is_active = user.is_active
    user.is_active = new_value
    yield
    user.is_active = previous_is_active

with toggle_active_user(self.testuser, False):
    // Do testing

答案 1 :(得分:0)

这是一个从contextlib构建的更通用的上下文管理器。

from contextlib import contextmanager

@contextmanager
def temporary_changed_attr(object, attr, value):
    if hasattr(object, attr):
        old = getattr(object, attr)
        setattr(object, attr, value)
        yield
        setattr(object, attr, old)
    else:
        setattr(object, attr, value)
        yield
        delattr(object, attr)

# Example usage
with temporary_changed_attr(self.testuser, 'is_active', False):
    # self.testuser.is_active will be false in here