
本文介绍在 flask 中实现从列表页点击申请人姓名跳转至其专属详情页的完整方案,核心是利用 url 查询参数(如 `?phone=123`)安全传递标识字段,并在目标路由中查询并渲染对应数据库记录。
在 Flask Web 开发中,实现“列表页 → 详情页”的数据联动是常见需求。关键在于:不直接传递整个对象或敏感数据,而是通过唯一标识符(如手机号、ID)作为 URL 参数进行轻量、可追溯的跳转。以下是分步实践指南:
✅ 第一步:修改列表页链接,动态注入查询参数
在你的 applicant-report.html 模板中,将静态链接 改为携带 phone 参数的动态链接:
{% for report in reports %}
{% for a in applicant %}
{% if a.phone == report.applicant_phone %}
{{ a.name }}
{% endif %}
{% endfor %}
O: {{ (report.op * 100) | round(1) }}%
C: {{ report.co * 100 | round(1) }}%
E: {{ report.ex * 100 | round(1) }}%
A: {{ report.ag * 100 | round(1) }}%
N: {{ report.ne * 100 | round(1) }}%
{% endfor %}? 提示:使用 {{ a.phone }} 确保每个链接携带对应申请人的唯一手机号;避免空值导致 404,可在模板中加 {% if a.phone %}...{% endif %} 安全包裹。
✅ 第二步:定义详情页路由,解析参数并查库
在 Flask 后端(如 app.py),新增 /applicant-report 路由,使用 request.args.get() 获取 URL 参数,并执行精确查询:
from flask import Flask, render_template, request
from your_models import Applicant, db # 替换为实际模型路径
@app.route('/applicant-report')
def applicant_report():
phone = request.args.get('phone', '').strip()
if not phone:
return "⚠️ 错误:未提供申请人手机号", 400
applicant = Applicant.query.filter_by(phone=phone).first()
if not applicant:
return "❌ 未找到该申请人信息", 404
return render_template('applicant-detail.html', applicant=applicant)⚠️ 注意事项:
- 始终校验参数是否存在(.get('phone', '') + if not phone);
- 使用 .first() 而非 .all(),确保只取单条匹配记录;
- 若 phone 非唯一字段,建议改用主键 id(更健壮),链接改为 ?id={{ a.id }},查询改为 filter_by(id=id)。
✅ 第三步:创建详情页模板,安全渲染数据
新建 applicant-detail.html,直接使用传入的 applicant 对象渲染:
申请人详情:{{ applicant.name }}
- 电话:{{ applicant.phone }}
- 邮箱:{{ applicant.email or '未填写' }}
- 学历:{{ applicant.education or '未知' }}
? 安全提醒(重要!)
- ✅ 推荐使用 id(整型主键)代替 phone 作为路由参数,避免特殊字符、空格或隐私暴露风险;
- ❌ 切勿通过 URL 传递密码、token、身份证号等敏感信息;
- ✅ 生产环境建议对 id 做存在性校验与权限控制(如当前用户是否有权查看该申请人);
- ✅ 可配合 url_for() 构建链接(更灵活):
查看
通过以上三步,即可实现简洁、可靠、符合 Web 最佳实践的数据页间传递。核心思想始终是:URL 传标识,后端查实体,模板只负责展示。










