gpt4 book ai didi

python - 更新 'username' 字段将用户注销(flask-login - MongoDB) - 类问题?

转载 作者:行者123 更新时间:2023-12-03 19:12:48 27 4
gpt4 key购买 nike

我正在开发我的flask应用程序(使用flask-login和PyMongo)并为我的用户提供这个类,这个加载器(这是完整的users.py文件):

from werkzeug.security import check_password_hash
from app import login, mongo

class User():
def __init__(self, username, first_name, last_name, email, _id, is_admin):
self.username = username
self.first_name = first_name
self.last_name = last_name
self.email = email
self._id = _id
self.is_admin = is_admin

def is_authenticated(self):
return True

def is_active(self):
return True

def is_anonymous(self):
return False

def get_id(self):
return self.username

@staticmethod
def check_password(password_hash, password):
return check_password_hash(password_hash, password)


@login.user_loader
def load_user(username):
user = mongo.db.users.find_one({'username': username})
if not user:
return None
return User(user['username'], user['first_name'], user['last_name'], user['email'], user['_id'], user['is_admin'])

注册、登录和注销路由工作正常,但我的 update_account 路由有问题,它更新用户信息。
我可以更新数据库中的所有字段,但是当我更新 ‘username’ 时我注销了,或者更确切地说是注销并重定向到 /login?next=%2Faccount HTTP (尽管该字段已正确更新)。
我知道我的类有问题,所以我尝试使用 _id 修改它的末尾和加载器。 , 如:
class User():
def __init__(self, username, first_name, last_name, email, _id, is_admin):
self.username = username
self.first_name = first_name
self.last_name = last_name
self.email = email
self._id = _id
self.is_admin = is_admin


def is_authenticated(self):
return True

def is_active(self):
return True

def is_anonymous(self):
return False

def get_id(self):
return self._id

@login.user_loader
def load_user(_id):
user = mongo.db.users.find_one({'_id': _id})
if not user:
return None
return User(user['username'], user['first_name'], user['last_name'], user['email'], user['_id'] , user['is_admin'])

但后来我得到了一个 TypeError: Object of type ObjectId is not JSON serializable .

额外信息:当我更新任何其他字段时,我正确地进入了我的控制台:
127.0.0.1 - -"POST /account HTTP/1.1" 302 -
127.0.0.1 - -"GET /account HTTP/1.1" 200 -

但是更新用户名会引起:
127.0.0.1 - -"POST /account HTTP/1.1" 302 -
127.0.0.1 - -"GET /account HTTP/1.1" 302 -
127.0.0.1 - -"GET /login?next=%2Faccount HTTP/1.1" 200 -

如果有帮助,这是我编辑帐户的途径:
@app.route('/account', methods=['POST', 'GET'])
@login_required
def account():
form = UpdateAccountForm()
updated_user = {'username': form.username.data, 'first_name': form.first_name.data,
'last_name': form.last_name.data, 'email': form.email.data}
if form.validate_on_submit():
mongo.db.users.update_one(
{'_id': current_user._id}, {"$set": updated_user})
flash('Updated!', 'info')
return redirect(url_for('account'))
elif request.method == 'GET':
form.username.data = current_user.username
form.first_name.data = current_user.first_name
form.last_name.data = current_user.last_name
form.email.data = current_user.email
return render_template('account.html', title="About", form=form)

你们中的任何人都可以帮我整理一下吗?谢谢!!

最佳答案

_id字段在 pymongo 中表示为 ObjectId 实例(来自 bson 库)。

从有问题的函数中删除此字段,或先将其转换为字符串。

关于python - 更新 'username' 字段将用户注销(flask-login - MongoDB) - 类问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61574393/

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