@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)
我使用pymongo结合使用flask创建了一个简单的注册和登录方法。 现在用于用户会话管理,我正在使用flask_login 但这给了我这个错误 AttributeError:“ dict”对象没有属性“ is_active”
我发现不同帖子的解决方案是在UserClass中添加UserMaxIn 但是我没有用户模型的任何课程,我也不想这么做该错误的解决方案是什么?
答案 0 :(得分:0)
烧瓶登录要求您使用一个类来表示用户,而不是原始字典。
如documentation中所述,此类需要实现一些属性和方法,包括is_active()
方法。
UserMixin
类是为所有必需的属性和方法提供默认实现的基类,您可以对其进行扩展并创建一个简单的User类。
更新:添加了示例
根据已有的知识,您可以做的最简单的事情是:
User
的自定义UserMixin
类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_authenticated
,is_active
,is_anonymous
),除了get_id
以外,它均使用默认实现。如果不需要默认的实现,则不需要扩展UserMixin
,但必须自己实现所有方法。
@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)
请记住,您还必须提供here中所述的user_loader
。例如,给定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)