我试图在我的pyrebase上使用流,但似乎我对检索的数据所能做的唯一的事情就是在控制台上打印它们。我需要更新一个全局表,或者将这些数据传递给其他函数,但是当我试图调用其他函数或实例化变量时,py魅力说是“未解决的参考”。有没有一种方法可以使用流来更新变量、表等?下面将找到我使用的函数:
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'}它似乎很好,但我可以使用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 - []我现在放弃了。真的需要帮助。
发布于 2019-04-14 15:49:32
当然,您可以在任何情况下使用流处理程序。请记住,您将一个回调传递给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,一个初始化的Firebase DB,一个方法stream_handler,如果数据内部发生了一些嵌套的更改,它只会存储新的数据或再次提取数据,并有一个关于如何在数据的第一个快照可用后启动和使用它的基本示例(以避免在初始化数据之前访问它)。
希望它对你有用。
https://stackoverflow.com/questions/54838847
复制相似问题