我有一个带有修饰方法(MyModel)的Django模型(my_method)。我希望装饰人员在my_method上执行一些检查:
逻辑如下:
# models.py
class MyModel(models.Model):
@decorator1
@decorator2
def my_method(self, request, *args, **kwargs):
return u'The result that must be returned if all the checks performed by the decorator succeed'
# decorators.py
from functools import wraps
# decorator1 checks if certain conditions are met. If yes, it returns the decorated method (method_to_decorate); if not, it returns a tuple
def decorator1(method_to_decorate):
@wraps(method_to_decorate)
def wrapper1(self, request, *args, **kwargs):
if a_condition :
return method_to_decorate(self, request, *args, **kwargs)
else:
# we return a failure message
return ('failure', 'message')
return wrapper1
# in decorator2, we want to know if the check performed by decorator1 was successful
# in case of success, we perform decorator2's check
# in case of failure, decorator2 should simply pass the failure message returned by decorator1
def decorator2(method_to_decorate):
@wraps(method_to_decorate)
def wrapper2(self, request, *args, **kwargs):
# if the first decorator succeeded
if decorator1_s_test_was_successful:
# we check if the conditions of the second decorator are met
if decorator2_s_test_was_successful:
# we return the method
return method_to_decorate(self, request, *args, **kwargs)
else:
# we return a failure message
return ('another failure', 'message')
# if the first decorator did not succeed
else: # decorator1 returned a tuple : ('failure', 'message')
return the_failure_that_decorator1_returned
return wrapper2因此,如果an_instance_of_my_model_instance.my_method(request)返回一个失败,我希望decorator1返回(' failure ','message')。如果decorator1成功了,但decorator2没有成功,我会期待(‘另一个失败’,'message')。如果所有的测试都通过了,那么如果装潢工执行的所有检查都成功的话,必须返回的结果。
如果装饰1的检查成功通过,我不知道如何签入decorator2。我试图通过检查method_to_decorate在decorator2中的类型()来完成它,但似乎类型使用的是原始方法本身,而不是decorator1返回的结果(好像装饰器不知道以前的装饰器所执行的操作)。
提前谢谢你!
发布于 2013-06-19 12:47:34
如果要让@decorator1和@decorator2检查返回的任何decorator1,则需要交换decorator2行:
@decorator2
@decorator1
def my_method(self, request, *args, **kwargs):
return u'The result that must be returned if all the checks performed by the decorator succeed'现在,decorator2将包装decorator1返回的任何方法,因此您可以检查该方法返回的内容。
def decorator2(method_to_decorate):
@wraps(method_to_decorate)
def wrapper2(self, request, *args, **kwargs):
result = method_to_decorate(self, request, *args, **kwargs)
if isinstance(result, tuple) and result and result[0] == 'failure':
# decorator1 returned a failure
return result
else:
# decorator1 passed through the wrapped method call
if decorator2_s_test_was_successful:
return result
else:
return ('another failure', 'message')
return wrapper2发布于 2013-06-19 12:55:22
将按照您将它们置于修饰方法之上的顺序调用装饰器,并且根据您的程序结构,如果decorator2失败,则不会调用decorator1,因此不需要检查decorator1在decorator2中是否成功。
一个稍微简单的例子..。
from functools import wraps
def decorator1(f):
@wraps(f)
def wrapper(a):
if a >= 1:
return f(a)
return 'failed in decorator 1'
return wrapper
def decorator2(f):
@wraps(f)
def wrapper(a):
if a >= 2:
return f(a)
return 'failed in decorator 2'
return wrapper
@decorator1
@decorator2
def my_func(a):
return 'success'
print my_func(0)
print my_func(1)
print my_func(2)...which指纹..。
failed in decorator 1
failed in decorator 2
successhttps://stackoverflow.com/questions/17191316
复制相似问题