'的ObjectId'对象没有属性' is_active'烧瓶登录

时间:2018-02-22 18:20:31

标签: flask pymongo flask-login

我试图在官方文档和this article之后使用pymongo使用flask-login。 但是,我无法让它发挥作用。我一直收到错误:

if not force and not user.is_active:
    AttributeError: 'ObjectId' object has no attribute 'is_active'

我的用户类如下所示:

class User(UserMixin):
    def __init__(self, user_id):
        self.user_id = user_id
    def is_authenticated(self):
        return True
    def is_active(self):
        return True
    def is_anonymous(self):
        return False
    def get_id(self):
        return self.user_id
    @staticmethod
    def validate_login(password_hash, password):
        return check_password_hash(password_hash, password)

登录管理器是:

@login_manager.user_loader
def load_user(user_id):
    u = db.Users.find_one({"_id": user_id})
    if not u:
        return None
    return User(u['_id'])

登录和注册是:

@auth2.route('/login', methods = ['POST', 'OPTIONS'])
@cross_origin()
def login():
    print("trying to login user")
    data = request.get_json()
    email = data['email']
    user = db.Users.find_one({"email": email})
    if user and User.validate_login(user['password'], data['password']):
        user_obj = User(user['_id'])
        login_user(user['_id'])
        return jsonify({"login":True})
    return "wrong Password"

@auth2.route('/signup', methods = ['POST', 'OPTIONS'])
@cross_origin()
def signup_user():
    print("trying to signup user")
    data = request.get_json()
    email = data['email']
    password = data['password']
    company = data['company']
    u = {'email':email}
    if email is None or password is None or company is None:
        return "missing Args.."
    if db.Users.find_one(u) is not None:
        return "User Exists"
    user = { "email": email, "password": generate_password_hash(password), "teams":[company]}
    db.Users.insert(user)
    # Login User
    new_user = db.Users.find_one({"email":email})
    login_user(new_user['_id'])
    return 'User Added and logged in', 201

我错过了什么? 附:我试过没有(UserMixin) 我尝试过:class User(db.Users, UserMixin): 但后来我得到了:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

1 个答案:

答案 0 :(得分:1)

应使用User的实例调用

flask_login.utils.login_user函数。

new_user应该补充水分并作为参数传递给它。

@auth2.route('/login', methods = ['POST', 'OPTIONS'])
@cross_origin()
def login():
    ...
    if user and User.validate_login(user['password'], data['password']):
        user_obj = User(user['_id'])
        login_user(user_obj)
        return jsonify({"login":True})
    return "wrong Password"

@auth2.route('/signup', methods = ['POST', 'OPTIONS'])
@cross_origin()
def signup_user():
    ...
    new_user = db.Users.find_one({"email":email})
    login_user(User(new_user['_id']))
    return 'User Added and logged in', 201
相关问题