gpt4 book ai didi

python - flask 登录错误

转载 作者:太空狗 更新时间:2023-10-30 03:04:03 25 4
gpt4 key购买 nike

我在使用 Flask-Login 框架进行身份验证时遇到困难。我已经尽可能彻底地查看了文档,但显然我遗漏了一些明显的东西。

class User():
def __init__(self, userid=None, username=None, password=None):
self.userid = userid
self.username = username
self.password = password

def is_authenticated(self):
return True

def is_active(self):
return True

def is_anonymous(self):
return False

def get_id(self):
return unicode(self.userid)

def __repr__(self):
return '<User %r>' % self.username

def find_by_username(username):
try:
data = app.mongo.db.users.find_one_or_404({'username': username})

user = User()
user.userid = data['_id']
user.username = data['username']
user.password = data['password']
return user

except HTTPException:
return None


def find_by_id(userid):
try:
data = app.mongo.db.users.find_one_or_404({'_id': userid})
user = User(data['_id'], data['username'], data['password'])
return user

except HTTPException:
return None

上面是我的用户类,位于users/models.py

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'users.login'

@login_manager.user_loader
def load_user(userid):
return find_by_id(userid)

上面是我的用户加载器。

@mod.route('/login/', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
pw_hash = hashlib.md5(form.password.data).hexdigest()
user = find_by_username(form.username.data)
if user is not None:
if user.password == pw_hash:
if login_user(user):
flash('Logged in successfully.')
return redirect(request.args.get('next') or url_for('users.test'))
else:
flash('Error')

else:
flash('Username or password incorrect')

else:
flash('Username or password incorrect')

return render_template('users/login.html', form=form)

没有明显的错误消息,但是当尝试访问任何用 @login_required 修饰的 View 时,它会将我重定向到登录表单。据我所知,login_user 函数实际上并没有工作,尽管它在我调用它时返回了 True。任何建议表示赞赏。

最佳答案

调试了一段时间后,我终于解决了这个问题。

关键问题是我试图使用 MongoDB 集合中的 _id 参数作为用户 ID。我没有意识到 _id 参数是 ObjectID 类型,而不是我需要的字符串或 unicode。

def find_by_username(username):
try:
data = app.mongo.db.users.find_one_or_404({'username': username})

user = User(unicode(data['_id']), data['username'], data['password'])
return user

except HTTPException:
return None


def find_by_id(userid):
try:
data = app.mongo.db.users.find_one_or_404({'_id': ObjectId(userid)})
user = User(unicode(data['_id']), data['username'], data['password'])
return user

适当修改这两个函数修复了这个错误。

关于python - flask 登录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17082933/

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