【发布时间】: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.db和models.db或类似的?我想要得到的是,也许你的模型正在使用一个单独的会话,所以虽然你提交了,但你没有提交在另一个会话中进行的更改。请参阅here 了解可能的类似情况。 -
您显然有 2 个不同版本的
db。向您正在使用的db.session添加一个新对象并提交工作的原因很明显,但查询的对象没有持久更改的原因是模型使用了 不同 范围的会话。跨度>
标签: python sqlite flask sqlalchemy