Django:如何在我的登录页面上实现“记住我”键

时间:2018-11-22 12:52:19

标签: python django caching login web-deployment

实际上,我不仅仅是想编写代码,而是想了解我需要学习的所有主题,以便在登录页面上设置“记住我”的键。 它是一个内置的django登录页面,我对会话和缓存有一点了解,但不足以使我记住密钥和没有缓存的用户。 如果您可以为我提供答案或资料来源,将会很有帮助

5 个答案:

答案 0 :(得分:1)

只需在表单中添加一个新字段,如下所示:

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget= forms.PasswordInput)
    remember_me = forms.BoolenField()

并更新视图

def login(request):
 if request.method == "POST":
      form = LoginForm(request.POST)
      if form.is_valid():
          username = form.cleaned_data['username']
          password = form.cleaned_data['password']
          remember_me = form.cleaned_data['remember_me']
          user = authenticated(username=username, password=password)
          if user:
               login(request, user)
               if not remember_me:
                    request.session.set_expiry(0)  # <-- Here if the remember me is False, that is why expiry is set to 0 seconds. So it will automatically close the session after the browser is closed.

               # else browser session will be as long as the session  cookie time "SESSION_COOKIE_AGE"
               return redirect('/some/success/url')
 else:
         form = LoginForm()

         render(request, 'name.html', {'form': form})

更新

如果使用的是AuthenticationForm,则将其子类化,如下所示:

class LoginForm(AuthenticationForm):
    remember_me = forms.BooleanField()  # and add the remember_me field

并从LoginView继承您的新视图。还要在视图内覆盖form_valid方法。

from django.contrib.auth import login as auth_login,


class UpdatedLoginView(LoginView):
     form_class = LoginForm

     def form_valid(self, form):

        remember_me = form.cleaned_data['remember_me']  # get remember me data from cleaned_data of form
        if not remember_me:
             self.request.session.set_expiry(0)  # if remember me is 
             self.request.session.modified = True
        return super(UpdatedLoginView, self).form_valid(form)

答案 1 :(得分:1)

@ruddra答案是正确的,但在Chrome浏览器中无法正常工作。不过,它可以在Firefox上运行。

大量阅读后,我得以理解问题所在。这对于面临相同问题的人可能很有用。

在django项目页面上访问'sessions' section时,您会看到(在“浏览器时长会话与持久性会话”下):

某些浏览器(例如Chrome)提供的设置可让用户在关闭并重新打开浏览器后继续浏览会话。在某些情况下,这可能会干扰SESSION_EXPIRE_AT_BROWSER_CLOSE设置,并阻止会话在浏览器关闭时过期。在测试启用了SESSION_EXPIRE_AT_BROWSER_CLOSE设置的Django应用程序时,请注意这一点。

使用@ruddra代码,您可以有效地将cookie设置为仅在当前会话中持续:

Firefox:关闭浏览器时会话已关闭

Chrome浏览器:关闭浏览器后,会话未关闭

无论如何,如果您关闭计算机,停止所有Chrome进程或从当前会话(在OS级别)注销,则可以看到django会话已经结束。

这是Chrome的默认行为,我认为与此无关。

答案 2 :(得分:0)

您可以从这个“记住我”项目中引用:

https://github.com/jimfmunro/django-remember-me

,也解决了类似的问题: Create 'remember me' feature in default django login view

您需要设置会话的有效期限:

microsoft/windowsservercore

Django会话设置为2周(SESSION_COOKIE_AGE默认为1209600秒),并且在关闭浏览器时不会过期(SESSION_EXPIRE_AT_BROWSER_CLOSE默认为False)

但是如果必须使用后端功能设置“记住我”复选框,则可以在“登录”自定义表单上执行以下操作。

request.session.set_expiry(1209600) # 2 weeks

答案 3 :(得分:0)

我有一个想法,就是添加另一个如下所示的文件:

secret_code = models.CharField(max_length = 6)

使用 secret_code 字段的主要目的是在登录页面中恢复用户名和密码。

我还考虑了另一种想法,即通过自动存储您的MAC地址或IP地址,但是如果您已切换为从另一台设备登录,这将无法正常工作。

答案 4 :(得分:0)

您是否调查过allauth?这个包将处理大多数身份验证需求,并且它有一个内置的记住我的字段。高度可定制

编辑:allauth 带有内置的“记住我”字段,允许您使用开箱即用的记住我功能。最重要的是,它是高度可定制的。您可以向每个表单添加/删除任何您想要的内容。作为一个非常受欢迎的软件包,网上有很多教程解释如何使用它。