【发布时间】:2019-02-05 14:29:56
【问题描述】:
使用 Flask-Admin 和 Mongoengine 为信息系统开发 Web 管理界面,我的所有实体都需要 Flask-Admin 的 ModelViews。该系统使用多个 MongoDB 数据库。为了清楚起见,我们假设其中有两个。
通常,人们使用 Mongoengine 的 database aliases 来管理此类行为。在初始化期间,我们使用 Flask-Mongoengine 的配置为我们的 Flask 应用定义了几个别名:
from mongoengine import DEFAULT_CONNECTION_NAME
# Local packages
from config import CurrentConfig
SECOND_DB_ALIAS = "second_db"
app.config['MONGODB_SETTINGS'] = [
{
"ALIAS": DEFAULT_CONNECTION_NAME,
"DB": CurrentConfig.DATABASE_NAME,
},
{
"ALIAS": SECOND_DB_ALIAS,
"DB": CurrentConfig.SECOND_DATABASE_NAME,
},
]
现在我们可以使用Document 的meta 字段,它将数据库(由其别名表示)绑定到特定实体:
class Entity(Document):
field = StringField()
meta = {'db_alias': SECOND_DB_ALIAS}
不幸的是,它不适合我的需求,因为两个数据库中可能存在相同的实体(由相同的Document 类表示)。我想根据应用程序的逻辑设置我查询的数据库。
好吧,随便。我们仍然可以使用 Mongoengine 的context managers 动态切换数据库:
with switch_db(Entity, SECOND_DB_ALIAS):
Entity(field="value").save()
(注意:不幸的是,在写这个问题的时候是not thread-safe)
这就是我在应用程序的其余部分所做的。问题是 我在 Flask-Admin 的 ModelViews 中找不到相同的方法。这种情况下如何设置查询的数据库别名?
class EntityView(ModelView):
can_delete = True
can_edit = True
can_view_details = True
can_create = True
can_export = True
# No such or similar attribute!
database_alias = SECOND_DB_ALIAS
def __init__(self):
super().__init__(Entity, name="Entities")
admin = Admin(app, name='Admin Panel', template_mode='bootstrap3')
admin.add_view(EntityView())
【问题讨论】:
标签: python flask mongoengine flask-admin flask-mongoengine