python flask_sqlalchemy如何维护一个全局查询结果

在我的webapp中,每个页面都要用到同一个一般不会变化的查询结果,为避免每次访问都需查询一次这个变量,我在views.py中弄了一个全局变量ADMIN_NOTES

ADMIN_NOTES=Note.query.filter_by(author_id=ADMIN.id).all()

而当ADMIN_NOTE会发生变化时,如此时管理员又写入了一个新note,则重新查询数据库获得最新的ADMIN_NOTE的值,尽量减少访问数据库的次数

我本想这么实现的(中间部分不重要的代码省略了)

#全局变量
ADMIN_NOTES=Note.query.filter_by(author_id=ADMIN.id).all()

#写入新note的函数1
@app.route('/new_note',methods=['GET','POST'])
def new_note():
    global ADMIN_NOTES
    data=json.loads(request.get_data())
    note=Note(title=data['note_title'],upload_time=datetime.utcnow())
    db.session.add(note)
    db.session.commit()
        #若是管理员写入新note,则重新查询并修改全局变量ADMIN_NOTES
    if note.author.nickname=='ADMIN':
        ADMIN_NOTES=Note.query.filter_by(author_id=ADMIN.id).all()
                KAFENUT_NOTES[0].author.nickname  #能正确访问ADMIN_NOTES
        print(len(ADMIN_NOTES))  #正确访问ADMIN_NOTES
    resp['success']=True
    resp['text']='Upload successfully!'
    resp['url']=url_for('note',note_id=note.id,nickname=note.author.nickname) #浏览器接受到服务器的json之后跳转到,resp[url]所指示的页面,即下面这个页面
    return json.dumps(resp)

#返回note页面的函数2
@app.route('/<nickname>/note/<note_id>',methods=['GET','POST'])
def note(nickname,note_id):
    global ADMIN_NOTES
    user=User.query.filter_by(nickname=nickname).first()
    note=Note.query.filter_by(id=note_id).first()
    if request.method=='GET':             
        note.view_num+=1
        db.session.add(note)
        db.session.commit()
        for nnote in ADMIN_NOTES: 
            print(nnote.author.nickname)    #出错位置
        return render_template('note_page.html',note=note,admin_notes=ADMIN_NOTES)

然而问题也正出在这里,当管理员写入新的note之后(即ADMIN_NOTES这个全局变量发生变化之后)重新查询的语句虽然在函数1中执行了(print出的note数量是写入新note之后的数量,)。但当用户根据函数1返回的json跳转到函数2的时候,函数2内就无法正确访问ADMIN_NOTES,准确来说无法访问nnote.author.nickname,其中author是note表用author_id这个外键连接到user表得到的,错误栈如下

Traceback (most recent call last):
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "E:\vs\python\AwesomeWebApp\AwesomeWebApp\app\views.py", line 232, in note
    print(nnote.author.nickname)    #let author.id be preloaded
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\sqlalchemy\orm\attributes.py", line 282, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\sqlalchemy\orm\attributes.py", line 710, in get
    value = self.callable_(state, passive)
  File "C:\Users\MSI-1\Anaconda3\lib\site-packages\sqlalchemy\orm\strategies.py", line 688, in _load_for_state
    % (orm_util.state_str(state), self.key)
sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <Note at 0x26de5f41198> is not bound to a Session; lazy load operation of attribute 'author' cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

sqlalchemy报出detached错误
sqlalchemy.orm.exc.DetachedInstanceError: Parent instance is not bound to a Session; lazy load operation of attribute 'author' cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

这该怎么解决?或者还有什么其他方法实现:在我的webapp中,每个页面都要用到同一个一般不会变化的查询结果,为避免每次访问都需查询一次这个一般不会变量,我在views.py中弄了一个全局变量ADMIN_NOTES。而当ADMIN_NOTE会发生变化时,如此时管理员又写入了一个新note,则重新查询数据库获得最新的ADMIN_NOTE的值,尽量减少访问数据库的次数

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

1
python如何通过flask写一个接口让别人调用?
2
在用flask-sqlacodegen生成models后,如何在视图函数中使用?
0
pyhton_falsk启动项目报错
1
初学者,python虚拟环境下安装了flask_script,但运行的时候提示没有该模块,怎么解决?
2
flask sqlalchemy 如何查询不特定的字段
1
flask_admin页面显示时,表创建按钮的url中/显示为%2f这种acsii码形式,怎么解决?
1
Python安装了Flask以后无法使用run()函数
0
python flask 如何文件限速传输
2
python连接服务器的redis 请求成功且抛出异常
1
请问python flask中文乱码问题怎么解决呢?
1
node.js-socketio与Python-socketio通信问题
1
flask sqlalchemy怎么根据两个字段去重?有没有大神呢?急!!!
1
python __init__方法子类如何在继承父类的基础上进行拓展
2
jinja2.exceptions.TemplateNotFound: bootstrap/base.html的错误wen'ti
1
python flask在主app.py文件中定义了一个工厂函数create_app(),并且创建列一个app实例,为什么还是会报Failed to find application in module "app"的错误。
1
在学习python flask migrate中,当在CMD中输入 python manager.py db migrate的时候,显示ImportError:DLL load failed,这个怎么解决?
1
flask+mysql实现的web应用,在注册页面点击注册后提示 Instance '<User at 0x5486a10>' has been deleted?
1
部署flask项目到heroku上时,出现psycopg2.errors.UndefinedTable: relation "question" does not exist问题,该怎么解决?
1
利用flask+celery+flask_mail扩展异步发送邮件时,celery会出现上下文问题,有人能解决吗?网上找了很多,都感觉很模糊
1
flask蓝图模式下,怎么使用pymongo