Итак, у меня есть эта настройка для моего исходного кода, обработка данных Python и обмен данными с базой данных (MongoDB через PyMongo) и Node.js/Восстановить вызов методов Python с помощью ZeroRPC.Передача инстанцируемого объекта или инициализация переменной класса методом класса вызывает ошибку в запуске сервера ZeroRPC
У меня есть следующие классы с функциями следующим образом:
Importer
- импорт, преобразует и очищает данные из CSV в данных JSON.Database
- объект базы данных, содержит MongoClient и обрабатывает вставку импортированных данных изImporter
.Analytics
- объект, содержащий методы интеллектуального анализа данных; тот, который должен быть передан вzerorpc.Server
. Необходимо получить экземпляр или классDatabase
вместо того, чтобы иметь доступ к базе данных.
Так вот как выглядит мой app.py
.
import os
import zerorpc
from scripts.database import Database
from scripts.importer import Importer
from scripts.analytics import Analytics
from utils.timer import time_function
ROOT = os.path.dirname(__file__)
if __name__ == "__main__":
importer = Importer()
db = Database(data=importer.data)
services = Analytics(db)
server = zerorpc.Server(services)
server.bind("tcp://0.0.0.0:1234")
server.run()
Тем не менее он показывает эту ошибку:
Traceback (most recent call last):
File "D:/Projects/Dashboards/app/app.py", line 28, in <module>
server = zerorpc.Server(Analytics())
File "D:\Projects\Dashboards\env\lib\site-packages\zerorpc\core.py", line 292, in __init__
pool_size, heartbeat)
File "D:\Projects\Dashboards\env\lib\site-packages\zerorpc\core.py", line 72, in __init__
self._methods[k] = rep(functor)
File "D:\Projects\Dashboards\env\lib\site-packages\zerorpc\decorators.py", line 36, in __init__
self.__name__ = functor.__name__
File "D:\Projects\Dashboards\env\lib\site-packages\pymongo\collection.py", line 262, in __getattr__
name, full_name, full_name))
AttributeError: Collection has no attribute '__name__'. To access the sales.__name__ collection, use database['sales.__name__'].
Process finished with exit code 1
Таким образом, в этот момент я понял, «может быть, потому что я передал экземпляр объекта, а не сам объект.»
Так что я изменила мою Analytics
в это:
from bson.son import SON
import datetime
class Analytics(object):
# def __init__(self, database):
# self.db = database.db
# self.sales = database.tb_sales
@classmethod
def connect_db(cls, database):
cls.db = database.db
cls.sales = database.tb_sales
...other methods here...
Если метод класса connect_db
когда-то был __init__
из Analytics
. И, таким образом, мой app.py
изменяется на:
import os
import zerorpc
from scripts.database import Database
from scripts.importer import Importer
from scripts.analytics import Analytics
from utils.timer import time_function
ROOT = os.path.dirname(__file__)
if __name__ == "__main__":
importer = Importer()
db = Database(data=importer.data)
Analytics.connect_db(database=db)
server = zerorpc.Server(Analytics())
server.bind("tcp://0.0.0.0:1234")
server.run()
Но все это показывает ту же ошибку.
Почему это? Есть идеи? Каким-то образом я думаю, что это что-то делать с природой zerorpc
, чтобы получить функции __name__
, чтобы клиент мог вызвать его? Только мои два цента.