首页 > 解决方案 > 在 Flask 应用程序中访问 mongoengine 实例的属性

问题描述

我已经在我的 Flask 应用程序中注册了flask-mongoengine扩展并对其进行了初始化。

我现在想访问它的conn属性,因为我也想做纯 MongoDB 查询。

>> app.extensions
{'csrf': <flask_wtf.csrf.CSRFProtect object at 0x00000213B72AB940>,
 'mail': <flask_mail._Mail object at 0x00000213B72ABCF8>,
 'mongoengine': {
     <flask_mongoengine.MongoEngine object at 0x00000213B72ABDD8>: {
         'app': <Flask 'app'>,
         'conn': MongoClient(host=['xxx'], document_class=dict, tz_aware=False, connect=True, ssl=True, replicaset='Cluster0-shard-0', authsource='admin', retrywrites=True, read_preference=Primary())
     }
  },
  'rq2': <flask_rq2.app.RQ object at 0x00000213B5DE8940>,
  'security': <flask_security.core._SecurityState object at 0x00000213B734EE10>
}

conn除了非常复杂(且容易出错)之外,还有其他方法可以访问该属性:

>> list(app.extensions.get('mongoengine').values())[0].get('conn')
MongoClient(host=['xxx'], document_class=dict, tz_aware=False, connect=True, ssl=True, replicaset='Cluster0-shard-0', authsource='admin', retrywrites=True, read_preference=Primary())

flask-mongoengine 是否有访问其属性的方法?

标签: flaskflask-mongoengine

解决方案


MongoEngine实例有一个connection属性使用它

你不需要使用app.extensions; 这更像是一种内部数据结构,用于扩展在需要从当前应用程序上下文访问它时跟踪自己的状态。

在您自己的代码中,只需保留对MongoEngine您创建的实例的引用。该文档使用:

db = MongoEngine(app)

或者

db = MongoEngine()
# in an app factory, attach to an app with db.init_app(app)

所以你可以使用:

db.connection

接下来,还有一个current_mongoengine_instance()实用函数,它本质上为您提供了与您的代码已经实现的对象相同的对象。像这样使用它:

from flask_mongoengine import current_mongoengine_instance

current_mongoengine_instance().connection

作为旁注:这个扩展使用的方式app.extensions是......过度设计和冗余。源代码中的基本原理是:

# Store objects in application instance so that multiple apps do not
# end up accessing the same objects.

但是多个应用程序已经有单独的app.extensions字典。尽管此方法确实允许您使用多个 mongoengine 连接,但您仍然无法使用此数据结构来区分仅具有当前应用程序上下文的不同连接。only的实现current_mongoengine_instance()进一步说明了扩展没有适当的策略来处理多个连接。无论在无序字典的上下文中可能意味着什么,您都会得到“第一个”。Flask SQLAlchemy 扩展改为使用单个扩展实例通过称为binds的系统管理多个连接。


推荐阅读