gpt4 book ai didi

python - 属性错误: 'dict' object has no attribute 'is_active' (PyMongo And Flask)

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:18 29 4
gpt4 key购买 nike

@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结合pymongo创建了一个简单的注册和登录方法。现在对于用户 session 管理我使用flask_login但它给了我这个错误AttributeError:“dict”对象没有属性“is_active”

我发现不同帖子的解决方案是在 UserClass 中添加 UserMaxIn但我没有任何用户模型类,我也不想创建它

这个错误的解决办法是什么?

最佳答案

Flask-Login 要求您使用类来表示用户,而不是原始字典。

documentation 中所述,这个类需要实现一些属性和方法,包括is_active()方法。

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

<小时/>

更新:添加示例

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

  • 创建一个扩展 UserMixin 的自定义 User
  • 将 MongoDB 中的 json 对象存储在 User 类中
  • 覆盖您需要不同于默认行为的方法
  • /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_authenticatedis_activeis_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,如here所述。 。例如,给定 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)

有用的链接

关于python - 属性错误: 'dict' object has no attribute 'is_active' (PyMongo And Flask),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401996/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com