Поддержание сеанса SQLAlchemy во время потоковой передачи ответа Flask - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь передавать большие CSV-файлы клиентам с моего сервера Flask, который использует Flask-SQLAlchemy.

При настройке приложения (с использованием фабричного шаблона), 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 для автоматического закрытия соединения, но сохраняется та же ошибка.

1 Ответ

0 голосов
/ 24 октября 2018

@app.after_request закрывал сеанс базы данных до того, как генератор когда-либо вызывал поток файла.

Решением было перенести db.session.close() в @app.teardown_request.stream_with_context также должен использоваться при создании экземпляра Response.

...