Я внедряю сменную систему хранения для промежуточного программного обеспечения в Python с Flask.
Я хотел бы запустить мою программу и создать базу данных.
Эта база данных может быть CouchDB, локальной файловой системой и т. Д. Она называется "configuration_store"
Остальная часть программы должна иметь доступ к этой базе данных.
На данный момент это выглядит так:
У меня есть папка / api с init .py и в начале этого файла у меня есть
...
configuration_store = ConfigurationStoreFactory.create("CouchDB")
config = Config()
...
Например, класс Config должен иметь доступ к единственному экземпляру хранилища configuration_store. Например, он должен иметь возможность делать что-то вроде store.getstoreurl ().
В папке / configuration_store у меня есть 4 файла: __init__py, configurtion_store_factory.py, couchDB_store.py и local_file_system_store.py.
В init .py У меня есть:
from simplekv import KeyValueStore
from abc import ABCMeta, abstractmethod, abstractproperty
class ConfigurationStore(type, KeyValueStore):
__metaclass__ = ABCMeta
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(ConfigurationStore, cls).__call__(*args, **kwargs)
return cls._instances[cls]
@abstractmethod
def getConfigurationStoreTenantUrl(self, database):
pass
@abstractproperty
def configuration_store_url(self):
pass
На моем заводе у меня есть
class ConfigurationStoreFactory():
def __init__(self, logger_name):
self.logger = Logger(logger_name)
@staticmethod
def create(type):
if type == "CouchDB":
from couchDB_store import CouchDBStore
store = CouchDBStore()
elif type == "LFS" or type == "LocalFileSystemStore":
from local_file_system_store import LocalFileSystemStore
store = LocalFileSystemStore('./data')
else: #assume LFS
from simplekv.fs import FilesystemStore
store = FilesystemStore('./data')
return store
В CouchDB_store.py у меня есть
from configuration_store import ConfigurationStore
class CouchDBStore(ConfigurationStore):
configuration_store_url = None
#Instantiate this later since we need access to the config to get it correct
def __init__(self):
super(CouchDBStore,self).__init__('CouchDBStore')
self.configuration_store_url = "https://"+ self.manager.config.getConfigKey("couchDbAdmin")+":" +self.config.getConfigKey("couchDbPassword")+"@" \
+ self.config.getConfigKey("couchDbHostHttp") + ":"+ self.config.getConfigKey("couchDbPort")+"/"
Это не работает: я получаю жалобы на "Абстрактный класс 'CouchDBStore' с экземплярами абстрактных методов" на фабрике.
У меня также есть чувство, что я путаю вещи, и это не очень хороший подход.
Сложность состоит в том, что я хочу наследовать от пакета Python simplekv, но также хочу создать подкласс для своих собственных типов баз данных и сделать весь этот пакет доступным как одноэлементный, так что будет создана только одна база данных, и она будет доступна для остальных программы.
Что было бы хорошим способом приблизиться к этому?
Я думал о том, чтобы сбросить Factory и просто выполнить инициализацию один раз в init .py и определить тип базы данных там. Но я не уверен.