Django就像用户登录但不是

时间:2016-11-08 13:01:40

标签: ajax django django-authentication

我的Django项目中有AJAX登录。 ajax_login view获取POST,验证用户并返回JsonResponse。一切似乎都正常,但用户实际上并没有登录。

奇怪的是,在视图中,我正在测试用户是否已登录并且他们是。

查看

@csrf_exempt
def ajax_login_(request):
    username = request.POST.get('username')
    password = request.POST.get('password')

    user = authenticate(username=username,password=password)

    if user:
        if user.is_authenticated():
            print 'IS LOGGED IN' #THIS IS BEING PRINTED INTO CONSOLE SO USER IS LOGGED IN
            return JsonResponse({'status':0})

    return JsonResponse({'status':1})

AJAX

$(document).ready(function () {
    $('.login-form').find('.submitButton').click(function (e) {
        var next = $(this).closest('.login-form').find('input[name="next"]').val();
        var password = $(this).closest('.login-form').find('#id_password').val();
        var username =$(this).closest('.login-form').find('#id_username').val();
        e.preventDefault();
        var errors = 0;
        if (username == '') {
            $('#id_username_required').show();
            errors += 1;
        } else {
            $('#id_username_required').hide();
        }
        if (password == '') {
            $('#id_password_required').show();
            errors += 1;
        } else {
            $('#id_password_required').hide();
        }

        if (errors == 0) {
            $.ajax({
                url: '/ajax/login/',
                type: 'post',
                data: {
                    'password': password,
                    'username': username,
                },
                success: function (data) {
                    if (data.status == 0) {
                        window.location.reload();
                    } else {
                        $('.login-modal-credentials-incorrect').show();
                        return false;
                    }
                }
            });
        }
    })
});

无法弄清问题在哪里。它突然停止了工作。

3 个答案:

答案 0 :(得分:3)

您忘记在login()之后致电authenticate()

from django.contrib.auth import authenticate, login

def ajax_login_(request):
    ...
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)

有关详细信息,请参阅how to log a user in上的文档。

答案 1 :(得分:3)

像往常一样,问题非常简单。我在login(request,user)之后意外删除了authenticate行,因此用户已经过身份验证但未登录。

答案 2 :(得分:1)

我认为,问题出在您的js代码中,您正在重新加载当前页面。我认为,如果用户已成功通过身份验证,则必须将用户重定向到目标网页/主页。

例如

$.ajax({
            url: '/ajax/login/',
            type: 'post',
            data: {
                'password': password,
                'username': username,
            },
            success: function (data) {
                if (data.status == 0) {
                    window.location = "http://yourhost/landing-url"
                } else {
                    $('.login-modal-credentials-incorrect').show();
                    return false;
                }
            }
        });