1

I am learning python with flask, flask-mysqlbd, flask-login and flask-WTF for web development at the moment and I would like to solve this doubt.

How can I pass data between routes?

I come from .net core 6 and for example to share data I used a lot of viewbags or tempdata to pass data between routes or between routes and templates to give an example.

I have this code and I would like to share the user variable that creates the route login with the route 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')

My idea is that with an if, when accessing route edit_user, check if the user is administrator or common, in the case of being common, I want it to be redirected to login, for that I want to use this.

@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')

what will be the way to share data between routes?

  • You could use session variables. https://stackoverflow.com/questions/27611216/how-to-pass-a-variable-between-flask-pages – Jason Chia Feb 07 '23 at 15:40
  • If you want to use the currently logged in user, you may be able to use [`current_user`](https://flask-login.readthedocs.io/en/latest/#flask_login.current_user) and avoid propagation between endpoints. The `login_required` decorator ensures that the user is logged in and not anonymous and `current_user` acts as a proxy to the current user. – Detlef Feb 07 '23 at 16:40

0 Answers0