【问题标题】:Flask -- Reloading database which was loaded before first requestFlask -- 重新加载在第一次请求之前加载的数据库
【发布时间】:2017-04-28 09:13:49
【问题描述】:

我在连接到 MongoDB 的烧瓶上运行了一个 API,它使用这个数据库进行只读。 我在第一次请求之前连接到数据库:

@app.before_first_request
def load_dicti():
    c = MongoClient('mongodb://' + app.config['MONGO_DSN'], connect=False)
    db = c.my_name
    app.first, app.second = dictionary_compilation(db.my_base, another_dictionary)

但是,这个 mongodb 可能会不时更新。我的 API 不知道,因为这个数据库在第一次请求之前就已经加载了。

应对它最有效的方法是什么?我将不胜感激解释和代码示例。

【问题讨论】:

    标签: mongodb python-3.x flask


    【解决方案1】:

    我不太清楚你要做什么,但Application Context 可能是最佳做法。就像 Flask 文档中的 demo 一样,您可以这样做:

    def get_db():
        """Opens a new database connection if there is none yet for the
        current application context.
        """
        if not hasattr(g, 'db'):
            c = MongoClient('mongodb://' + app.config['MONGO_DSN'], connect=False)
            g.db = c.my_name
        return g.db
    

    那么,你可以直接在你的视图函数中使用get_db(),只有当g中没有db attr时,mongdb才会被连接一次。

    如果您的连接不稳定以至于您需要每次更改它,您可以连接每个请求或每个session

    【讨论】:

    • 我在第一次请求之前将数据库上传到 api 内存中。如果我理解您的建议,那么: b) 在这种情况下,它是否发生在第一次请求之前?
    • upload 是什么意思?是在第一次请求之前初始化app.config['MONGO_DSN'] 吗?在大多数情况下,MongoClient 实例是可重用且线程安全的,因此通过在应用上下文中创建来共享它
    • 我的意思是数据库存储在 db = c.my_name 之后的 api 内存中,这发生在 before_first_request 装饰器之后。在我的情况下,我需要在之后再次读取它,所以我必须更改它
    • 如何把它放在g 之后db = c.my_name,就像附加行g.db = db 一样?那么你可以在其他请求中通过g.db 得到它,这是你想要的吗?
    • 我实际上需要两件事:1)数据库不能在每次请求api时上传; 2)有时我仍然可能需要重新加载它(可能是手动);也许通过另一种 api 方法我可以如何使用 g.db?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多