我的代码中包含以下数据库设置。我的代码中没有几个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。我觉得烧瓶保持着堆栈,这给了我随机的行为。有人可以帮我解决这个问题吗?