为大型烧瓶应用程序创建可重用的数据存储客户端

时间:2019-05-12 15:48:34

标签: python python-3.x flask google-cloud-datastore

我想创建一个从我的python flask应用程序到GCP上的数据存储实例的数据库连接。我有一个文件services / db.py:

from google.cloud import datastore
from google.auth import compute_engine
from config import env
import os
import logging
import warnings

namespace = env.str('ENV')


class Datastore_Client():

    def context_local(self):
        datastore_client = datastore.Client(namespace=namespace)
        return datastore_client

    def context_test(self):
        project = env.str("GOOGLE_CLOUD_PROJECT")
        credentials = compute_engine.Credentials()
        datastore_client = datastore.Client(credentials=credentials, project=project, namespace='test')
        return datastore_client

    def context_live(self):
        datastore_client = datastore.Client(namespace=namespace)
        return datastore_client

    def get_datastore_client(self):
        contexts = {
            'local': self.context_local,
            'test': self.context_test,
            'appengine': self.context_live
        }

        context_func = contexts.get(env.str("CONTEXT"), self.context_local)

        return context_func()

    builtin_list = list

    def from_datastore(self, entity):
        if not entity:
            return None
        if isinstance(entity, list):
            entity = entity.pop()

        return entity

在我的模型文件中,我将像这样引用数据存储区客户端:

from ..services.db import Datastore_Client
client = Datastore_Client().get_datastore_client()

但是在运行我的应用程序时在需要它的所有文件中提供此引用时,似乎为每个实例增加了一个数据库连接,而我想要一个应用程序范围的连接。

我查看了应用程序上下文,但以使用sqlite的示例为例,并在不确定是否可以将相同的方法用于数据存储之后谈论断开连接。

1 个答案:

答案 0 :(得分:0)

每次调用Datastore_Client()时都在创建一个对象。听起来您想创建一个Singleton Datastore_Client并在模型文件中使用它。