【发布时间】:2019-08-25 16:41:46
【问题描述】:
我正在尝试在 django 的内置 LoginView 中实现一个“记住我”复选框,正如 this question 上所建议的那样,但即使我调用 set_expiry(0),会话仍然在 SESSION_COOKIE_AGE 之后过期,不管 cookie过期日期(正确设置为 1969)。
我正在使用 django 2.1.7 和 python 3.7.2,我的settings.py 上唯一与会话相关的设置是SESSION_COOKIE_AGE,它设置为 5 秒以用于休息。
Django 似乎默认使用数据库后端。我正在使用 sqlite 进行开发。
这是我的视图类:
class UserLoginView(LoginView):
form_class = registration.UserLoginForm
def form_valid(self, form):
remember = form.data.get('remember_me', False)
if remember:
self.request.session.set_expiry(0)
return super(UserLoginView, self).form_valid(form)
这是原始 LoginView form_valid 方法(上面被覆盖)
class LoginView(SuccessURLAllowedHostsMixin, FormView):
...
def form_valid(self, form):
"""Security check complete. Log the user in."""
auth_login(self.request, form.get_user())
return HttpResponseRedirect(self.get_success_url())
...
如您所见,我使用的是自定义 form_class。一个非常简单的默认表单覆盖:
class UserLoginForm(AuthenticationForm):
remember_me = BooleanField(required=False)
如果我在 set_expiry 调用后立即使用调试器,我可以看到会话过期时间仍然是默认的 5 秒:
> /project/app/views/accounts.py(64)form_valid()
-> return super(UserLoginView, self).form_valid(form)
(Pdb) self.request.session.get_expiry_age()
5
如果我让请求完成并重定向,到达下一个视图并最终呈现我拥有的模板,我会得到类似的结果:
...
{{ request.session.get_expiry_age }}
...
渲染结果也是5(当前默认)。
果然,5秒后,如果你刷新页面,django会带你回到登录界面。
我在这里做错了什么?如果有人能澄清“Web 浏览器已关闭”是什么意思,那就太好了? https://docs.djangoproject.com/en/2.2/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.set_expiry
【问题讨论】: