Python 流式传输烧瓶响应时保持SQLAlchemy会话活动

Python 流式传输烧瓶响应时保持SQLAlchemy会话活动,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在尝试将大型CSV从使用Flask SQLAlchemy的Flask服务器流式传输到客户端 配置应用程序时(使用出厂模式),每次请求后都会调用db.session.close(): @app.after_request def close_connection(r): db.session.close() return r 到目前为止,这种配置工作得很好,因为所有请求都是短期的。但是在流式传输响应时,SQLAlchemy会话会提前关闭,在调用生成器时引发以下错误: sqla

我正在尝试将大型CSV从使用Flask SQLAlchemy的Flask服务器流式传输到客户端

配置应用程序时(使用出厂模式),每次请求后都会调用
db.session.close()

@app.after_request
def close_connection(r):
    db.session.close()
    return r
到目前为止,这种配置工作得很好,因为所有请求都是短期的。但是在流式传输响应时,SQLAlchemy会话会提前关闭,在调用生成器时引发以下错误:

sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <Question> is not bound to a Session; lazy load operation of attribute 'offered_answers' cannot proceed

我尝试了使用/不使用
stream\u和
def close\u connection
中的
上下文和全局标志的多种配置,以不自动关闭连接,但相同的错误仍然存在。

@app.after\u request
在调用文件流生成器之前关闭数据库会话


解决方案是将
db.session.close()
迁移到
@app.teardown\u request
<当实例化
Response

Flask sqlalchemy已经完成了会话清理工作,所以您不需要实现自己的:@codeape Flask sqlalchemy确实调用了
session.remove()
。但是,当我完全删除
@app.teardown\u请求
功能时,我的测试失败。当我能潜得更深一点的时候,还会有更多。
@app.route('/export')
def export_data():
    answers = Answer.query.all()
    questions = Question.query.all()
    def generate():
        Iterate through answers questions and write out various relationships to csv

    response = Response(stream_with_context(generate()), mimetype='text/csv')
    return response