流式传输 Flask 响应时保持 SQLAlchemy 会话处于活动状态

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


在配置应用程序时(使用工厂模式),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

伪代码:


@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

我已经尝试了使用/不使用stream_with_context和全局标志的多种配置def close_connection来不自动关闭连接,但同样的错误仍然存在。


30秒到达战场
浏览 389回答 1
1回答

手掌心

@app.after_request&nbsp;在生成器流文件被调用之前关闭数据库会话。解决方案是迁移db.session.close()到@app.teardown_request.&nbsp;stream_with_context实例化时也必须使用Response。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python