2016-12-14 6 views
0

Итак, у меня есть эта настройка для моего исходного кода, обработка данных 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__, чтобы клиент мог вызвать его? Только мои два цента.

ответ

0

zerorpc.Server ожидает экземпляр класса. По умолчанию он пытается угадать имя службы с помощью атрибута instance.__name__, который недоступен в вашем случае.

Вы можете задать имя самостоятельно, так как:

server = zerorpc.Server(services, name="mysuperservice") 

 Смежные вопросы

  • Нет связанных вопросов^_^