@gh0sty
Веб-разработчик. Пишу под Python Django.

Почему не происходит вход через login() Django?

Если в кратце, я пишу систему аутентификации на django, по средствам попапов и ajax-запросов.
Структура примерно такая:
На странице есть bootstrap popup (#LoginModal), в нем находится форма (#login-form).
При submit выполняется ajax запрос на view входа (url : "/login/" --> login_user).
Этот view (login_user) возвращает результат и далее js выводит информацию об ошибках или переадресовывает пользователя (если вход успешен).
Т.е. #LoginModal --> #login-form --> ajax --> /login/ --> login_user --> ajax-data --> reload or show errors

Вот мой код js + ajax:
alert('{{user.is_authenticated}}');
$('#login-form').on('submit', function(event){
    event.preventDefault();
    $('#login-form .alert-success').remove();
    $('#login-form #login_btn').addClass('disabled');
    $('#login-form #login_btn').prop('disabled', true);
    $.ajax({
        url : "/login/",
        type : "get",
        data : $('#login-form').serialize()
    }).done(function(data) {
        if (data == "OK") {
            $('#login-form .alert-danger').remove();
            $('#login-form').prepend('<div class="alert alert-success" role="alert"><strong>Успешно!</strong><br>Подождите секундочку...</div>');
            document.location.href = document.location.href.replace('#open_login', '');
        } else {
            if (!$('#login-form .alert-danger').length) {
                $('#login-form').prepend('<div class="alert alert-danger" role="alert"><strong>Ошибка!</strong><br>Введите правильное имя пользователя и пароль.</div>');
            }
            $('#login-form #login_btn').removeClass('disabled');
            $('#login-form #login_btn').prop('disabled', false);
        }
    });
});


Вот мой login_user view:
def login_user(request):
    username = request.GET.get('username')
    password = request.GET.get('password')
    auth_form = AuthenticationForm(request, {'username': username, 'password': password})
    if auth_form.is_valid():
        if request.GET.get('remember') == "true":
            pass
        else:
            request.session.set_expiry(0)
        user = authenticate(username=username, password=password)
        login(request, user)
        print(user.is_authenticated)
        ret = 'OK'
    else:
        ret = 'field_errors'
    return HttpResponse(ret)


И вот в чем заключается проблема.
Функция
login(request, user)
или не выполняется, или выполняется как-то не так.
При верных данных, алерт в js всегда показывает false;
И данные на странице говорят о том же.
А print во вьюхе говорит - true, все ок, бро! И юзера правильно выводит.
И я точно не помню, что менял, но в какой-то момент возникла эта штука.

Я в django недавно, нужна ваша помощь. Заранее благодарен.
  • Вопрос задан
  • 465 просмотров
Решения вопроса 1
@Jason7Wane
Мне помогло это во views.py

from django.contrib import auth

def login(request):
...
auth.login(request, user)
....
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@MaxGS
Начинающий веб-разработчик
Мне помог ваш код, я сделал вход через модальное окно bootstrap.

ajax

$('#login-form').on('submit', function(event){
        event.preventDefault();
        var csrf_token = $('#login-form [name="csrfmiddlewaretoken"]').val();
        var idu = $('#idu').val();
        var idp = $('#idp').val();
        $.ajax({
            url : "/login/",
            type : "POST",
            data : { csrfmiddlewaretoken: csrf_token, lgn: idu, pswd: idp},
            traditional: true
        }).done(function(response) {
            if (response == "OK") {
                $('#login-form .alert-danger').remove();
                $('#login-form').prepend('<div class="alert alert-success" role="alert"><strong>Успешно!</strong><br>Подождите секундочку...</div>');
                document.location.href = document.location.href.replace('#open_login', '');
            } else {
                if (!$('#login-form .alert-danger').length) {
                $('#login-form').prepend('<div class="alert alert-danger" role="alert"><strong>Ошибка!</strong><br>Введите правильное имя пользователя и пароль.</div>');
            }
            }
        });
    });


views.py

def auth_view(request):
    username = request.POST.get('lgn', '')
    password = request.POST.get('pswd', '')
    user = auth.authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            auth.login(request, user)
            return HttpResponse('OK')
    else :
        return HttpResponse("False")


urls.py

url(r'^login/$', views.auth_view, name='login'),

template login.html

<div class="modal fade" id="LogModal" tabindex="-1" role="dialog" aria-labelledby="LogModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="LogModalLabel">Вход в учетную запись</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <form id="login-form" method="post" action="">{% csrf_token %}
                <div class="modal-body">
                    <label for="id_username">Имя пользователя:</label>
                    <input class="form-control" type="text" name="username" maxlength="30" id="idu"/>
                    <label for="id_password">Пароль:</label>
                    <input class="form-control" type="password" name="password" id="idp"/>
                </div>
                <div class="modal-footer">
                    <button type="submit" class="btn btn-primary">Войти</button>
                </div>
            </form>
        </div>
    </div>
</div>


Вызов модального окна:

<button class="btn btn-outline-dark my-2 my-sm-0" type="button" style="font-weight: bold" data-toggle="modal" data-target="#LogModal">Регистрация / Вход</button>


Может кому то поможет из новичков, я долго искал нужную мне информацию - рецепта готового нет, к сожалению.
Ответ написан
1) Стандартный механизм Django не подтягивает данные без рефреша страницы.
2) Я писал схему, когда я сохранял текущую страницу юзера в переменную, при логине (в случае успеха - пересылал в json ответ) - делал принудительный рефрешь страницы на ту страницу, что до этого сохранил.
3) После чего, получал авторизационного юзера и все нужные мне поля.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы