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

如何在Django后端临时存储60秒内用户的连续输入?

Django临时存储游戏用户输入的实现方案

针对你这款60秒单词输入游戏的临时存储需求,用Django Session完全可行,具体实现步骤如下:

1. 确认Session配置(默认已启用)

Django默认已开启Session功能,默认用数据库存储Session数据,完全适配临时存储场景。如果需要调整,可在settings.py中检查:

SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 默认配置,无需修改
SESSION_COOKIE_AGE = 1209600  # 默认两周有效期,游戏结束后主动清除即可

2. 编写处理用户输入的视图

通过AJAX接收用户每次输入的单词,存储到当前用户的Session中,同时返回实时输入数量:

# views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt  # 开发阶段临时使用,生产环境需替换为CSRF令牌验证

@csrf_exempt
def save_word(request):
    if request.method == 'POST':
        word = request.POST.get('word', '').strip()
        if word:
            # 从Session读取已输入单词列表,不存在则初始化空列表
            words = request.session.get('game_words', [])
            words.append(word)
            # 更新Session数据
            request.session['game_words'] = words
            # 返回当前输入计数
            return JsonResponse({'status': 'success', 'count': len(words)})
        return JsonResponse({'status': 'error', 'message': '单词不能为空'})
    return JsonResponse({'status': 'error', 'message': '仅支持POST请求'})

3. 编写游戏结束的统计与清除视图

计时器结束时,调用该接口统计总输入数并清除Session中的临时数据:

# views.py
@csrf_exempt
def end_game(request):
    if request.method == 'POST':
        words = request.session.get('game_words', [])
        total_count = len(words)
        # 主动清除Session中的游戏数据
        del request.session['game_words']
        return JsonResponse({'status': 'success', 'total_count': total_count})
    return JsonResponse({'status': 'error', 'message': '仅支持POST请求'})

4. 配置URL路由

在urls.py中添加对应路由映射:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('save-word/', views.save_word, name='save_word'),
    path('end-game/', views.end_game, name='end_game'),
]

5. 前端AJAX配合(实现无刷新提交)

用JavaScript监听输入提交事件,通过AJAX发送请求,保证页面不刷新:

<!-- 前端页面示例 -->
<input type="text" id="wordInput" placeholder="输入单词">
<button id="submitBtn">提交</button>
<div id="countDisplay">当前输入数量:0</div>
<div id="timer">剩余时间:60秒</div>

<script>
let timer = 60;
const timerInterval = setInterval(() => {
    timer--;
    document.getElementById('timer').textContent = `剩余时间:${timer}秒`;
    if (timer <= 0) {
        clearInterval(timerInterval);
        endGame();
    }
}, 1000);

// 提交单词逻辑
document.getElementById('submitBtn').addEventListener('click', () => {
    const word = document.getElementById('wordInput').value.trim();
    if (!word) return;
    
    fetch('/save-word/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `word=${encodeURIComponent(word)}`
    })
    .then(response => response.json())
    .then(data => {
        if (data.status === 'success') {
            document.getElementById('countDisplay').textContent = `当前输入数量:${data.count}`;
            document.getElementById('wordInput').value = ''; // 清空输入框
        }
    });
});

// 结束游戏逻辑
function endGame() {
    fetch('/end-game/', {
        method: 'POST'
    })
    .then(response => response.json())
    .then(data => {
        alert(`游戏结束!你总共输入了${data.total_count}个单词`);
        // 可在此处添加页面重置逻辑
    });
}
</script>

关键注意事项

  • CSRF令牌:生产环境请勿使用csrf_exempt,建议在前端AJAX请求中携带CSRF令牌(可通过页面中自动生成的csrfmiddlewaretoken值添加到请求头或表单数据)。
  • 会话隔离:Django Session基于用户会话自动隔离,不同用户的输入数据不会互相干扰。
  • 数据清理:游戏结束后主动调用del request.session['game_words'],确保临时数据及时删除,避免Session冗余。

内容的提问来源于stack exchange,提问作者Mengzhu Ou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:11