You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:59:53