【问题标题】:Accessing the properties of the mongoengine instance in a Flask app在 Flask 应用程序中访问 mongoengine 实例的属性
【发布时间】:2019-08-01 11:42:22
【问题描述】:

我已经在我的 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 是否有访问其属性的方法?

【问题讨论】:

    标签: flask flask-mongoengine


    【解决方案1】:

    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 的系统管理多个连接。

    【讨论】:

    • 感谢您向我保证 create_app 工厂模式不会干扰我的计划 :) 顺便说一句,stackoverflow.com/a/50361552/308204 帮助我找到了使数据库引用可用的最佳方法。也感谢您的更新,我已经对为什么扩展程序与其他扩展程序不同感到困惑。我想我在技术上可以访问实例的连接属性,如果扩展已经像其他设置一样:)
    【解决方案2】:

    您还可以通过

    从任何 Document 类中访问底层 pymongo.Collection
    class MyDocument(Document):
        name = StringField()
    
    MyDocument(name='John').save()
    
    coll = MyDocument._get_collection()
    print(coll.find_one({'name': 'John'}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多