Flask-Login требует, чтобы вы использовали класс для представления пользователей, а не необработанный дикт.
Как описано в документации , этот класс должен реализовывать некоторые свойства и методы, включаяis_active()
метод.
Класс UserMixin
является базовым классом, который обеспечивает реализации по умолчанию для всех необходимых свойств и методов, и вы можете расширить его и создать простой класс User.
Обновление : добавлен пример
Исходя из того, что у вас уже есть, самое простое, что вы можете сделать, это:
- создатьпользовательский класс
User
, который расширяет UserMixin
- , хранит объект
json
из MongoDB внутри User
class - , переопределяя методы, для которых требуется поведение, отличное от поведения по умолчаниюone
- В маршруте
/login
создайте экземпляр класса User
и передайте его flask_login.login_user()
Класс пользователя
class User(UserMixin):
def __init__(self, user_json):
self.user_json = user_json
# Overriding get_id is required if you don't have the id property
# Check the source code for UserMixin for details
def get_id(self):
object_id = self.user_json.get('_id')
return str(object_id)
Длявсе методы / свойства (is_authenticated
, is_active
, is_anonymous
), кроме get_id
, используют реализации по умолчанию.Если вам не нужны реализации по умолчанию, вам не нужно расширять UserMixin
, но вы должны реализовать все методы самостоятельно.
Использование класса User в маршруте входа в систему
@app.route("/login", methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
users = mongo.db.users
loginuser_json = users.find_one({'email': form.email.data})
if loginuser_json and bcrypt.check_password_hash(loginuser_json['password'], form.password.data):
# Create a custom user and pass it to login_user:
loginuser = User(loginuser_json)
login_user(loginuser, remember=form.data.remember)
return redirect(url_for('home'))
else:
flash('Login Unsuccessful. Please check username and password', 'danger')
return render_template('login.html', title='Login', form=form)
Помните, что вы также должны предоставить user_loader
, как описано здесь .Например, с учетом user_id
выполните запрос к MongoDB и верните объект User
:
@login_manager.user_loader
def load_user(user_id):
users = mongo.db.users
user_json = users.find_one({'_id': ObjectId(user_id)})
return User(user_json)
Полезные ссылки