从ORM查询中获取旧值

时间:2019-06-22 03:09:01

标签: flask flask-sqlalchemy

我的代码中包含以下数据库设置。我的代码中没有几个API,也没有几个控制器可以提供模板和相应的表单POST处理程序。问题是当我调用/details?stu_id=abcd时,处理程序装饰器被调用,并且我有一个数据库查询来检查给定的stu_id是否存在于我的表(学生)中。我随机获取传递的ID在我的表错误中不存在。但是当我手动检查它的存在。几下刷新其工作正常。我在API中没有遇到这个问题

有时它会在页面的后期发生。我在每个页面移动中更新状态。当我使用上述StuHelper方法从同一张表中读取状态时,它为我提供了旧值,但是当我手动签入数据库时​​,它具有正确的值。刷新后,它将返回我其他一些按顺序更新的值,并且经过几次刷新后,它为我提供了来自db的正确值。

然后我添加了app.teardown_appcontext(close_db)行,但仍无法正常工作。

app / extensiontions.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

app/__init__.py
from app.extensions import db

def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()

def initdb(db):

    print("init database...")
    try:
        from app.models import Student
        db.create_all()
    except Exception as e:
        print(e)

def creat_app(config_name):
    app.config.from_object(app_config[config_name])
    db.init_app(app)
    app.app_context().push()
    app.teardown_appcontext(close_db)
    initdb(db)

controllers / student.py

@student_blueprint('/details', methods=['GET','POST'])
@handler
def stu_details()
    print("blah")

app/utils.py

def handler(f):
@wraps(f)
    def wrapper(*args, **kwargs):
        stu_id = request.args.get("stu_id")
        if not stu_id:
            logger.debug("There is no stu_id in the query string")
            _return_fun = abort(404)
        else:
            try:
                stu_helper= db_handler.StuHelper(stu_id)
                current_status = stu_helper.get_status()
                if not current_status:
                    logger.debug("URL has not been setup")
                    abort(404)
                try:
                   _return_fun = f(*args, **kwargs)
                except:
                    _return_fun = abort(500)
        return _return_fun
    return wrapper

db_hanlder.py

class StuHelper(object):
    def __new__(cls, stu_id):
        stu_obj = Student.query_filter_by(stu_id=stu_id).first()
        if not stu_obj:
            print("stu_id not exists {0}".format(stu_id))

当我从ORM查询并在随后的页面查询中更正ststus值时,我应该从表中获取stu_id。我觉得烧瓶保持着堆栈,这给了我随机的行为。有人可以帮我解决这个问题吗?

0 个答案:

没有答案