2014-10-13 4 views
0

데코레이터에서 클래스 메서드 중 하나를 래핑하고 싶습니다. 이것이 필요한 경우, 내 수업은 장고 클래스 기반의 견해입니다. 구현의데코 레이팅 클래스 및 클래스 메서드

첫 번째 유형은 method_decorator에 의해 포장 방법 :

class MyView(View): 
    template_name = "index.html" 
    @method_decorator(login_required): 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

좋아,이 작동합니다. 하지만 언제든지 덮어 쓰기 방법 파견을 원하지 않습니다.

두 번째 방법 - mixins 및 다중 상속.

class LoginRequiredView(object): 
    @method_decorator(login_required): 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

class MyView(LoginRequiredView, View): 
    template_name = "index.html" 

이 역시 작동합니다. 그러나 여러 개의 데코레이터를 사용하려면 모든 믹스 인을 부모에게 나열해야합니다. 그것은 나에게 좋지 않습니다.

@viewdecorator(login_required) 
class MyView(LoginRequiredView, View): 
    template_name = "index.html" 

을 그리고 내 질문에 viewdecorator을 구현하는 방법입니다 :

나는 다음 싶다. 나는이를 작성하려고이 장식에

def viewdecorator(decorator): 
    def wrap(cls): 
     dispatch = getattr(cls, 'dispatch', None) 
     if dispatch: 
      setattr(cls, 'dispatch', method_decorator(decorator)) 
     return cls 
    return wrap 

그러나 결과 CLS는 없습니다 원래 classmethodsclassonlymethods을 포함 할. 나는 그런 행동에 대한 이유를 추측한다.

어떻게 viewdecorator classmethods 에가 CLS를 결과에 표시됩니다 쓰기?

UPD는 예이 작업과 실제 작업 코드 아래는

def viewdecorator(decorator): 
    def wrap(cls): 
     getattribute = cls.__getattribute__ 

     def newgetattr(cls, name): 
      attr = getattribute(cls, name) 
      if name == 'dispatch': 
       return decorator(method_decorator(attr)) 
      return attr 

     cls.__getattribute__ = newgetattr 
     return cls 
    return wrap 

@viewdecorator(login_required) 
@viewdecorator(csrf_exempt) 
class EntriesMyList(EntriesList): 
    template_name = 'index.html' 
+0

그래서 'dispatch'이'classmethod '라면'viewdecorator'가 작동하지 않을 것입니다. 'classmethod'는 가장 많이 사용되는 데코레이터 여야합니다.하지만 해결 방법이있을 수 있습니다. – simonzack

+0

'viewdecorator'는 나에게 잘 어울리는 데,이 데코레이터에서 cls가 원래 classmethods와 classonlymethods를 포함하지 않는다는 의미가 무엇인지 이해하지 못합니까? 그것은 확실히 모든 방법을 포함합니다. 또한''dispatch ''를'method_decorator (dispatch) '로 설정해야합니다. –

+0

@simonzack 아니요,'@ classmethod'를 아무 곳에 나 배치 할 수 있습니다. –

답변

0

당신은 django-braces를 설치하는 방법을 나는 이해했다. 이 라이브러리에는 로그인 필요 mixin이 포함되어 있습니다

from django.views.generic import View 
from braces.views import LoginRequiredMixin 


class SimpleView(LoginRequiredMixin, View): 
    pass 

올바른 스타일을 위해서는 CBV 용 데코레이터가 필요하지 않습니다. 일부 사용자 지정보기 권한이 필요하면 dispatch 뷰 메서드에서 논리를 구현하십시오.

+0

결과로 볼 수있는 부모 목록이 길어질 것입니다. 아주 좋은하지. 질문 끝에 나는 유용한 해결책을 썼다. – zpol

관련 문제