43

如何重用原始管理员 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)
4

2 回答 2

23

django 会话 cookie 年龄以为单位定义。

SESSION_COOKIE_AGE = 360

表示会话将在 6 分钟后过期。我最近实现了“记住我”功能,并设置了以下内容:

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

如您在代码段中所示,登录视图需要覆盖。

但是听起来您遇到了一个奇怪的问题,即关闭浏览器(当未选中记住我时)不需要用户重新登录,如果您使用 set_expiry(0),则不应该发生这种情况。当您使用 set_expiry(0) 时,django 会设置一个“会话”长度的 cookie,而不是固定长度的 cookie,并且按照设计它会在浏览器关闭后过期。

还有另一个设置会影响浏览器关闭时清除 cookie。也许您可以尝试更改 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置的值或检查它在您的配置中的现有值。https://docs.djangoproject.com/en/2.2/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

于 2015-02-18T21:36:53.913 回答
0

所以 request.set_expiry(O) 只登录一个匿名但经过身份验证的用户。如果我是你,我会这样做

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

于 2018-05-29T08:49:41.247 回答