django类视图与装饰和会话

Tho*_*ltz 3 django session views class decorator

我试图将我的一些django视图从基于函数的视图转换为基于类的视图,我遇到了一个小问题.

我的OO有点弱,我认为问题在于我已经忘记了事情的进展.

我有一个自定义的登录装饰器,我需要在视图上,所以我...

首先,我从这个例子中获得了View类 http://www.djangosnippets.org/snippets/760/

然后我的视图类看起来像这样......

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

问题是我的装饰者由于某种原因无法访问request.session ...

我的装饰师看起来像这样......

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
Run Code Online (Sandbox Code Playgroud)

我觉得这很简单,我很想念,所以感谢大家的耐心等待!

更新:好的,这就是我得到的错误......

"ViewDoesNotExist:在模块projectname.application.views中尝试了TopSecretPage.错误是:类型对象'TopSecretPage'没有属性'session'"

我简化了装饰器,看起来像这样....

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
Run Code Online (Sandbox Code Playgroud)

Ger*_*eyn 6

对于应用于任何基于类的视图方法的任何装饰器,执行此操作的正确方法是使用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
Run Code Online (Sandbox Code Playgroud)