Использование сеансов SQLAlchemy с проблемами колбы и параллелизмаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование сеансов SQLAlchemy с проблемами колбы и параллелизма

Сообщение Anonymous »

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

Как мне реализовать сеансы, чтобы у каждого клиента был отдельный сеанс и они могли отправлять запросы одновременно?

Спасибо.>

Подробнее здесь: https://stackoverflow.com/questions/296 ... y-problems
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»