It turns out to log in, but when I send an incorrect login or password, I get an error
AttributeError: 'NoneType' object has no attribute 'is_active'
I'm confused with g.user , which is announced before @ app.route
@app.before_request def before_request(): g.user = current_user and the solution does not seem to be correct:
user = User.query.filter_by(email=form.email.data,password=form.password.data).first() models:
from app import db,unicode,UserMixin ROLE_USER = 0 ROLE_ADMIN = 1 class User(UserMixin,db.Model): id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(64), index = True, unique = True) email = db.Column(db.String(120), index = True, unique = True) password = db.Column(db.String(120), index = True) role = db.Column(db.SmallInteger, default=ROLE_USER) def __init__(self, id, username, email, password, role): self.id = id self.username = username self.email = email self.password = password self.role = role def get_id(self): return self.id def is_authenticated(self): return True def is_active(self): return True def is_anonymous(self): return False def __repr__(self): return 'ID: %r ' % (self.id) + ' USERNAME: %r ' % (self.username) + ' EMAIL: %r ' % (self.email) + ' PASSWORD: %r ' % (self.password) + ' ROLE: %r ' % (self.role) views:
@lm.user_loader def load_user(id): return User.query.get(id) @app.route('/login', methods=('GET', 'POST')) def login(): if g.user is not None and g.user.is_authenticated: return redirect(url_for('index', title=g.user.username)) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data,password=form.password.data).first() print('USER :' + str(user)) print('G.USER :' + str(g.user)) print('USER LOGIN IS : ' + str(login_user(user))) login_user(user) return redirect(url_for('index')) return render_template('login.html', form=form) forms:
class LoginForm(Form): email = StringField('Email', validators=[DataRequired()]) password = PasswordField('New Password', validators=[DataRequired()]) remember_me = BooleanField('Remember me', default=False)
Noneforlogin_userNonefor some reason, and that falls - andreymallogin_useryou specify which object to bind, Flask-Login retrieves the id from there and saves it in the session, and on subsequent requests to the site it callsload_userto load the object again by id stored in the session. That's it, nothing more is not here. Inload_useryou can return None. But you can NOT transfer None tologin_user. - andreymal