flask - 在 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 是否有访问其属性的方法?
解决方案
该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的系统管理多个连接。
推荐阅读
- ajax - Woocommerce 结帐页面 - Ajax 刷新运费
- python - 线程阻塞了控制台
- matlab - 在左侧对齐子图 ylabel
- iis - IIS:可导出 SSL 证书请求和私钥
- python - Firestore:收听子集合中的文档
- android - 在 react native 中发布 apk 时出现“react-native-gesture-handler”错误
- javascript - Javascript按字母和数字顺序将图像导入Photoshop
- java - 当我关闭并 admob 插页式广告时,它会发生意外的活动
- php - GoDaddy 无法选择数据库
- python - 在 .txt 文件中搜索特定单词并在该单词之后打印数据