如何在 Flask 应用中通过 URL 参数传递单条数据库记录至详情页

本文介绍在 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 传标识,后端查实体,模板只负责展示