Pyrebase流。检索数据访问

时间:2019-02-23 06:22:27

标签: python firebase pyrebase

我正在尝试在我的pyrebase上使用流,但是看来我只能对检索到的数据执行的操作是在控制台上打印它们。我需要更新全局表或将这些数据传递给其他函数,但是当我尝试调用其他函数或实例化变量pycharm时表示“未解决的引用”。有没有一种方法可以使用流来更新变量,表等?在下面,您将找到我使用的功能:

 def requestHandler(message):

    print("message type", type(message))
    print("message", message)
    print("event",message["event"])  # put
    print("path", message["path"])  # /-K7yGTTEp7O549EzTYtI
    print("data", message["data"])  # {'title': 'Pyrebase', "body": "etc..."}


requests_tab = db.child("Data")).stream(requestHandler)

在下面,您将找到打印的内容:

message type <class 'dict'>
message {'path': '/', 'data': {'start': '', 'site': '', 'end': '', 'km': '', 'task': '', 'action': '', 'date': '23.02.2019'}, 'event': 'put'}
event put
path /
data {'start': '', 'site': '', 'end': '', 'km': '', 'task': '', 'action': '', 'date': '23.02.2019'}

它似乎工作正常,但是我可以将use strem用作除打印之外的其他功能吗?


我已经在流之前,流发生任何更改之前和之后打印了变量的类型。

def printRequestTab(self):
    print("request_tab_type_stream - ", type(self.requests_tab))
    print("request_tab_stream - ", self.requests_tab)

def requestHandler(message):
    pass

requests_tab = db.child("Branch")).stream(requestHandler)

print("request_tab_type - ", type(requests_tab))
print("request_tab - ",requests_tab)
print('printRequestTab', printRequestTab)

这就是更改之前的结果:

request_tab_type -  <class 'pyrebase.pyrebase.Stream'>
request_tab -  <pyrebase.pyrebase.Stream object at 0x02654F90>
printRequestTab <function RequestScreen.printRequestTab at 0x04B3E7C8>

在我调用printRequestTab之后,requests_tab变为空。

request_tab_type_stream -  <class 'kivy.properties.ObservableList'>
request_tab_stream -  []

我现在放弃。确实需要一些帮助。

1 个答案:

答案 0 :(得分:0)

确保您可以对任何内容使用流处理程序。请记住,您将回调传递给Pyrebase,当Pyrebase在注册路径上检测到更改时,它将由class MyStuffTracker(object): """Tracks changes of my stuff in Firebase""" _db = pyrebase.initialize_app({ "apiKey": "YOUR-apiKey", "authDomain": "YOUR-authDomain", "databaseURL": "YOUR-databaseURL", "storageBucket": "YOUR-storageBucket", "serviceAccount": "YOUR-serviceAccount", }).database() my_stuff: List[dict] = None # In my example my data is a list of some dictionaries @property def is_ready(self) -> bool: """ Returns: bool: True if my stuff is ready for use """ return self.my_stuff is not None def stream_handler(self, message): print("Got some update from the Firebase") # We only care if something changed if message["event"] in ("put", "patch"): print("Something changed") if message["path"] == "/": print("Seems like a fresh data or everything have changed, just grab it!") self.my_stuff: List[dict] = message["data"] else: print("Something updated somewhere, I dont't care I just want the latest snapshot of my stuff") # Just get whole-data of my stuff and list (second) item of the pyres (that I expect to be a dict) self.my_stuff: List[dict] = list(it.item[1] for it in self._db.child("my_stuff").get().pyres) def __init__(self) -> None: """Start tracking my stuff changes in Firebase""" super().__init__() self._db.child("my_stuff").stream(self.stream_handler) tracker = MyStuffTracker() while not tracker.is_ready: pass # Just wait until the first snapshot of my stuff will be ready print(f"My stuff is: {tracker.my_stuff}") 触发。

很抱歉,您的代码段不清楚或不完整。

尝试以下示例,使其适应您的需求:

MyStuffTracker

在此示例中,_db具有专用的stream_handler初始化的Firebase数据库和方法> superman.txt,该方法仅存储新数据,或者如果在数据和基元内部发生某些嵌套更改,则将其再次拉出数据的第一个快照可用后如何启动和使用它的示例(以避免在初始化之前访问它。)

希望它对您有用。