Django Remember Me со встроенным представлением входа и формой аутентификации

Как я могу повторно использовать исходный admin login() и AuthenticationForm, чтобы установить более длинную длину файла cookie для пользователей с параметром «запомнить меня», отмеченным на странице входа? В настоящее время я использую встроенный вход через urls.py.

url(r'^login/$','django.contrib.auth.views.login', {'template_name': 'authentication/login.html'}, name='login'),

Флажок реализован в моем файле login.html как:

<label><input name="remember_me" type="checkbox">Keep me logged in</label>

но я не уверен, как передать эту информацию через AuthenticationForm в django.contrib.auth.views.login

В настоящее время, если пользователь регистрирует флажок «запомнить меня» снятым, возраст файла cookie определяется в settings.py

SESSION_COOKIE_AGE = 360

Я нашел пару похожих вопросов, но я не думаю, что для этого требуется установка отдельного приложения. Приведенный ниже фрагмент (http://djangosnippets.org/snippets/1881/) показался многообещающим, но я кодировал python и Django всего пару месяцев, и я не смог заставить его работать:

def login(request, *args, **kwargs):
    if request.method == 'POST':
        if not request.POST.get('remember_me', None):
            request.session.set_expiry(0)
    return auth_views.login(request, *args, **kwargs)

person Sawwy    schedule 26.02.2013    source источник
comment
Фрагмент на самом деле работает по-другому, но основная идея по-прежнему заключается в том, чтобы установить срок действия файла cookie на основе выбора флажка.   -  person Sawwy    schedule 27.02.2013
comment
Фрагмент правильный, просто установите SESSION_COOKIE_AGE на истечение срока действия запомненного входа, а 0 внутри request.session.set_expiry(0) на истечение срока действия одноразового входа.   -  person okm    schedule 27.02.2013
comment
Хорошо, теперь я заработал так, что продолжительность сеанса по умолчанию составляет 5 секунд, и помните, что сеанс составляет 30 секунд (только для целей тестирования). Однако, когда я использую set_expiry(0), сеанс не удаляется при закрытии браузера (закрытие всего браузера, а не вкладки). Проблема сохраняется после: 1) удаления FROM django_session (чтобы удалить всю информацию о сеансе из базы данных) 2) очистки всей истории браузера (Chrome 25.0.1364.97). Я начинаю с нуля, но как только этот пользователь войдет в систему, он останется в системе. Есть ли что-то еще, что мне нужно сделать?   -  person Sawwy    schedule 27.02.2013
comment
Вы решили это? set_expiry(0) у меня работает. Вы можете проверить ответ, чтобы узнать, обновлен ли файл cookie сеанса.   -  person okm    schedule 12.03.2013
comment
Да, я обнаружил, что проблема была только с браузером Chrome (когда я снова открывал браузер, он загружал мои старые вкладки перед закрытием). Chrome также работает, когда указанный выше параметр отключен.   -  person Sawwy    schedule 02.04.2013
comment
@Sawwy Тогда ты хочешь опубликовать это как ответ?   -  person Pureferret    schedule 10.02.2015


Ответы (3)


Срок действия файла cookie сеанса django определяется в секундах.

SESSION_COOKIE_AGE = 360

означает, что сессия истечет через 6 минут. Недавно я реализовал функцию «Запомнить меня» и установил следующее:

SESSION_COOKIE_AGE = 60 * 60 * 24 * 30 # One month

Представление входа в систему необходимо переопределить, как показано во фрагменте.

Но похоже, что у вас возникла странная проблема, когда закрытие браузера (когда флажок «Запомнить меня» не установлен) не требует от пользователя повторного входа в систему, чего не должно происходить, если вы используете set_expiry (0). Когда вы используете set_expiry(0), django устанавливает файл cookie длины сеанса, а не файл cookie фиксированной длины, и по замыслу срок его действия истекает после закрытия браузера.

Есть еще одна настройка, влияющая на очистку куки при закрытии браузера. Возможно, вы можете попробовать изменить значение параметра SESSION_EXPIRE_AT_BROWSER_CLOSE или проверить его существующее значение в вашей конфигурации. https://docs.djangoproject.com/en/2.2/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

person tarequeh    schedule 18.02.2015

Таким образом, request.set_expiry(O) регистрируется только анонимным, но авторизованным пользователем.. на вашем месте я бы сделал это

if request.user.is_authenticated() and request.user.id is not None: return redirect('home')

person DimitrisBovasianos    schedule 29.05.2018

Зависимости

from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import authenticate
from site_user.models import User

Этот код аннулирует имя пользователя и пароль из сеанса, когда мы находимся на странице входа.

def home(request):
    if request.session.has_key('username') and request.session.has_key('password'):
        username = request.session['username']
        password = request.session['password']
        context_dict = {'username': username, 'password': password}
        return render(request, 'sadmin/login.html', context=context_dict)
    else:
        context_dict = {'username': '', 'password': ''}
        return render(request, 'sadmin/login.html', context=context_dict)

Следующий код используется для аутентификации пользователя. Здесь поле флажка is_remember_check из файла HTML

@csrf_exempt
def login(request):
    if request.method == "POST":
        if request.POST['is_remember_check'] == 'true':
            request.session['username'] = request.POST['username']
            request.session['password'] = request.POST['password']

        user = authenticate(username=request.POST['username'], password=request.POST['password'])

        if user is not None:
            return JsonResponse({'result': request.POST, 'status': True})
        else:
            return JsonResponse({'result': request.POST, 'status': False})

AJAX-вызов со страницы входа

function login(){
    remember_checkbox_value = document.getElementsByName('remember')[0].checked;
    username = document.getElementsByName('username')[0].value;
    password = document.getElementsByName('password')[0].value;
    var post_data = {username:username, password:password, is_remember_check:remember_checkbox_value};

    $.ajax({
                url: '/sadmin/login/',
                method: 'POST',
                data: post_data,
                dataType: 'json',
                success: function (response) {
                        if (response.status){
                        alert("User login is successful");
                        window.location.reload();
                        }
                        else{
                        alert("User login is not successful");
                        window.location.reload();
                        }
                }
        });
}

HTML-код

<div class="form-actions">
            <label class="checkbox">
            <input type="checkbox" name="remember"/> Remember me </label>
            <button type="button" class="btn green-haze pull-right" onclick="login()">Login <i class="m-icon-swapright m-icon-white"></i>
            </button>
        </div>
person Abhisek    schedule 13.11.2018