2
votes

I'm working with flask-login combine with postgreSQL. Whenever, I have a decorator @login_required before any def it not redirect to that specific def. Here my code:

init.py

app = Flask(__name__)
app.config.from_object('config')

db = SQLAlchemy(app)
lm = LoginManager()
lm.init_app(app)
lm.login_message = "Login please"
lm.login_view = "signin"
from app import views

My models:

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(150))
user_name = db.Column(db.String(80), unique=True)
password = db.Column(db.String(64))
role = db.Column(db.Integer)
activate = db.Column(db.Boolean)

def is_authenticated(self):
    return True

def is_active(self):
    return self.activate

def is_anonymous(self):
    return False

def get_id(self):
    try:
        return unicode(self.id)  # python 2
    except NameError:
        return str(self.id)  # python 3

And here my view:

@lm.user_loader
def load_user(id):
  return User.query.get(int(id))

@app.route('/signin', methods=['GET', 'POST'])
def signin():
   form = LoginForm()

   if request.method == "POST":

     if current_user is not None and current_user.is_authenticated():
        return redirect(url_for('first'))

    user = User.query.filter(User.user_name == form.user_name.data, User.password == form.password.data).first()
    login_user(user, remember=True)
    session['signed'] = True
    session['username'] = user.user_name
    if session.get('next'):
        next_page = session.get('next')
        session.pop('next')
        return redirect(next_page)
    else:
        return redirect(url_for('first'))
 else:
    session['next'] = request.args.get('next')
    return render_template('log_in.html', form=form)

@app.route('/')
def first():
  return render_template("layout.html")

@app.route('/main')
@login_required
def main():
   return render_template("main.html")

So from here, whenever I go to the url: localhost:5000/main it showoff a log in pages( if i'm not log in yet), but after it I enter input to form this what I have in the command line:

127.0.0.1 - - [09/Mar/2015 00:37:39] "GET /signin?next=%2Fmain HTTP/1.1" 200 -
127.0.0.1 - - [09/Mar/2015 00:37:47] "POST /signin HTTP/1.1" 302 -
127.0.0.1 - - [09/Mar/2015 00:37:47] "GET /main HTTP/1.1" 302 -
127.0.0.1 - - [09/Mar/2015 00:37:47] "GET /signin?next=%2Fmain HTTP/1.1" 200 -

It looks like after it make a POST request it try to GET a main def however, the system not allow and return a login page again.

1
Can you fix the indentation of signin?dirn
Is your browser configured to accept cookies?Miguel

1 Answers

2
votes

I have playing around and recognize I need to put session['user_id'] = form.user.id in order to make a login_user works