私はFlask-Testingを使用しています:
もう 1 つの落とし穴は、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
は get リクエストの後にセッションに参加するべきではありませんが、そうです! なぜこれが起こっているのか誰にも分かりますか?
さらに、リクエストがコミットされていないにもかかわらず、 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