实际上,我不仅仅是想编写代码,而是想了解我需要学习的所有主题,以便在登录页面上设置“记住我”的键。 它是一个内置的django登录页面,我对会话和缓存有一点了解,但不足以使我记住密钥和没有缓存的用户。 如果您可以为我提供答案或资料来源,将会很有帮助
答案 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 带有内置的“记住我”字段,允许您使用开箱即用的记住我功能。最重要的是,它是高度可定制的。您可以向每个表单添加/删除任何您想要的内容。作为一个非常受欢迎的软件包,网上有很多教程解释如何使用它。