데코레이터에서 클래스 메서드 중 하나를 래핑하고 싶습니다. 이것이 필요한 경우, 내 수업은 장고 클래스 기반의 견해입니다. 구현의데코 레이팅 클래스 및 클래스 메서드
첫 번째 유형은 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는 없습니다 원래 classmethods 및 classonlymethods을 포함 할. 나는 그런 행동에 대한 이유를 추측한다.
어떻게 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'
그래서 'dispatch'이'classmethod '라면'viewdecorator'가 작동하지 않을 것입니다. 'classmethod'는 가장 많이 사용되는 데코레이터 여야합니다.하지만 해결 방법이있을 수 있습니다. – simonzack
'viewdecorator'는 나에게 잘 어울리는 데,이 데코레이터에서 cls가 원래 classmethods와 classonlymethods를 포함하지 않는다는 의미가 무엇인지 이해하지 못합니까? 그것은 확실히 모든 방법을 포함합니다. 또한''dispatch ''를'method_decorator (dispatch) '로 설정해야합니다. –
@simonzack 아니요,'@ classmethod'를 아무 곳에 나 배치 할 수 있습니다. –