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