Flask中如何在路由间传递数据?含角色权限校验需求
问题
本人目前正在学习使用Flask、flask-mysqldb、flask-login和flask-WTF进行Web开发,此前使用.NET Core 6时常用ViewBag或TempData在路由间及路由与模板间传递数据。现有如下代码,希望将login路由中创建的user变量传递给edit_user路由,以实现访问edit_user路由时校验用户角色:若为普通用户则重定向至登录页,请问该如何实现路由间的数据传递?
原代码示例
db = MySQL(app) login_manager_app = LoginManager(app) @login_manager_app.user_loader def load_user(id): return ModelUser.get_by_id(db, id) @app.route('/') def index(): return redirect(url_for('login')) @app.route('/login', methods = ['GET', 'POST']) def login(): if request.method == 'POST': user = User(0, request.form['username'], request.form['password']) logged_user = ModelUser.login(db, user) if logged_user != None: if logged_user.password: if logged_user.roll == "administrador": login_user(logged_user) return redirect(url_for('home_Admin')) else: if logged_user.roll == "comun": login_user(logged_user) return redirect(url_for('home_Comun')) else: flash("No tienes un rol designado...") return render_template('auth/login.html') else: flash("Contraseña incorrecta...") return render_template('auth/login.html') else: flash("Usuario no encontrado...") return render_template('auth/login.html') else: return render_template('auth/login.html') @app.route('/logout') def logout(): logout_user() return redirect(url_for('login')) @app.route('/home_Admin') @login_required def home_Admin(): return render_template('home/home_Admin.html') @app.route('/edit_user') @login_required def edit_user(): return render_template('panel_admin/edit_user.html')
预期实现的edit_user路由逻辑
@app.route('/edit_user') @login_required def edit_user(): logged_user = ModelUser.login(db, user) if logged_user.roll == "comun": flash("No tienes permisos...") return redirect(url_for('login')) else: flash("No tienes un rol designado...") return render_template('panel_admin/edit_user.html')
解决方案
不需要手动在路由间传递user变量,flask-login已经内置了用户会话管理机制,直接通过current_user对象就能获取当前登录的用户信息,具体修改步骤如下:
1. 导入current_user
首先在代码顶部导入flask-login提供的current_user:
from flask_login import login_user, logout_user, login_required, current_user
2. 修改edit_user路由逻辑
直接使用current_user替代手动查询用户的逻辑,简化后的代码如下:
@app.route('/edit_user') @login_required def edit_user(): # 直接通过current_user获取当前登录用户的角色 if current_user.roll == "comun": flash("你没有权限访问此页面...") return redirect(url_for('login')) elif current_user.roll != "administrador": flash("你没有被分配有效角色...") return redirect(url_for('login')) else: return render_template('panel_admin/edit_user.html')
关键说明
@login_required装饰器已经保证访问该路由的用户处于登录状态,所以current_user必然是有效的用户对象,无需再次调用ModelUser.login重复查询。- 如果需要在模板中使用用户信息,也可以直接在模板里调用
{{ current_user.username }}、{{ current_user.roll }}等属性,效果和.NET的ViewBag类似,无需手动向模板传递变量。
内容的提问来源于stack exchange,提问作者Fabian Jara
相关产品推荐
相关产品推荐

