Mikołaj Nyga
Mikołaj Nyga

Reputation: 11

Flask is_authenticated user status changes while redirecting to another endpoint

Im trying to make and endpoint (addurl) which will be only avaliable for logged in users. The problem that occurs is that when Im loggin in on /login endpoint current_user.is_authenticated returns '<bound method User.is_authenticated of <User 2>>' (after login_user(user)). However while redirecting to /addurl current_user.is_authenticated is somehow overwritten and changes to False. How can i solve this?

CODE

model:

from app import db, login_manager


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(1024))



    def is_active(self):
        """True, as all users are active."""
        return True

    def get_id(self):
        """Return the email to satisfy Flask-Login's requirements."""
        return self.email

    def is_authenticated(self):
        """Return True if the user is authenticated."""
        return self.authenticated

    def is_anonymous(self):
        """False, as anonymous users aren't supported."""
        return False

form:

class LoginForm(FlaskForm):
    email = StringField('Your Username: ', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    submit = SubmitField('Log In')

views:

@app.route("/login", methods=["GET", "POST"])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user and bcrypt.check_password_hash(user.password, form.password.data):

            login_user(user)

            return redirect('/addurl')
        else:
            return render_template('login.html', form=form)
    return render_template('login.html', form=form)


@app.route('/addurl', methods=['GET', 'POST'])
def addurl():
    form = CompanyForm()
    if current_user.is_authenticated:
        if form.validate_on_submit():
            foo()
            return redirect('/base')
    else:
        flash('you have to be logged in')
    return render_template('AddUrl.html', form=form)

Upvotes: 1

Views: 359

Answers (1)

Magnun Leno
Magnun Leno

Reputation: 2738

It looks like you have forgotten to make addurl a 'login_required' route. Try something like this:

from flask_login import login_required

# original source code...

@app.route('/addurl', methods=['GET', 'POST'])
@login_required
def addurl():
    # original source code...

The @login_required decorator should do all the magic you need.

Also, be sure to initialize the LoginManager correctly in app.py:

from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)

Upvotes: 1

Related Questions