AttributeError: объект 'dict' не имеет атрибута 'is_active' (PyMongo And Flask) - PullRequest
0 голосов
/ 21 ноября 2018
@app.route("/register", methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        users = mongo.db.users
        hash_password=bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        eml=form.email.data
        gen=form.gender.data
        ctry=form.country.data
        profile={'name' : form.username.data, 'password' :hash_password,'email':eml,'gender':gen,'country':ctry}
        users.insert(profile)
        #users.insert({'name' : form.username.data, 'password' :form.password.data})
        flash(f'Your has been Account created for Username {form.username.data}!, You can login', 'success')
        return redirect(url_for('login'))
        #return redirect(url_for('home'))
    return render_template('register.html', title='Register', form=form)

@app.route("/login", methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        users = mongo.db.users
        loginuser = users.find_one({'email' : form.email.data})
        if loginuser and bcrypt.check_password_hash(loginuser['password'],form.password.data):
        #if form.email.data == 'admin@blog.com' and form.password.data == 'password':
            login_user(loginuser,remember=form.data.remember)
            return redirect(url_for('home'))
            #flash('You have been logged in!', 'success')
            #return redirect(url_for('home'))
        else:
            flash('Login Unsuccessful. Please check username and password', 'danger')
    return render_template('login.html', title='Login', form=form)

Я создал простой метод регистрации и входа в систему, используя колбу с комбинацией пимонго.Теперь для управления сеансом пользователя я использую flask_login, но он выдает мне эту ошибку AttributeError: у объекта 'dict' нет атрибута 'is_active'

решение, которое я нашел в другом посте, заключалось в добавлении UserMaxIn в UserClass, но у меня нетлюбой класс для пользовательской модели, и я не хочу, чтобы он либо

, что было бы решением этой ошибки?

1 Ответ

0 голосов
/ 21 ноября 2018

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)

Полезные ссылки

...