2016-12-14 5 views
0

だから私は、私のバックエンド、Pythonの取り扱いデータマイニングのために、このセットアップを持っているし、データベース(PyMongo経由のMongoDB)と通信し、 Node.js/ZeroRPCを通してPythonメソッドを呼び出すことを再開する。インスタンス化されたオブジェクトを渡すか、クラスメソッドによってクラス変数を初期化するには、サーバーZeroRPCを実行するには、エラーが発生し

次のように私は機能を持つ以下のクラスがあります。

  • Importer - 輸入、変換、およびJSONデータをcsvファイルからデータをクリーンアップします。
  • 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 

「私はオブジェクト自体をオブジェクトのインスタンスを渡されていないので、多分。」だから、この時点で私は、実現クラスメソッドconnect_dbが一度Analytics__init__

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... 

は、だから私は、この私に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__をクライアントが呼び出せるようにするという性質があると思いますか?ちょうど私の2セント。

答えて

0

zerorpc.Serverはクラスインスタンスを想定しています。デフォルトでは、あなたのケースでは利用できないinstance.__name__属性を使ってサービス名を推測しようとします。

あなたはそうのような名前を自分で設定することができます

server = zerorpc.Server(services, name="mysuperservice") 
関連する問題