你本能地使用環境變量是正確的。但是,使用錯誤的db運行單元測試存在一些危險。此外,您可能不希望connect_db
與每個請求和您想要使用的任何地方db
。您可以使用明確設置的配置目錄和環境變量。這是迄今爲止我所見過的最好的。
run.py
shell.py
config/__init__.py
config/test.py
config/postgres.py
...
main/__init__.py
main/someapp/__init__.py
main/someapp/models.py
...
main/tests/__init__.py
main/tests/testutils.py
因此,該配置文件可能是:
# config/test.py
SQLALCHEMY_DATABASE_URI = "sqlite://"
和
# config/postgres.py
SQLALCHEMY_DATABASE_URI = 'postgresql://user:[email protected]/somedb'
所以,我可以明確地設置數據庫在我的基地測試用例:
import os
from flask.ext.testing import TestCase
os.environ["DIAG_CONFIG_MODULE"] = "config.test"
from main import app, db
class SQLAlchemyTest(TestCase):
def create_app(self):
return app
def setUp(self):
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
然後,main/__init__.py
,對我來說:
import os
from flask import Flask, render_template, g
from flask.ext.sqlalchemy import SQLAlchemy
# by default, let's use a DB we don't care about
# but, we can override if we want
config_obj = os.environ.get("DIAG_CONFIG_MODULE", "config.test")
app = Flask(__name__)
app.config.from_object(config_obj)
db = SQLAlchemy(app)
@app.before_request
def before_request():
g.db = db
g.app = app
# ...
@app.route('/', methods=['GET'])
def get():
return render_template('home.html')
# ...
from main.someapp.api import mod as someappmod
app.register_blueprint(someappmod)
然後,在其他文件,在那裏我知道我要運行的配置,有可能:
# run.py
import os
os.environ["DIAG_CONFIG_MODULE"] = "config.postgres"
from main import app
app.run(debug=True)
和
# shell.py
import os
os.environ["DIAG_CONFIG_MODULE"] = "config.postgres"
from main import app, db
from main.symdiag.models import *
from main.auth.models import *
print sorted(k for k in locals().keys() if not k.startswith("_"))
import IPython
IPython.embed()
也許..迄今爲止最好的:P。
與此同時,我打算使用app.config.from_envvar,並總是在命令行中指定配置文件,當我以不同的方式運行我的應用程序時。 – 2011-02-17 08:36:45
這確實看起來像一個解決方案,但如果你忘記和運行測試與錯誤的數據庫... – 2012-10-02 23:28:49