关于 codegeek 使用 Flask-Testing 的答案,我很难理解createapp()
它的作用。Flask-SqlAlchemy Introduction to Contexts为我提供了一些关于如何将 SQLAlchemy 对象动态绑定到应用程序的指针。在这种情况下,绑定到测试应用程序。
基本上:
- 创建烧瓶 sqlalchemy 对象但不传入 app 对象
- 在 create_app 函数中,创建您的测试应用程序,并动态绑定 SQLAlchemy。
你的myapp.py:
# don't pass in the app object yet
db = SQLAlchemy()
def create_test_app():
app = Flask(__name__)
app.config['TESTING'] = True
app.config["SQLALCHEMY_DATABASE_URI"] = "xxxxxxtestdatabasexxx"
# Dynamically bind SQLAlchemy to application
db.init_app(app)
app.app_context().push() # this does the binding
return app
# you can create another app context here, say for production
def create_production_app():
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "xxxxxxproductionxxxx"
# Dynamically bind SQLAlchemy to application
db.init_app(app)
app.app_context().push()
return app
然后,您可以按照 Flask-Test 文档中概述的 codegeek 的解决方案进行操作
from flask.ext.testing import TestCase
from myapp import create_app, db
class MyTest(TestCase):
# I removed some config passing here
def create_app(self):
return create_test_app()
def setUp(self):
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
这个解决方案的好处是您可以创建不同的应用程序并使用函数动态绑定 SQLAlchemy 对象。每个应用程序可以服务于不同的目的。例如,一个用于生产,一个用于单元测试。在生产的情况下,您可以在顶级烧瓶应用程序中调用 create_production_application()。