装饰作为类方法实现的金字塔视图

时间:2013-09-26 08:16:00

标签: python metaprogramming pyramid

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

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事件,但我发现没有办法以我可以在事件处理程序中访问它的方式注入所需的元数据。在我看来,使用装饰器无论如何都是更自然和更加抒情的方式。

1 个答案:

答案 0 :(得分: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添加装饰器,则会覆盖默认值并删除默认装饰器。