middlewarfe中的代码是这样的
urllist2 = ['/web/login', '/web/logout', '/web/dologin']
if re.match(r'^/web',path)and (path not in urllist2):
#判断是否登录(在于session中没有adminuser)
if 'adminuser' not in request.session:
#重定向到登录页
return redirect(reverse("web_login"))
index的代码是这样的
def index(request):
''' 项目前段,企业搜索'''
return redirect(reverse("web_index"))
def webindex(request):
''' 项目前段,企业搜索'''
return render(request,"web/index.html")
#管理员登录表单
def login(request):
return render(request,'web/login.html')
#执行管理员登录
def dologin(request):
try:
#根据登录账号获取登 录者信息
user = User.objects.get(username=request.POST['username'])
#判断当前用户是否是管理员
if user.status == 1:
#判断登录密码是否相同
import hashlib
md5 = hashlib.md5()
s = request.POST['pass']+user.password_salt #从表单中获取密码并添加干扰值
md5.update(s.encode('utf-8')) #将要产生md5的子串放进去
if user.password_hash == md5.hexdigest(): #获取md5值
print('登录成功')
#将当前登录成功的用户信息以adminuser为key写入到session中
request.session['adminuser'] = user.toDict()
#重定向到后台管理首页
return redirect(reverse("web_index"))
else:
context = {"info":"登录密码错误!"}
else:
context = {"info":"无效的登录账号!"}
except Exception as err:
print(err)
context = {"info":"登录账号不存在"}
return render(request,"web/index.html",context)
#管理员退出
def logout(request):
del request.session['adminuser']
return redirect(reverse("myadmin_login"))
url是这样的
path('login', index.login, name="web_login"), #加载登录表单
path('dologin', index.dologin, name="web_dologin"), #执行登录
path('logout', index.logout, name="web_logout"), #退出
path("web/", include([
path('', index.webindex, name = 'web_index'),
])),
再setting.py中配置如下参数即可:
SESSION_COOKIE_AGE = 60*30#设置session过期时间为30分钟
SESSION_EXPIRE_AT_BROWSER_CLOSE = True#当浏览器被关闭的时候将session失效,但是不能删除数据库的session数据
SESSION_SAVE_EVERY_REQUEST = True#每次请求都要保存一下session
用cookie
参考GPT和自己的思路:要实现在关闭页面之后自动登出的功能,可以使用JavaScript监听窗口关闭事件,并在窗口关闭时通过AJAX请求向后端发送一个退出登录的请求。具体实现可以按照以下步骤进行:
1 在前端页面中添加如下代码,用于监听窗口关闭事件:
window.onbeforeunload = function() {
// 发送退出登录请求
var xhr = new XMLHttpRequest();
xhr.open('GET', '/logout', false);
xhr.send();
}
2 在后端代码中添加一个新的URL,用于处理退出登录的请求:
path('logout', index.logout, name="web_logout"), #退出
3 在 index.py 中添加 logout 函数,用于处理退出登录的请求:
def logout(request):
if 'adminuser' in request.session:
del request.session['adminuser']
return HttpResponse('logout success')
这样,当用户关闭窗口时,就会自动向后端发送一个退出登录的请求,后端会删除用户的登录状态。需要注意的是,在使用 onbeforeunload 监听窗口关闭事件时,要保证请求是同步的,即将 open 函数的第三个参数设置为 false,否则在一些浏览器中可能无法正常工作。
给你提供一种思路参考:
对于关闭页面后自动登出的功能,可以使用 beforeunload 事件。这个事件会在页面关闭或刷新之前触发,我们可以在这个事件中向服务器发送一个请求来告诉服务器当前用户已经离线,然后清除用户的登录状态
window.addEventListener("beforeunload", function(event) {
// 向服务器发送请求,告诉服务器当前用户已经离线
var xhr = new XMLHttpRequest();
xhr.open("GET", "/logout", false);
xhr.send();
});
然后再配合setTimeout 函数来在一定时间后调用一个函数,这个函数会向服务器发送一个请求来告诉服务器当前用户已经离线,然后清除用户的登录状态
// 登录成功后调用此函数,设置定时器
function setLogoutTimer() {
setTimeout(function() {
// 向服务器发送请求,告诉服务器当前用户已经离线
var xhr = new XMLHttpRequest();
xhr.open("GET", "/logout", false);
xhr.send();
}, 30 * 60 * 1000); // 30 分钟后自动登出,可以根据需求修改时间
}