login_required django decorator

时间:2015-09-02 06:57:09

标签: python django

我想将login_required用于基于功能的视图。我经历了Django's official docs of django.contrib.auth.decorators.login_required。我无法清楚地抓住它。

问题是,即使用户已经过身份验证而不是转到主页,控件也会返回login函数。 允许使用我的代码登录需要进行哪些更改?

def login(request):
    """
    """
    data_dict = {}
    if request.POST:
        req_dict = dict(zip(request.POST.keys(), request.POST.values()))
        accmgr = AccountManager()
        user = accmgr.validate_user(**req_dict) 
        if user:
            ret = redirect('homepage')
        else:
            data_dict["msg"] = "Username  or password is incorrect!"
            ret =  render(request, "login.html", data_dict)
    else:
        ret =  render(request, "login.html", data_dict)
    return ret

@login_required(login_url='/login')
def homepage(request):
    '''
    '''
    return render(request, "adminpage.html", {"title":"Hello World"})

注意accmgr.validate_user在内部检查user.is_authenticated。还有一些其他检查我必须做以允许用户添加自定义功能。

还在settings.py中添加了LOGIN_URL

LOGIN_URL ='/login/'

1 个答案:

答案 0 :(得分:1)

login_required装饰器检查request.user.is_authenticated()是否返回True。可能问题是,accmgr.validate_user方法并不真正对用户进行身份验证。

您应该拨打authenticate()来实际登录用户。

from django.contrib.auth import login as django_login
from django.contrib.auth import authenticate

def login(request):
    ...
    req_dict = request.POST.copy()
    user = authenticate(
        username=req_dict['username'], password=req_dict['password'])

    if user:
        django_login(request, user)
    ...

有关详细信息,请参阅documentation