记录一下,在写flask的时候遇到db(SQLAlchemy) 的一个定义过的方法找不到的问题

首先我的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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章