@ceytnot
Работаю не по специальности (:

Запросы от 2 Flask приложений к 1 БД: почему второе приложение не получает новые данные и выпадает с ошибкой?

Есть 2 Flask приложения на разных машинах, которые обращаются к одной БД.
Код инициализации и моделей в обоих приложения идентичный.

Flask
app = Flask(__name__)
app.secret_key = KEY
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
app.config['PERMANENT_SESSION_LIFETIME'] =  timedelta(hours=12)
if __name__ == '__main__':
    app.run()


Сокращенная модель БД
class Calls(base):
    __tablename__ = 'calls'
    id = Column(Integer, primary_key=True)
    creator = Column(String)
    partname = Column(String)
    calls_date = Column(DateTime)


Добавление записи с помощью SQLAlchemy в 1ом Flask приложении:
new_call = Calls(calls_date = datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
                                creator=current_user.fio,
                                partname=request.form.get("partname"))
session.add(new_call)
session.commit()
calls_data = session.query(Calls).order_by(Calls.id.desc()).all()
return render_template("calls_default.html",
                               calls_data=calls_data)


Данные добавляются в БД, присваивается уникальный порядковый id записи (в модели не прописано т.к. присваивается на уровне БД).
На html страницу возвращаются обновленные данные, включая этот id записи.

Читаем какое-то время спустя из 2го Flask приложения и возвращаем на страницу:
calls_data = session.query(Calls).order_by(Calls.id.desc()).all()
return render_template("calls_default.html",
                               calls_data=calls_data)

Получаем все записи в момент инициализации 2го приложения, но без той, которая была добавлена чуть ранее.
Более того, при попытке добавить запись из 2го приложения, оно крашится, говоря, что не может прочитать файл бд.
По ощущениям оно пытается добавить запись с тем же id, которые было создано в 1ом приложении.

1. Что-то не так с сессиями?
Инициализация сессий идентична:
engine = create_engine("access+pyodbc://login:pwd@bd_name")
base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

2. Flask кэширует данные и отдает старые даже после обновления страницы? Но в 1 приложении данные обновляются.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 2
@twistfire92
Python backend developer
Попробуйте сессию инициализировать в обработчике роутера через отдельный метод (еще лучше использовать DI)
что-то типа такого:
def get_session():
    with Session() as session:
        yield session
        session.commit()
        session.close()


и уже в обработчике роута вызывать
session = get_session()
calls_data = session.query(Calls).order_by(Calls.id.desc()).all()
return render_template("calls_default.html", calls_data=calls_data)
Ответ написан
LaRN
@LaRN
Senior Developer
У aссess как и у sqlite только один процесс может быть подклбчен к бд на запись. Если бы flask-и закрывали за собой все коннекты сразу после использовпния бд, то возможно оно бы заработало.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы