[英]Python SQLAlchemy flask patterns
我有一個項目,我將 db.py 模塊定義為:
app = get_global_flask_app()
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://foo:bar@127.0.0.1:5432/test"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)
db.create_all()
然后我將 db.db 導入到需要查詢數據庫和插入數據的模塊中(db.session.query())。
但是,這意味着當我編寫測試代碼 (pytest) 來測試任何導入 db.py 的模塊時,我將需要定義“SQLALCHEMY_DATABASE_URI”。 一種解決方案是將 db 設為惰性屬性,以便僅在使用/測試數據庫時才在測試中執行上述代碼。 是否有我缺少的 Flask() + SQLA + SQLALCHEMY_DATABASE_URI 的通用設計模式? 你會如何解決這個問題? 燒瓶配置?
我們通常解決這個問題的方法是使用應用程序工廠和配置。
這意味着您的項目中某處有一個函數,看起來像這樣(取自文檔並進行了修改):
def create_app(config_filename, settings_override=None):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
app.config.from_object(settings_override)
from yourapplication.model import db
db.init_app(app)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
然后(希望您使用的是 pytest)在您的根測試目錄中,您有一個conftest
文件,它會自動准備您的測試環境,如下所示:
import pytest
from your_project import create_app
class TestConfig:
SQLALCHEMY_DATABASE_URI = "postgresql://foo:bar@127.0.0.1:5432/test"
SQLALCHEMY_TRACK_MODIFICATIONS = False
ANY OTHER SETTINGS...
@pytest.fixture(autouse=True)
def app(request):
app = create_app(settings_override=TestConfig)
ctx = app.app_context()
ctx.push()
def teardown():
ctx.pop()
request.addfinalizer(teardown)
return app
通常,我們創建另一個夾具,它也是autouse=True
來處理數據庫設置、刷新和可能的加載夾具,並且只在需要訪問數據庫的測試(集成或功能測試)中使用該夾具,這意味着簡單我們將其包含在與集成測試相同的目錄中的conftest
文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.