sqlalchemy.exc.InvalidRequestError: Object '«уже присоединен к сеансу« 2 »(это« 3 ») - PullRequest
0 голосов
/ 13 марта 2019

Я создаю страницу для сброса пароля, каждый раз, когда я регистрирую новую учетную запись и выполняю вход, когда я пытаюсь сбросить пароль, появляется sqlalchemy.exc.InvalidRequestError: Object '<User at 0x10d437eb8>' is already attached to session '2' (this is '3'), кажется, что каждый раз, когда я изменяю уже существующую строку в базе данных появляется эта ошибка.

Вот мой код:

Регистрация просмотра:

def register():
    form = RegisterForm()
    if form.validate_on_submit():
        data = form.data
        user = User(
            name=data["name"],
            email=data["email"],
            pwd=generate_password_hash(data["pwd"]),
            avatar="user-blue.png",
            uuid=uuid.uuid4().hex
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("home.login"))
    return render_template("home/register.html", form=form)

Сброс пароля:

def pwd_reset():
    form = PwdForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name=session["user"]).first()
        from werkzeug.security import generate_password_hash
        user.pwd = generate_password_hash(data["new_pwd"])
        db.session.add(user) # problem here
        db.session.commit()
        return redirect(url_for("home.success"))
    return render_template("home/pwd_reset.html", form=form)

Насколько я вижу, я не могу использовать db.session.add в существующей строке? Как это исправить

1 Ответ

1 голос
/ 13 марта 2019

Вам не нужно добавлять user к сеансу БД.

Просто измените нужные поля и зафиксируйте сеанс:

def pwd_reset():
    form = PwdForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name=session["user"]).first()
        from werkzeug.security import generate_password_hash
        user.pwd = generate_password_hash(data["new_pwd"])
        db.session.commit()
        return redirect(url_for("home.success"))
    return render_template("home/pwd_reset.html", form=form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...