【问题标题】:Update Row using SQLAlchemy Flask and sqlite3使用 SQLAlchemy Flask 和 sqlite3 更新行
【发布时间】:2018-09-06 23:45:47
【问题描述】:

我正在尝试使用 SQLAlchemy 和烧瓶更新用户密码,但未提交更改

change_admin_password = Blueprint('change_admin_password', __name__)
@change_admin_password.route('/api/users/password', methods = ['POST'])
@auth.login_required
def show():
    username = request.json.get('username')
    new_password = request.json.get('new_password')

    if username is None or new_password is None:
        abort(400)
    if username != app.config['ADMIN_USER']:
        abort(400)
    admin = User.query.filter_by(username=username).first()
    admin.hash_password(new_password)
    db.session.commit()
    return (jsonify({'success': True, 'message': 'Admin password changed'}), 201)

在我的用户类中

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(32), index=True)
    password_hash = db.Column(db.String(64))
    roles = db.Column(db.String(128))
    is_active = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, nullable=False, server_default=func.now())
    updated_at = db.Column(db.DateTime, nullable=False, server_default=func.now(), onupdate=func.now())

    def hash_password(self, password):
        self.password_hash = pwd_context.encrypt(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password_hash)

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

更新: 如果我尝试在提交之前添加新用户,新用户将添加到表中,但管理员仍然拥有旧密码

admin = User.query.filter_by(username=username).first()
admin.hash_password(new_password)
user = User(username='admintest')
user.hash_password(new_password)
db.session.add(user)
db.session.commit()

【问题讨论】:

  • 如果 autoflush 没有开启,也许你需要在提交后刷新
  • @bboumend Commit always flushes。对于 OP,您如何验证未提交更改?
  • @IljaEverilä 如果我尝试使用新密码登录,它不会但旧密码有效。此外,如果我从终端查询用户表,我可以看到密码仍然具有相同的旧哈希
  • 但是您是否始终从 1 个地方导入 db?换句话说,您没有 2 个 db 对象,例如 app.dbmodels.db 或类似的?我想要得到的是,也许你的模型正在使用一个单独的会话,所以虽然你提交了,但你没有提交在另一个会话中进行的更改。请参阅here 了解可能的类似情况。
  • 您显然有 2 个不同版本的 db。向您正在使用的db.session 添加一个新对象并提交工作的原因很明显,但查询的对象没有持久更改的原因是模型使用了 不同 范围的会话。跨度>

标签: python sqlite flask sqlalchemy


【解决方案1】:

在我从 run.py 中删除 db 的初始化并从我所有模型中的一个位置导入 db 后,我得到了它。

所以在 sqlalchemy_declaration 我有

db = SQLAlchemy()

在其他模型中

from sqlalchemy_declarative import db

然后我用

初始化应用程序

db.init_app(app)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2018-05-14
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多