Я работаю над API с Flask и SQLAlchemy, и вот что я хотел бы сделать:
У меня есть клиентское приложение, работающее на нескольких планшетах, которое должно отправлять несколько запросов на добавление контента на сервер. Но я не хочу использовать автоматический откат в конце каждого запроса API (поведение по умолчанию с flask-sqlalchemy), потому что отправка данных выполняется несколькими запросами, как в этом очень упрощенном примере:
<сильный>1. beginTransaction/?id=transactionId -> открывает новый сеанс для клиента, делающего этот запрос. SessionManager.new_session() в приведенном ниже коде.
<сильный>2. addObject/?id=objectAid -> добавляет объект в базу данных PostGreSQL и очищает
<сильный>3. addObject/?id=objectBid -> добавляет объект в базу данных PostGreSQL и сбрасывает
<сильный>4. commitTransaction/?id= transactionId -> зафиксировать то, что произошло с момента beginTransaction. SessionManager.commit() в приведенном ниже коде.
Суть здесь в том, чтобы не добавлять данные на сервер, если клиентское приложение разбилось/потеряло соединение до того, как «commitTransaction» был отправлен, таким образом предотвращая наличие неполных данных на сервере.
Поскольку я не хочу использовать автоматический откат, я не могу использовать flask-SQLAlchemy, поэтому я самостоятельно внедряю SQLAlchemy в свое приложение flask, но я не уверен, как использовать сеансы.
Вот реализация, которую я сделал в __ init __.py:
db = create_engine('postgresql+psycopg2://admin:pwd@localhost/postgresqlddb',
pool_reset_on_return=False,
echo=True, pool_size=20, max_overflow=5)
Base = declarative_base()
metadata = Base.metadata
metadata.bind = db
# create a configured "Session" class
Session = scoped_session(sessionmaker(bind=db, autoflush=False))
class SessionManager(object):
currentSession = Session()
@staticmethod
def new_session():
#if a session is already opened by the client, close it
#create a new session
try:
SessionManager.currentSession.rollback()
SessionManager.currentSession.close()
except Exception, e:
print(e)
SessionManager.currentSession = Session()
return SessionManager.currentSession
@staticmethod
def flush():
try:
SessionManager.currentSession.flush()
return True
except Exception, e:
print(e)
SessionManager.currentSession.rollback()
return False
@staticmethod
def commit():
#commit and close the session
#create a new session in case the client makes a single request without using beginTransaction/
try:
SessionManager.currentSession.commit()
SessionManager.currentSession.close()
SessionManager.currentSession = Session()
return True
except Exception, e:
print(e)
SessionManager.currentSession.rollback()
SessionManager.currentSession.close()
SessionManager.currentSession = Session()
return False
Но теперь API не работает, когда несколько клиентов делают запрос, кажется, что каждый клиент использует одну и ту же сессию.
Как реализовать сеансы, чтобы каждый клиент имел отдельный сеанс и мог выполнять запросы одновременно?
Спасибо.