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)
Ответы
Ответ 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>