request.session列表元素移除失效问题排查求助
问题分析与修复方案
你的代码存在两个核心问题,导致只能显示前两个问题:
1. 未定义变量引发POST请求异常
在POST分支里有一行print(name),但name变量从未被定义。当用户第二次点击「下一个」(即第二次发送POST请求)时,会直接触发NameError,程序中断,无法加载后续问题。
2. GET请求重复重置问题列表
每次用户刷新页面或通过GET方式访问视图时,request.session['questions']都会被重新初始化为包含4个问题的列表,直接覆盖之前的进度。正确逻辑应该是仅当session中没有questions键时才初始化列表。
修复后的代码
def game(request): if request.method == 'GET': # 仅在session无问题列表时初始化,避免重置进度 if 'questions' not in request.session: request.session['questions'] = ['question1','question2','question3','question4'] q = request.session['questions'].pop(0) # 手动标记session已修改,确保Django保存更新后的列表 request.session.modified = True form = QForm({'question':q}) return render(request, 'game.html', {'form':form}) else: # 处理POST请求,先判断问题列表是否还有剩余 if len(request.session.get('questions', [])) > 0: q = request.session['questions'].pop(0) request.session.modified = True form = QForm({'question':q}) return render(request, 'game.html', {'form':form}) else: return redirect('home')
额外说明
- 添加
request.session.modified = True是因为Django默认不会自动检测列表类型的修改,手动标记后能确保session的更新被正确保存。 - 用
request.session.get('questions', [])避免当session中无questions键时触发KeyError。
内容的提问来源于stack exchange,提问作者Yoda182
相关产品推荐
相关产品推荐

