2

我的金字塔项目中有这样的代码:

class SomeViews(object):

    @view_config(...)
    def view_a(request):
       return {...}

    @view_config(...)
    def view_b(request):
       return {...}

我想装饰视图方法来修改返回的字典。可以将装饰器应用于视图,如果它是之前的第一个view_config。否则,由于金星的性质,金字塔仍在使用原始功能。

因为我会将相同的装饰器应用于类中的所有方法,所以我更喜欢使用类装饰器。所以而不是做

    @view_config(...)
    @my_decorator("some_meta_info")
    def view_b(request):
       return {...}

对于每种方法,我想做

@my_decorator("some_meta_info")
class SomeViews(object):
    ...

但是因为类装饰器是在view_config调用之后执行的,所以它又不能与 Venusian 一起使用。我查看了view_defaults实现,以获得如何解决我的问题的提示,但我没有弄清楚它是如何工作的。

任何提示如何做到这一点?我想要做的,只是修改一组视图方法的结果字典。我也考虑过使用BeforeRender事件,但我发现无法以我可以在事件处理程序中访问它的方式注入所需的元数据。在我看来,使用装饰器无论如何都是更自然和 Pythonic 的方式。

4

1 回答 1

4
import functools

def my_decorator(value):
    def _dec(f):
        @functools.wraps(f)
        def wrapper(context, request):
            print 'hey look!', value
            return f(context, request)
        return wrapper
    return _dec

@view_defaults(decorator=my_decorator('some meta info'))
class SomeViews(object):
    def __init__(self, request):
        self.request = request

    @view_config(..., renderer='string')
    def view_a(self):
        return 'foo'

view_defaults其视为传递给每个view_config班级的默认选项。如果你添加一个装饰器view_config,默认值将被覆盖,你的默认装饰器将被删除。

于 2013-09-26T16:32:43.143 回答