Wygląda na to, że możesz nie wiedzieć co obsługuje Flask-Login. Jest tam, aby śledzić wszystko na temat sesji użytkownika po tym, gdy powiesz mu, że uwierzytelnienie zakończyło się sukcesem (przez wywołanie login_user
.) Oddzwanianie user_loader
mówi tylko, jak ponownie załadować obiekt dla użytkownika, który już został uwierzytelniony, na przykład, gdy ktoś ponownie połączy się z sesja "zapamiętaj mnie". Dokumenty nie są specjalnie jasne.
Nie powinno być potrzeby przechowywania flagi w bazie danych dla statusu logowania użytkownika. Ponadto, kod, który zawierasz, podniesie AttributeError, jeśli poświadczenia są nieprawidłowe (user = None).
Oto przykład z aplikacji Flask-SQLAlchemy. Używa zewnętrznego źródła uwierzytelnienia i opakowania dla obiektu użytkownika SQLAlchemy, ale proces jest zasadniczo taki sam.
user_loader zwrotna:
@login_manager.user_loader
def load_user(user_id):
user = User.query.get(user_id)
if user:
return DbUser(user)
else:
return None
klasa użytkownika (wrapper dla obiektu sqlalchemy):
# User class
class DbUser(object):
"""Wraps User object for Flask-Login"""
def __init__(self, user):
self._user = user
def get_id(self):
return unicode(self._user.id)
def is_active(self):
return self._user.enabled
def is_anonymous(self):
return False
def is_authenticated(self):
return True
Logowanie obsługi:
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
next = request.args.get('next')
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if authenticate(app.config['AUTH_SERVER'], username, password):
user = User.query.filter_by(username=username).first()
if user:
if login_user(DbUser(user)):
# do stuff
flash("You have logged in")
return redirect(next or url_for('index', error=error))
error = "Login failed"
return render_template('login.html', login=True, next=next, error=error)
Zauważ, że logowania nie powiedzie się, jeśli:
- zewnętrzny auth nie
- zapytania użytkownik zwróci None (użytkownik nie istnieje)
login_user
zwraca False (user.is_active() == False
)
Wyloguj
@app.route('/logout')
@login_required
def logout():
logout_user()
flash('You have logged out')
return(redirect(url_for('login')))
trzeba @login_required dla metody wylogowania –
dodałem go do wylogowania –
Jakie rzeczy należą do "if login_user (DbUser (user)): # do stuff"? – Mittenchops