У меня есть клиентское приложение, работающее на нескольких планшетах, которым приходится отправлять несколько запросов на добавление контента на сервер.
Но я не хочу использовать автоматический откат в конце каждого запроса API (поведение по умолчанию с flask-sqlalchemy), потому что отправка данных выполняется с несколькими запросами, как в этом очень упрощенном примере:
1. BeginTransaction/?id=transactionId -> открывает новый сеанс для клиента, отправляющего этот запрос. SessionManager.new_session() в приведенном ниже коде.
2. addObject/?id=objectAid -> добавляет объект в базу данных PostGreSQL и очищает его
3. addObject/?id=objectBid -> добавляет объект в базу данных PostGreSQL и очищает его
4. commitTransaction/?id=transactionId -> зафиксировать то, что произошло с момента начала транзакции. 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
Как мне реализовать сеансы, чтобы у каждого клиента был отдельный сеанс и они могли отправлять запросы одновременно?
Спасибо.>
Подробнее здесь: https://stackoverflow.com/questions/296 ... y-problems