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'}
Кажется, это работает нормально, но могу ли я использовать использование 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 - запросы_стали пустыми
request_tab_type_stream - <class 'kivy.properties.ObservableList'>
request_tab_stream - []
Я сдаюсь сейчас. Действительно нужна помощь.
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
инициализированный Firebase DB метод stream_handler
он просто сохраняет свежие данные или извлекает их снова, если внутри данных произошли некоторые вложенные изменения, и примитивный пример того, как запускать и использовать их после того, как станет доступен первый снимок ваших данных (чтобы избежать доступа к ним до их инициализации).
Надеюсь, это работает для вас.