如何在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
相关产品推荐
相关产品推荐

