首先我的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)