我试图在官方文档和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
答案 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