Django @login_required 不重定向到登录页面

Sah*_*jad 2 django login-required django-class-based-views

我在 Django 中使用基于类的视图。@login_required 装饰器没有重定向到登录页面。它仍然显示个人资料页面。

class ProfileView(TemplateView):
template_name='profile.html'

@login_required(login_url='/accounts/login/')
def dispatch(self, *args, **kwargs):
        return super(ProfileView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

谁能帮我。我是 Django 新手,任何帮助将不胜感激。

提前致谢

Rah*_*pta 5

您需要method_decorator先应用一个,然后将其传递给login_required函数装饰器。

\n\n

类上的方法与独立函数完全相同,因此您可以仅将函数装饰器应用于该方法。您需要首先将其转换为方法装饰器。

\n\n

为了更清楚地说明,Django 的视图装饰器返回一个带有签名的函数(request, *args, **kwargs),但对于基于类的视图,签名应采用(self, request, *args, **kwargs). 现在,它所做的method_decorator是将第一个签名转换为第二个签名。

\n\n

来自有关装饰基于类的视图的文档:

\n\n
\n

装饰method_decorator器将函数装饰器转换为方法装饰器,以便可以在实例方法上使用它。

\n
\n\n
from django.contrib.auth.decorators import login_required\nfrom django.utils.decorators import method_decorator\n\nclass ProfileView(TemplateView):\n    template_name=\'profile.html\'\n\n    @method_decorator(login_required(login_url=\'/accounts/login/\'))\n    def dispatch(self, *args, **kwargs):\n        return super(ProfileView, self).dispatch(*args, **kwargs)\n
Run Code Online (Sandbox Code Playgroud)\n