gpt4 book ai didi

flask - 在Flask应用中访问mongoengine实例的属性

转载 作者:行者123 更新时间:2023-12-03 17:10:19 30 4
gpt4 key购买 nike

我已经在我的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实例has a connection attribute,使用它。

您无需使用app.extensions;这更多是扩展的内部数据结构,以便扩展程序在需要从当前应用程序上下文访问此状态时跟踪其自身状态。

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

db = MongoEngine(app)


要么

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


因此您可以使用:

db.connection


接下来,还有一个 current_mongoengine_instance() utility function,它实际上为您提供与代码已实现的对象相同的对象。像这样使用它:

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连接,但是您仍然不能仅使用当前应用程序上下文使用此数据结构来区分不同的连接。 current_mongoengine_instance()的实现仅进一步说明该扩展名没有适当的策略来处理多个连接。您仅获得“第一个”,无论在无序字典的背景下可能意味着什么。相反,Flask SQLAlchemy扩展使用单个扩展实例通过称为 binds的系统管理多个连接。

关于flask - 在Flask应用中访问mongoengine实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57308259/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com