Подтвердить что ты не робот

Django "Запомнить меня" со встроенной формой входа и аутентификацией

Как я могу повторно использовать оригинальный login 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)
4b9b3361

Ответ 1

Возраст файла 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

Ответ 2

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

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

Ответ 3

зависимости

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>