web-dev-qa-db-fra.com

Django "Remember Me" avec vue de connexion intégrée et formulaire d'authentification

Comment puis-je réutiliser le login administrateur () et AuthenticationForm d'origine pour définir une longueur de cookie plus longue pour les utilisateurs dont l'option "Remember me" est cochée sur la page de connexion? J'utilise actuellement le login intégré via urls.py

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

La case à cocher est implémentée dans mon login.html en tant que:

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

mais je ne suis pas sûr de savoir comment transmettre ces informations via AuthenticationForm à Django.contrib.auth.views.login

Actuellement, si l'utilisateur enregistre la case "Remember me" non cochée, l'âge du cookie est défini dans settings.py

SESSION_COOKIE_AGE = 360

J'ai trouvé quelques questions similaires mais je ne pense pas que cela devrait nécessiter l'installation d'une application séparée. L'extrait ci-dessous ( http://djangosnippets.org/snippets/1881/ ) semblait prometteur, mais j'ai codé python et Django seulement depuis deux mois et je n'ai pas réussi à le faire fonctionner:

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)
33
Sawwy

L'âge du cookie de session Django est défini dans seconds .

SESSION_COOKIE_AGE = 360

signifie que la session expirera au bout de 6 minutes. J'ai récemment implémenté la fonctionnalité "Mémoriser mes informations" et j'ai défini les paramètres suivants:

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

La vue de connexion doit être remplacée comme vous l'avez montré dans l'extrait de code.

Mais on dirait que vous rencontrez un problème étrange dans lequel la fermeture du navigateur (lorsque Mémoriser mes informations n'est pas cochée) n'exige pas de l'utilisateur qu'il se reconnecte, ce qui ne devrait pas se produire si vous utilisez set_expiry (0). Lorsque vous utilisez set_expiry (0), Django définit un cookie de longueur de session, par opposition à un cookie de longueur fixe, qui expire par la suite après la fermeture du navigateur.

Un autre paramètre affecte la suppression des cookies à la fermeture du navigateur. Vous pouvez peut-être essayer de modifier la valeur du paramètre SESSION_EXPIRE_AT_BROWSER_CLOSE ou vérifier sa valeur existante dans votre configuration. https://docs.djangoproject.com/fr/1.10/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

16
tarequeh

Ainsi, request.set_expiry (O) ne connecte qu'un utilisateur anonyme mais authentifié .. Si j'étais vous, je le ferais

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

0