基于Flask、Python、HTML的问答测验判分及结果展示问题求助
解决Flask问答测验的判分与结果展示问题
我来帮你拆解并解决这个问题,核心痛点就是路由间数据共享和判分逻辑实现这两点,咱们一步步来:
1. 解决路由间无法访问quizquestions的问题
HTTP是无状态协议,不同路由之间默认没法直接共享变量,这里推荐用Flask的session来存储测验题目数据——它能在用户会话中临时保存数据,实现跨路由访问。
步骤1:配置Session密钥
首先得给Flask app配置一个密钥,不然session功能没法启用:
from flask import Flask, session, redirect, url_for, request, render_template app = Flask(__name__) app.secret_key = 'your_secure_secret_key_here' # 换成自己的密钥,生产环境要保密
步骤2:在/quiz路由中存储题目到Session
当用户提交分类和题目数量后,把查询到的quizquestions转成可序列化的格式(比如字典列表)存进session:
@app.route('/quiz', methods=['POST']) def quiz(): # 获取用户选择的参数 category = request.form.get('category') num_questions = int(request.form.get('num_questions')) # 从数据库查询对应题目(这里假设你的查询逻辑已实现) quizquestions = YourQuestionModel.query.filter_by(category=category).limit(num_questions).all() # 将SQLAlchemy对象转成字典列表(因为对象不能直接存在session里) session['quizquestions'] = [ { 'id': q.id, 'question_text': q.question_text, 'options': q.options, # 假设是列表格式,若为字符串可按分隔符拆分 'correct_answer': q.correct_answer } for q in quizquestions ] return redirect(url_for('questionpage'))
步骤3:在/questionpage路由中读取Session数据
现在就能在questionpage路由里取出之前存的题目了:
@app.route('/questionpage') def questionpage(): quizquestions = session.get('quizquestions', []) if not quizquestions: # 若没有数据,跳回初始选择页面 return redirect(url_for('quiz_selection')) # 替换成你的初始页面路由 return render_template('questionpage.html', questions=quizquestions)
2. 实现判分逻辑并区分正误题目
接下来处理用户提交的答案,对比正确答案,计算得分并记录每个题目的对错状态。
步骤1:修改questionpage.html的表单结构
每个题目要关联唯一标识(比如题目ID),这样提交时能对应到正确的题目:
<form method="POST" action="{{ url_for('check') }}"> {% for question in questions %} <div class="question-card"> <h3>{{ loop.index }}. {{ question.question_text }}</h3> {% for option in question.options %} <input type="radio" name="answer_{{ question.id }}" value="{{ option }}" required> <label>{{ option }}</label><br> {% endfor %} </div> {% endfor %} <button type="submit">提交答案</button> </form>
步骤2:在/check路由中处理判分逻辑
从session取出题目,和用户提交的答案逐一对比,生成结果数据:
@app.route('/check', methods=['POST']) def check(): quizquestions = session.get('quizquestions', []) if not quizquestions: return redirect(url_for('quiz_selection')) score = 0 results = [] for question in quizquestions: # 获取用户提交的对应题目答案 user_answer = request.form.get(f'answer_{question["id"]}') is_correct = user_answer == question['correct_answer'] if is_correct: score += 1 # 记录每个题目的结果详情 results.append({ 'question_text': question['question_text'], 'user_answer': user_answer, 'correct_answer': question['correct_answer'], 'is_correct': is_correct }) # 可选:清空session中的题目数据,避免重复使用 session.pop('quizquestions', None) return render_template('check.html', results=results, score=score, total=len(quizquestions))
步骤3:在check.html中展示区分正误的结果
用样式直观区分正确和错误的题目:
<h1>测验结果</h1> <p>你的得分:{{ score }}/{{ total }}</p> {% for result in results %} <div class="result-item {% if result.is_correct %}correct{% else %}incorrect{% endif %}"> <h3>{{ loop.index }}. {{ result.question_text }}</h3> <p>你的答案:{{ result.user_answer }}</p> <p>正确答案:{{ result.correct_answer }}</p> </div> {% endfor %} <style> .correct { color: #2ecc71; border-left: 4px solid #2ecc71; padding-left: 10px; margin: 10px 0; } .incorrect { color: #e74c3c; border-left: 4px solid #e74c3c; padding-left: 10px; margin: 10px 0; } </style>
额外小提示
- 如果你的题目选项是数据库中存储的字符串(比如用逗号分隔),记得在序列化时拆成列表:
q.options.split(',') - 生产环境中,建议用Redis或数据库存储session,默认的cookie存储仅适合小型应用
- 可以给测验结果页面添加“重新开始”按钮,跳回初始选择页面
内容的提问来源于stack exchange,提问作者noobcs
相关产品推荐
相关产品推荐

