Pregunta Django "Remember Me" con vista de inicio de sesión y formulario de autenticación integrados


¿Cómo puedo volver a utilizar el inicio de sesión de administrador original () y AuthenticationForm para establecer la longitud de la cookie más larga para los usuarios con la opción "recordarme" marcada en la página de inicio de sesión? Actualmente estoy usando el inicio de sesión integrado a través de urls.py

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

La casilla de verificación se implementa en mi login.html como:

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

pero no estoy seguro de cómo pasar esa información a través del AuthenticationForm al django.contrib.auth.views.login

Actualmente, si el usuario abre la casilla "recordarme" sin marcar, la edad de la cookie se define en settings.py

SESSION_COOKIE_AGE = 360

Encontré un par de preguntas similares, pero no creo que esto requiera la instalación de una aplicación por separado. El fragmento a continuación (http://djangosnippets.org/snippets/1881/) parecía prometedor, pero he codificado Python y Django solo por un par de meses y no pude hacerlo funcionar:

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)

32
2018-02-26 22:13


origen


Respuestas:


La edad de la cookie de la sesión django se define en segundos.

SESSION_COOKIE_AGE = 360

significa que la sesión caducará después de 6 minutos. Recientemente implementé la función "Recordarme" y configuré lo siguiente:

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

La vista de inicio de sesión debe sobrescribirse como se muestra en el fragmento.

Pero parece que tienes un problema extraño cuando cerrar el navegador (cuando recuerdes que no está marcado) no requiere que el usuario vuelva a iniciar sesión, lo que no debería suceder si usas set_expiry (0). Cuando usas set_expiry (0), django establece una cookie de "sesión" en lugar de una cookie de longitud fija y, por diseño, caduca una vez que se cierra el navegador.

Hay otra configuración que afecta a borrar cookies en el navegador cercano. Tal vez puedas intentar modificar el valor de la configuración SESSION_EXPIRE_AT_BROWSER_CLOSE o verificar su valor existente en tu configuración. https://docs.djangoproject.com/en/1.10/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions


15
2018-02-18 21:36



Entonces, request.set_expiry (O) solo inicia sesión en un usuario anónimo pero autenticado. si fuera tú, haría esto

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


0
2018-05-29 08:49