基于Django和Session实现简易密码登录/登出,记住登录功能失效求助
Django密码保护页面功能修复方案
先梳理代码里的核心问题,再直接上修复后的完整代码:
存在的问题
- Session判断语法错误:
request.session.get(['staylogged'] == True)写法完全错误,get()方法的参数是session的键名,不能把条件表达式塞进去 - Session变量冗余:没必要用字典存
staylogged,直接存布尔值就行,徒增判断复杂度 - 复选框值处理错误:表单里的复选框勾选时提交的是
'on',未勾选则不会出现在POST数据里,直接用request.POST.get("staylogged")拿不到正确的布尔值 - 登出逻辑不对:把
staylogged设为False没用,应该直接删除这个session键,彻底清除登录状态 - 未处理"不记住登录"的情况:原来的代码里未勾选时没设置session,但登录成功后直接跳转,下次访问还是会回到登录页,不符合预期
修复后的代码
import os from django.shortcuts import render, redirect def investors(request): """ 处理投资者登录逻辑:已登录(session存在staylogged)则直接进入页面; 提交表单验证密码,正确则设置session(勾选记住登录则延长有效期),错误跳转到错误页 """ # 检查session中是否存在有效的登录状态 if request.session.get('staylogged'): return render(request, 'home/investors.html') # 处理表单提交 if request.method == 'POST': password = request.POST.get("password") # 处理复选框:勾选则为True,未勾选为False staylogged = request.POST.get("staylogged") == 'on' if password == os.environ.get('INVESTOR_PASSWORD'): # 设置登录状态session request.session['staylogged'] = True # 如果勾选记住登录,设置session有效期为7天(可自行调整) if staylogged: # 单位:秒,60*60*24*7 = 7天 request.session.set_expiry(604800) # 登录成功跳转到受保护页面 return render(request, 'home/investors.html') else: # 密码错误跳转到错误页 return redirect('investorerror') # GET请求返回登录页面 return render(request, 'home/investorlogin.html') def logout(request): """清除登录状态,返回登录页""" # 删除对应的session键,彻底清除登录状态 if 'staylogged' in request.session: del request.session['staylogged'] # 也可以用request.session.flush()清空整个session,更彻底 # request.session.flush() return redirect('investors')
关键修改说明
- Session判断修正:改成
request.session.get('staylogged'),直接获取键对应的值,存在且为True时判定为已登录 - 复选框处理:用
request.session.get('staylogged')把表单返回的字符串转成布尔值,确保判断准确 - Session简化:直接把
request.session['staylogged']设为布尔值True,不需要嵌套字典 - 记住登录功能优化:勾选时用
request.session.set_expiry()设置session的过期时间,未勾选则保持Django默认的会话有效期(浏览器关闭即失效) - 登出逻辑修正:删除session中的
staylogged键,彻底清除登录状态,而不是设为False
内容的提问来源于stack exchange,提问作者julietS
相关产品推荐
相关产品推荐

