<p>我正在使用Flask和SQLAlchemy开发一个API,我想做的是:</p>
<p>我有一个客户端应用程序,在多个平板电脑上工作,必须发送多个请求才能向服务器添加内容。
但我不想在每个API请求结束时使用自动回滚(flask sqlalchemy的默认行为),因为数据的发送是通过多个请求完成的,就像下面这个非常简单的示例中所示:</p>
<p><strong>1。开始交易/?id=transactionId</strong>->;为发出该请求的客户端打开一个新会话。<strong>SessionManager.new_session会话()</strong>在下面的代码中。在</p>
<p><strong>2。添加对象/?id=objectAid</strong>->;将对象添加到PostGreSQL数据库并刷新</p>
<p><strong>3。添加对象/?id=objectBid</strong>->;将对象添加到PostGreSQL数据库并刷新</p>
<p><strong>4。承诺交易/?id=transactionId</strong>->;提交自beginTransaction以来发生的事情。<strong>SessionManager.commit()</strong>在下面的代码中。在</p>
<p>这里的重点是,如果客户端应用程序在«commitTransaction»发送之前崩溃/失去连接,则不要将数据添加到服务器,从而防止服务器上的数据不完整。在</p>
<p>因为我不想使用自动回滚,所以我不能真正使用flask SQLAlchemy,所以我自己在flask应用程序中实现SQLAlchemy,但是我不确定如何使用会话。在</p>
<p>下面是我在\uuinit\uuuy.py中执行的实现:</p>
<pre><code>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
</code></pre>
<p>但是现在当多个客户机发出请求时,API就不起作用了,似乎每个客户机都共享同一个会话。在</p>
<p>我应该如何实现这些会话,以便每个客户端都有不同的会话并可以并发地发出请求?在</p>
<p>谢谢。在</p>