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

标签 python mongodb flask flask-login

我正在开发我的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/

相关文章:

python - 获取 Pandas 中 boolean 值的索引 - python

python - PyQt: 'ConverterDialog' 对象没有属性 'comboBoxIndexChanged'

python - 在 Python 中检查类型的规范方法是什么?

python - 自定义类中包装的 QLabel 上的意外填充

MongoDB : Use $unwind into $lookup pipeline

python - Mongodb DeprecationWarning : count is deprecated. 使用 Collection.count_documents 代替

python - 如何在flask中将python日志按不同级别保存在不同文件中

node.js - 无法使用 Git Bash 运行 mongo/mongod,但它在 Git CMD 中运行(mongo : not found)

python - Flask 端点与 Sagemaker 端点

python - 使用 Flask 和 WTForms 从数据库查询动态单选按钮