문제

내 Django보기 중 일부를 기능 기반보기에서 클래스 기반보기로 변환하려고 노력하고 있으며 작은 문제가 발생합니다.

내 OO는 약한 것이 약하고 문제는 상황이 어디로 가고 있는지 추적을 잃었다는 것입니다.

보기에 필요한 맞춤형 로그인 데코레이터가있어서 ...

먼저이 예에서보기 클래스가 있습니다http://www.djangosnippets.org/snippets/760/

그런 다음 내보기 수업은 이렇게 보입니다 ...

class TopSecretPage(View):
    @custom_login
    def __call__(self, request, **kwargs):
        #bla bla view stuff...
        pass

문제는 내 데코레이터가 요청에 액세스 할 수 없다는 것입니다.

내 데코레이터는 이렇게 보인다 ...

def myuser_login_required(f):
    def wrap(request, *args, **kwargs):

        # this check the session if userid key exist,
        # if not it will redirect to login page

        if 'field' not in request.session.keys():
        return wrap

나는 내가 놓친 것이 간단하다고 생각하므로 모두 인내심을 보내 주셔서 감사합니다!

업데이트 : 좋아, 여기에 내가 얻는 오류가 있습니다 ...

"ViewDoesNoTeXist : Module ProjectName.Application.Views에서 TOPSECRETPAGE를 시도했습니다. 오류는 다음과 같습니다. 'TOPSECRETPAGE'타입 'TOPSECRETPAGE'는 속성 '세션'이 없습니다."

나는 이렇게 보이도록 데코레이터를 단순화했다 ....

def myuser_login_required(request, *args, **kwargs):


    # this check the session if userid key exist,
    # if not it will redirect to login page

    if 'username' not in request.session.keys():
        return  HttpResponseRedirect(reverse("login-page"))

    return True
도움이 되었습니까?

해결책

문제는 래퍼가 첫 번째 인수로 "요청"을 기대하지만 클래스의 방법은 항상 "자기"를 첫 번째 인수로 간주한다는 것입니다. 따라서 데코레이터에서는 요청 객체가 실제로 Topsecretpage 자체라는 것입니다.

Vinay 또는 Artran의 솔루션이 작동해야하므로 반복하지 않습니다. 문제에 대한 명확한 설명이 도움이 될 수 있다고 생각했습니다.

다른 팁

클래스 기반보기 방법에 적용되는 데코레이터에 대해이 작업을 수행하는 올바른 방법은 사용하는 것입니다. django.utils.decorators.method_decorator(). Method_decorator ()가 언제 소개되었는지 확실하지 않지만 여기 Django 1.2의 예제/업데이트가 있습니다. 릴리즈 노트. 다음과 같이 사용하십시오.

from django.utils.decorators import method_decorator

class TopSecretPage(View):
    @method_decorator(custom_login)
    def __call__(self, request, **kwargs):
        #bla bla view stuff...
        pass

이 문제가 발생했습니다 ~ 전에. 당신에게 효과가있는 솔루션이 포함되어 있습니다.

업데이트: 데코레이터와 함께 방법 :

class ContentView(View):

    # the thing in on_method() is the actual Django decorator
    #here are two examples
    @on_method(cache_page(60*5))
    @on_method(cache_control(max_age=60*5))
    def get(self, request, slug): # this is the decorated method
        pass #in here, you access request normally

보기에 데코레이터를 사용하는 대신 URL을 장식 할 수 있습니다.

예를 들어 urls.py :

from my_decorators import myuser_login_required
from my_views import TopSecretPage

urlpatterns = patterns('', 
    (r'^whatever-the-url-is/$', myuser_login_required(TopSecretPage), {}),
)

당신은 그것으로 조금 놀아야 할 수도 있지만 옳습니다.

이것은 효과적으로의 복제입니다 Django- CBV 데코레이터에게 인수를 전달하는 올바른 방법?이를 해결하는 올바른 방법을 설명합니다. Django 1.9에 대한 올바른 방법은 다음과 같습니다.

@method_decorator(myuser_login_required(), name='dispatch')
class TopSecretPage(View):
    ..
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top