AttributeError: 'BaseQuerySet' object has no attribute 'is_authenticated'

AttributeError: 'BaseQuerySet' object has no attribute 'is_authenticated'

我正在使用 flask-login 和 MongoDB 作为我的数据库来存储用户配置文件。

在我的登录函数中检查用户是否通过身份验证时:

@bp.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('routes.index')) 

我收到以下错误:

AttributeError: 'BaseQuerySet' object has no attribute 'is_authenticated'

我的用户对象正在从 flask-login 扩展 UserMixin。

知道我哪里错了吗?

好的,我找到了 - 在我的 user_loader 函数中,我做了类似的事情:

@login.user_loader
def load_user(id):
    return User.objects(_id=ObjectId(id))

而使用 mongoengine(显然将 _id 转换为 id)获得单个结果(不是整个集合)的正确方法是:

@login.user_loader
def load_user(id):
    return User.objects(id=ObjectId(id)).first()

正如您在回答中所说,MongoEngine 的接口在查询中需要 id 而不是 _id。但是,如果您检查对象表示,文档的 ID 仍存储在 ._id 变量中。

此外,您不需要使用 ObjectId(the_id) 将 the_id 转换为 ObjectId(),您也可以使用 User.objects.get(id=the_id) 函数来获取单个文档而不是 User.objects(id=the_id).first() 如:

@login.user_loader  
def load_user(user_id): 
    try: 
        return User.objects.get(id=user_id) 
    except Exception as e: 
        print(e)
        raise