использование flask-login с postgresql
Я работаю над приложением колбы, которое нуждается в аутентификации. Я подключил flask-login, но это не кажется очень изящным.
First flask-login должен убедиться, что пользователь существует:
@login_manager.user_loader
def load_user(id):
return User.query.get(id)
но вам также нужно использовать 'login_user' для создания объекта пользователя
# Some code above
user = User.query.filter_by(email = form.email.data, password = form.password.data).first()
user.login_status = 1
db.session.commit()
login_user(objects.SignedInUser(user.id, user.email, user.login_status == LoginStatus.Active))
# Some code below
в коде выше "пользователь" -это модель для postgres, а SignedInUser-это просто объект, который будет использоваться для Flask-login.
у кого-нибудь есть пример Flask-login, используемый с Постгрес?
1 ответов
похоже, вы можете неправильно понять, какие ручки для входа в колбу. Это там, чтобы отслеживать все о сеансе пользователя после того, как вы скажете, что аутентификация прошла успешно (позвонив login_user
.) The user_loader
обратный вызов только говорит ему, как перезагрузить объект для пользователя, который уже прошел проверку подлинности, например, когда кто-то подключается к сеансу "Запомнить меня". В документах это не особо ясно.
не должно быть никакой потребности держать флаг в база данных для статуса входа пользователя. Кроме того, код, который вы включили, вызовет AttributeError, если учетные данные неверны (user = None).
вот пример из приложения Flask-SQLAlchemy. Он использует внешний источник аутентификации и оболочку для пользовательского объекта SQLAlchemy, но процесс в основном тот же.
обратный вызов user_loader:
@login_manager.user_loader
def load_user(user_id):
user = User.query.get(user_id)
if user:
return DbUser(user)
else:
return None
класс пользователя (оболочка для объекта 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
Регистрация обработчик:
@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)
обратите внимание, что логин не выполняется, если:
- сбой внешней аутентификации
- запрос пользователя возвращает None (пользователь не существует)
-
login_user
возвращает False (user.is_active() == False
)
выход
@app.route('/logout')
@login_required
def logout():
logout_user()
flash('You have logged out')
return(redirect(url_for('login')))