Django登录需要问题

时间:2016-06-29 09:57:39

标签: python django django-views django-login

如果问题非常明显,我很抱歉,但我还是Django的新手。

我有查看:

import logging

@login_required(login_url='/accounts/login/')

def index(request):
        return render(request, 'post.html', {})

def new(request):
    return render(request, 'post-add.html',)

如果我转到POST页面,Login会正确重定向,但如果我要POST ADD,则不需要登录。

我是否正确使用登录要求?

3 个答案:

答案 0 :(得分:1)

如果你想在没有登录的情况下尝试打开“post-add”时重定向,你需要另一个装饰器(@login_required(login_url ='/ accounts / login /') )。

答案 1 :(得分:0)

您必须将@login_required装饰器应用于您要求登录的每个视图:

@login_required(login_url='/accounts/login/')
def index(request):
        return render(request, 'post.html', {})


@login_required(login_url='/accounts/login/')
def new(request):
    return render(request, 'post-add.html', {})

答案 2 :(得分:0)

正如其他人指出的那样,您必须在每个需要身份验证的视图上使用登录装饰器。

您可以通过简单地包装它来重复使用它:

auth = login_required(login_url='/accounts/login/')

@auth
def index(request):
    return render(request, 'post.html', {})

@auth
def new(request):
    return render(request, 'post-add.html',)

或者如果你喜欢基于类的视图,我更喜欢这个:

class AuthMixin(object):
    @method_decorator(login_required(login_url='/accounts/login/'))
    def dispatch(self, *args, **kwargs):
        return super(AuthMixin, self).dispatch(*args, **kwargs)

class IndexView(AuthMixin, TemplateView):
    template_name = 'post.html'

class AddView(AuthMixin, TemplateView):
    template_name = 'post-add.html'

为了简化它,您可以使mixin继承自TemplateView,并将其用作所有登录所需视图的单个基类。

使用这两种方法从设置中检索登录网址也是一个好主意。