2013-09-26 4 views
2

내 피라미드 프로젝트에서이 같은 코드를 가지고 :장식 피라미드 뷰는

class SomeViews(object): 

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

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

내가 반환 된 사전을 수정하려면보기 방법을 장식하고 싶습니다. 뷰에 데코레이터를 적용 할 수 있습니다 (처음의 경우는 view_config). 그렇지 않으면 피라미드는 Venusian의 본질 때문에 원래 함수를 사용하고 있습니다.

클래스의 모든 메소드에 동일한 데코레이터를 적용 할 것이므로 클래스 데코레이터를 사용하는 것이 좋습니다. 그래서 그 대신 각 방법에 대한

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

을하고, 나는

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

그러나 클래스 장식이 view_config 호출 후에 실행되기 때문에, 다시는 금성 작동하지 않습니다 할 싶습니다. 내 문제를 해결하는 방법을 알기 위해 view_defaults 구현을 살펴 보았지만 어떻게 작동하는지 알지 못했습니다.

어떻게 할 수 있습니까? 내가하고 싶은 것은 뷰 메소드 집합의 결과 사전을 수정하는 것입니다. 또한 BeforeRender 이벤트를 사용하려고 생각했지만 이벤트 처리기에서 액세스 할 수있는 방식으로 필요한 메타 데이터를 주입 할 방법이 없습니다. 어쨌든 데코레이터를 사용하는 것은 내 의견으로는 더 자연스럽고 파이썬적인 방법이 될 것입니다. 기본 옵션은 클래스에있는 모든 view_config에 전달로 view_defaults

+1

당신의 견해는'request'가 아닌'self' (클래스 인스턴스)를 받아 들여야합니다. 요청 객체는'__init__'에 전달됩니다. –

답변

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_config에 데코레이터를 추가하면 기본값이 무시되고 기본 데코레이터가 삭제됩니다.

+0

좋은 답변입니다! 이것에 대한 질문 - 뷰에 인수를 추가 할 수 있도록 view_defaults를 사용하는 방법이 있습니까? 예를 들어 함수 기반 뷰에서 데코레이터를 사용하여 GET 매개 변수를 구문 분석하고 my_view (request, params)와 같은 방식으로 내 뷰를 호출하는 경우가 있습니다. – Temuz

+1

이것은 뷰 매퍼를 사용하여 가능합니다. 피라미드의 "데코레이터"인수와 다릅니다. 주위에 떠 다니는 가장 포괄적 인 것은 아마도 pyramid_rpc 저장소에있는 것일 것입니다. 클래스 메소드, 함수 등에서 작업하기를 원한다면 작성하지 않아도됩니다. https://github.com/Pylons/pyramid_rpc/blob/를 참조하십시오. master/pyramid_rpc/mapper.py. 그러나보기의 특정 세트에 대한 것이 있다면 훨씬 쉬울 것입니다! –