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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:25:30