首先我的db是定义过的,这是定义过程
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
from sqlalchemy import Column, Integer, SmallInteger
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
print('db commit')
self.session.commit()
except Exception as e:
db.session.rollback()
print('db error')
raise e
class Query(BaseQuery):
def filter_by(self, **kwargs):
if 'status' not in kwargs.keys():
kwargs['status'] = 1
return super(Query, self).filter_by(**kwargs)
db = SQLAlchemy(query_class=Query) # 传入自己定义的类
注意看auto_commit()方法我自己定义了这个方法。
然后在使用它的时候,发生了令我无比震惊的错误
@staticmethod
def reset_password(token, new_password):
s = Serializer(current_app.config['SECRET_KEY'])
try:
data = s.loads(token.encode('utf-8'))
except:
return False
uid = data.get('id')
with db.auto_commint():
user = User.query.get(uid)
user.password = new_password
return True
我运行这段代码,竟然报错说db没有auto_commint方法
最后发现:如果把user = User.query.get(uid)
放到with语句前面就好了,
大概是因为User是db的一个子类,只有实例化一个子类后,父类db才能把方法实例出来
但这明显不对啊,我是ZZ吗
但下面这个就不会报错
@web.route('/user/center', methods=['GET', 'POST'])
@login_required
def user_center():
form = ChangeInfoForm(request.form)
if request.method == "POST" and form.validate():
uid = current_user.id
user = User.query.filter_by(id=uid).first_or_404() //主要看这里
with db.auto_commit(): //主要看这里
user.nickname = form.nickname.data
if form.phone_number:
user.phone_number = form.phone_number.data
user.email = form.email.data
flash("信息修改完成")
uid = current_user.id
user = User.query.filter_by(id=uid).first_or_404()
return render_template('user_center.html', user=user, form=form)