我正在使用Flask-Testing说:
另一个问题是 Flask-SQLAlchemy 还会在每个请求结束时删除会话实例(任何使用带有 scoped_session 的 SQLAlchemy 的线程安全应用程序也是如此)。因此,每次调用 client.get() 或其他客户端方法时,会话以及添加到其中的任何对象都会被清除。
但是,我没有看到。此测试失败:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.testing import TestCase
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
@app.route('/')
def index():
print 'before request:', `db.session`
u = db.session.query(User).first()
u.name = 'bob'
return ''
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class SessionTest(TestCase):
def create_app(self):
return app
def test_remove(self):
db.drop_all()
db.create_all()
u = User()
u.name = 'joe'
db.session.add(u)
db.session.commit()
client = app.test_client()
client.get('/')
print 'after request:', `db.session`
print u.name
assert u not in db.session
(运行$ nosetests test_file.py
以查看它的运行情况。)
标准输出:
-------------------- >> begin captured stdout << ---------------------
before request: <sqlalchemy.orm.scoping.ScopedSession object at 0x10224c610>
after request: <sqlalchemy.orm.scoping.ScopedSession object at 0x10224c610>
bob
--------------------- >> end captured stdout << ----------------------
根据文档,用户u
不应该在获取请求后进入会话,但它是!有谁知道为什么会这样?
此外,u.name
isbob
和 not joe
,即使请求从未提交!(所以我确信这是同一个会话。)
作为记录,
$ pip freeze | grep Flask
Flask==0.10.1
Flask-Bcrypt==0.5.2
Flask-DebugToolbar==0.8.0
Flask-Failsafe==0.1
Flask-SQLAlchemy==0.16
Flask-Script==0.6.2
Flask-Testing==0.4
Flask-Uploads==0.1.3
Flask-WTF==0.8