Python 属性错误:';dict';对象没有属性';处于活动状态';(PyMongo和烧瓶)

Python 属性错误:';dict';对象没有属性';处于活动状态';(PyMongo和烧瓶),python,flask,pymongo,flask-login,Python,Flask,Pymongo,Flask Login,我使用flask和pymongo的组合创建了一个简单的注册和登录方法。 现在,对于用户会话管理,我使用的是flask\u登录 但它给了我这个错误 AttributeError:'dict'对象没有属性'is_active' 我在另一篇文章中找到的解决方案是在UserClass中添加UserMaxIn 但我没有任何用户模型的类,我也不想让它 此错误的解决方案是什么?Flask登录要求使用类来表示用户,而不是原始dict 如中所述,此类需要实现一些属性和方法,包括is\u active()方法 Us

我使用flask和pymongo的组合创建了一个简单的注册和登录方法。 现在,对于用户会话管理,我使用的是flask\u登录 但它给了我这个错误 AttributeError:'dict'对象没有属性'is_active'

我在另一篇文章中找到的解决方案是在UserClass中添加UserMaxIn 但我没有任何用户模型的类,我也不想让它


此错误的解决方案是什么?

Flask登录要求使用类来表示用户,而不是原始dict

如中所述,此类需要实现一些属性和方法,包括
is\u active()
方法

UserMixin
类是为所有必需的属性和方法提供默认实现的基类,您可以扩展它并创建一个简单的用户类


更新:添加示例

根据您已经拥有的,您可以做的最简单的事情是:

  • 创建扩展
    UserMixin
  • 将来自MongoDB的
    json
    对象存储在
    User
    类中
  • 重写需要与默认行为不同的行为的方法
  • /login
    路径中创建
    User
    类的实例,并将其传递给
    flask\u login.login\u User()
用户类 对于所有方法/属性(
经过身份验证
处于活动状态
匿名
),除了
获取id
之外,它使用默认实现。如果不需要默认实现,则不需要扩展
UserMixin
,但必须自己实现所有方法

用户类在登录路由中的用法 请记住,您还必须提供如上所述的
用户\u加载程序。例如,给定
user\u id
,对MongoDB执行查询并返回
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)
有用的链接

您能给我一个创建用户类的简单代码吗?如何在login RouteThaks中调用该类,其工作方式是如何获取当前用户电子邮件?您可以从json对象获取它:
logiuser\u json.get('email')
。如果您想从
User
对象获取它:
User\u object.User\u json.get('email')
或者您可以在
User
class.def get\u mail(self)中添加一个新方法
get\u email
:object\u id=self.User\u json.get('email')return str(object\u id)像这样吗?是的,它可以工作,但电子邮件已经是字符串,因此您可以简单地:
def get_mail(self):返回self.user\u json.get('email')
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)
@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)
@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)