Django本地服务器竞赛网站实现登录60分钟后自动登出
嗨!作为Django新手能搞定第一个竞赛网站项目已经超棒啦~关于用户登录后60分钟自动登出的需求,其实Django本身就有很方便的实现方式,我一步步给你拆解,保证你能看懂:
方法一:全局配置会话超时(最简单)
这是最省心的方式,直接在项目配置里统一设置所有用户的会话过期时间:
- 打开项目根目录的
settings.py文件,找到(没有就手动添加)SESSION_COOKIE_AGE配置项,它默认是1209600秒(也就是两周),把它改成60分钟对应的秒数:# 60分钟 = 60*60秒 SESSION_COOKIE_AGE = 60 * 60 - 确认
SESSION_EXPIRE_AT_BROWSER_CLOSE设置为False(默认就是这个值),这样会话会按你设置的时间自动过期,而不是用户一关浏览器就登出。 - 如果你希望用户在60分钟内有操作的话,自动重置过期时间(比如用户正在答题,动一下鼠标就延长登录时间),那就再加一行配置:
这个配置特别适合竞赛场景,避免用户正在答题的时候突然被登出~# 每次用户发起请求都刷新会话过期时间 SESSION_SAVE_EVERY_REQUEST = True
方法二:针对竞赛用户单独设置(更灵活)
如果你的网站还有其他非竞赛功能的用户,不想让他们也60分钟登出,那可以在竞赛专属的登录视图里,给用户单独设置会话过期时间:
- 找到你的登录视图函数(比如
competition_login),在用户验证成功并登录后,添加这段代码:from django.contrib.auth import login, authenticate from django.shortcuts import redirect, render def competition_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 验证用户身份 user = authenticate(request, username=username, password=password) if user is not None: # 登录用户 login(request, user) # 设置当前会话60分钟后过期 request.session.set_expiry(60 * 60) # 如果要实现「有操作就重置时间」,把上面的参数改成0即可 # request.session.set_expiry(0) # 跳转到竞赛页面 return redirect('competition_home') else: return render(request, 'competition_login.html', {'error': '用户名或密码错误'}) return render(request, 'competition_login.html')
额外优化:给用户加个倒计时提示
为了提升体验,最好在竞赛页面给用户显示剩余登录时间,避免突然登出的尴尬:
- 在竞赛页面的模板里加个倒计时元素:
<div class="timer-notice"> 您的登录剩余时间:<span id="countdown-text">60分0秒</span> </div> - 然后用JavaScript实现倒计时逻辑(可以直接写到模板里):
// 从后端获取剩余秒数,Django的request对象可以直接拿到这个值 let remainingSeconds = {{ request.session.get_expiry_age }}; function updateCountdown() { const minutes = Math.floor(remainingSeconds / 60); const seconds = remainingSeconds % 60; // 格式化显示,比如把1秒变成01秒 const formattedSeconds = seconds.toString().padStart(2, '0'); document.getElementById('countdown-text').textContent = `${minutes}分${formattedSeconds}秒`; if (remainingSeconds > 0) { remainingSeconds--; setTimeout(updateCountdown, 1000); } else { // 时间到了,提示并跳转到登录页 alert('登录已过期,请重新登录后继续竞赛'); window.location.href = '/competition/login/'; } } // 页面加载完成后启动倒计时 window.onload = updateCountdown;
新手必看小提示
- 修改完
settings.py后一定要重启Django服务器,不然配置不会生效! - 测试的时候可以把时间改短一点(比如
SESSION_COOKIE_AGE = 10),这样不用等60分钟就能验证功能是否正常。 - 如果竞赛有提交答案的功能,一定要确保提交操作会刷新会话时间(也就是开启
SESSION_SAVE_EVERY_REQUEST = True),避免用户提交时因为会话过期导致失败。
内容的提问来源于stack exchange,提问作者Piyush Mittal
相关产品推荐
相关产品推荐

