如何在 Flask 应用中通过 URL 参数传递单条数据库记录信息实现页面跳转

本文介绍在 flask 中如何从列表页(如申请人报告页)点击某位申请人姓名,跳转至详情页并动态加载其专属数据,核心是利用 url 查询参数安全传递标识字段(如手机号),并在目标路由中查询数据库渲染对应记录。

在 Flask Web 开发中,实现“列表页 → 详情页”的数据联动是常见需求。你已成功在 applicant-report 列表页中遍历并展示申请人报告(reports),并通过内层循环匹配 applicant 表获取姓名。但当前链接 是静态的,无法区分点击的是哪位申请人——关键在于将唯一标识(如手机号)作为 URL 参数传递过去

✅ 正确做法:URL 查询参数传参

修改你的模板链接,将 a.phone 动态注入 URL 的查询字符串中:

{% 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 %}
? 提示:为避免重复嵌套循环影响性能,建议在后端视图中预先关联 reports 与 applicant(例如使用 SQLAlchemy join 或 relationship),再一次性传入模板。但当前方案可快速验证逻辑。

? 后端路由接收与查询

在 Flask 路由中,使用 request.args.get() 获取 URL 中的 phone 参数,并执行精确查询:

from flask import Flask, render_template, request
from your_app.models import Applicant, Report  # 替换为实际模型路径
from your_app import db  # 替换为实际 db 实例

@app.route('/applicant-report')
def applicant_report():
    phone = request.args.get('phone')

    # 安全校验:确保参数存在且非空
    if not phone:
        return "Error: Applicant phone number is required.", 400

    # 查询申请人(假设 Applicant 模型有 phone 字段)
    applicant = db.session.query(Applicant).filter_by(phone=phone).first()

    if not applicant:
        return "Error: Applicant not found.", 404

    # 可选:同时查出该申请人的最新报告(增强健壮性)
    report = db.session.query(Report).filter_by(applicant_phone=phone).first()

    return render_template('applicant-detail.html', applicant=applicant, report=report)

⚠ 注意事项与最佳实践

  • 安全性:URL 参数可见且可篡改,切勿传递敏感信息(如密码、身份证号明文、token)。仅使用唯一、非敏感标识符(如 phone、id)。
  • 健壮性:始终检查 request.args.get() 返回值是否为 None 或空字符串,并做 400/404 错误处理。
  • 数据库优化:若 phone 字段未建索引,高频查询可能变慢,请在模型中添加:
    class Applicant(db.Model):
        # ...
        phone = db.Column(db.String(20), index=True)  # 添加 index=True
  • 扩展性:如需传多个参数(如 id + lang),用 & 连接:
    href="/applicant-report?phone={{a.phone}}&lang=zh",后端用 request.args.get('lang', 'en') 设置默认值。

✅ 最终效果

点击姓名后,浏览器跳转至类似 /applicant-report?phone=13800138000 的地址,后端精准查出该申请人及其报告数据,并渲染到 applicant-detail.html 模板中——真正实现“所见即所得”的单记录详情页。

此模式简洁、标准、无状态,是 Flask 中页面间轻量数据传递的推荐方案。