You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中如何在路由间传递值 渲染模板时怎么向路由传参

Flask中渲染模板时向路由传递参数的实现方法

要将用户名传递给PROFILE动态路由,你可以通过以下方式实现,同时修复现有代码的问题:

1. 修正登录路由逻辑

现有登录路由存在变量调用顺序错误、登录成功后直接渲染模板而非跳转路由的问题,修改后代码如下:

from flask import redirect, url_for

@ui.route('/login', methods=['GET' , 'POST'])
def login():
    if request.method == "POST":
        # 先获取表单提交的账号密码
        username = request.form.get('username')
        password = request.form.get('password')
        # 再查询对应账号
        usr = User.query.filter_by(username=username).first()
        if not usr or not check_password_hash(usr.password, password):
            flash('Wrong creds')
            return render_template('login.html')
        else:
            # 用url_for生成PROFILE路由的地址,传入usrname参数后跳转
            return redirect(url_for('PROFILE', usrname=username)) 
    return render_template('login.html')

核心逻辑是使用url_for()函数,将动态路由需要的参数作为关键字参数传入,即可自动拼接出对应路径,再配合redirect()完成跳转,即可把参数传递给目标路由。

2. 模板内传递参数到路由的方法

如果需要在HTML模板中生成指向个人页的链接,直接在模板语法中调用url_for传入参数即可:

<!-- 示例:在任意模板中插入跳转个人页的链接 -->
<a href="{{ url_for('PROFILE', usrname=usrname) }}">查看我的个人资料</a>

3. 修正PROFILE路由的问题

现有PROFILE路由的else分支缺少return语句,会触发视图无返回值的报错,修改后代码如下:

@ui.route('/PROFILE/<usrname>', methods=['GET','POST'])
def PROFILE(usrname):
    usr = User.query.filter_by(username=usrname).first()
    if not usr:
        flash('用户不存在')
        return redirect(url_for('login'))
    if request.method == "POST":
        TEXT = request.form.get('text')
        usr.text = TEXT
        db.session.add(usr)
        db.session.commit()
        # 提交成功后可以返回当前页或者其他页面
        return render_template('profile.html', usr=usr)
    else:
        # 必须加return返回模板
        return render_template('add_text.html', usr=usr)

注意事项

  • 路由名称大小写敏感,调用url_for时需要和定义的路由函数名PROFILE保持完全一致
  • 生产环境更推荐使用Flask-Login扩展管理用户会话,避免直接在URL中传递用户名带来的伪造风险

内容的提问来源于stack exchange,提问作者packetsniffer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 07:24:02