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
相关产品推荐
相关产品推荐

