烧瓶里的惯例是这样开始的:
from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
SQLALCHEMY_DATABASE_URI = 'something'
app.config.from_object(__name__)
db = SQLAlchemy(app)
然后导入并在任何地方使用app
和db
。但是,当您像这样创建db
时,它会从应用程序中获取配置,而且这种配置似乎一旦发生就永远无法重写。Flask的网站上有一些关于创建应用程序工厂的页面,但还不清楚如果我这样做了,我将如何仍然可以在任何地方使用app
和db
。
如何编写脚本以使用不同的数据库测试Flask应用程序?我应该如何构造我的应用程序来实现这一点?我必须使用module
s吗?
首先,不要直接在脚本中实例化Flask应用程序,而是使用application factory。这意味着您要创建一个以配置文件为参数的函数,并返回实例化的app对象。然后,创建不带参数的全局SQLAlchemy对象,并在创建应用程序as explained here时对其进行配置。
要运行应用程序,只需执行以下操作:
要运行unittests,可以执行以下操作:
在我的例子中,我直接将SQLAlchemy用于作用域会话,而不是Flask SQLAlchemy。 我也这么做了,但是用Lazy SQLAlchemy setup。
您不希望在导入时连接到数据库。继续并在导入时配置你的应用,因为在尝试测试或运行你的应用之前,你总是可以在测试中调整配置。在下面的示例中,您将在一些使用应用程序配置的函数后面使用db连接,因此在unittest中,您可以实际更改db连接以指向其他文件,然后在设置中进行显式连接。
假设您有一个包含myapp.py的myapp包,它看起来像:
您的测试文件myapp/test_myapp.py如下所示:
当然,如果您想使用SQLAlchemy,您必须适当地更新connect_db和init_db函数,但希望您能理解这一点。
你使用环境变量的本能是正确的。但是,使用错误的数据库运行单元测试有一定的危险。此外,您可能不想对每个请求和您想使用的任何位置都使用
connect_db
。您可以使用您显式设置的配置目录和环境变量。这是迄今为止我想到的最好的。因此,配置文件可能是:
以及
因此,我可以在基本测试用例中显式地设置db:
然后,对我来说,
main/__init__.py
:然后,在其他文件中,我知道要运行什么配置,可能:
以及
也许。。迄今为止最好的:P
相关问题 更多 >
编程相关推荐