【问题标题】:python firebase realtime listenerpython firebase实时监听器
【发布时间】:2020-12-03 11:04:50
【问题描述】:

您好,我是 python 新手。 我想在我的 Firebase DB 上实现监听器。 当我更改数据库上的一个或多个参数时,我的 Python 代码必须做一些事情。 我该怎么做? 非常感谢

我的数据库就像从 001 到 200 的简单数据列表:

"remote-controller"
001 -> 000
002 -> 020
003 -> 230

我的代码是:

from firebase import firebase
firebase = firebase.FirebaseApplication('https://remote-controller.firebaseio.com/', None)
result = firebase.get('003', None)
print result

【问题讨论】:

    标签: python firebase firebase-realtime-database firebase-admin


    【解决方案1】:

    现在似乎支持此功能(2018 年 10 月):虽然 the 'Retrieving Data' guide 中没有记录,但您可以在 the API reference 中找到所需的功能。我测试了它,它的工作原理是这样的:

    def listener(event):
        print(event.event_type)  # can be 'put' or 'patch'
        print(event.path)  # relative to the reference, it seems
        print(event.data)  # new data at /reference/event.path. None if deleted
    
    firebase_admin.db.reference('my/data/path').listen(listener)
    

    【讨论】:

    • 效果很好。然而,我注意到,当我第一次运行我的 python 脚本时,尽管发生了任何变化,事件还是被触发了。有没有办法防止这种情况发生?
    • 我在实验的时候没有注意到这一点,也许他们改变了它或者我只是不专心。无论如何,我认为此时 API 中没有任何功能可以防止注册时的初始调用。您可能应该尝试处理这样的“额外”调用,因为如果我没记错的话,无论如何都可以为相同的数据多次触发事件。或者使用这样的东西:pastebin.com/W2diZnCM
    • 它可以工作,但它有一个错误:即使没有变化,它也会每小时触发一次并转储整个数据库。当您的数据库很大时,会导致成本上升。
    • @RawMean 正如我之前所说,如果我没记错的话,Firebase 希望您的代码能够抵御此类多余的更新。
    • @Marein 我的代码可以处理重复项。问题是我为虚假下载数据收费。联系了火力基地。这是 python API 的一个已知问题,没有计划改变它。
    【解决方案2】:

    正如Peter Haddad 建议的那样,鉴于python SDK 仍然不支持实时事件侦听器,您应该使用Pyrebase 来实现类似的功能。

    import pyrebase
    
    config = {
        "apiKey": "apiKey",
        "authDomain": "projectId.firebaseapp.com",
        "databaseURL": "https://databaseName.firebaseio.com",
        "storageBucket": "projectId.appspot.com"
    }
    
    firebase = pyrebase.initialize_app(config)
    
    db = firebase.database()
    
    def stream_handler(message):
        print(message["event"]) # put
        print(message["path"]) # /-K7yGTTEp7O549EzTYtI
        print(message["data"]) # {'title': 'Pyrebase', "body": "etc..."}
    
    
    my_stream = db.child("posts").stream(stream_handler)
    

    【讨论】:

      【解决方案3】:

      如果有人想使用同一个监听函数创建多个监听器并且想获得更多关于触发节点的信息,可以这样做。

      普通的监听器函数会得到一个事件对象,它只有数据、节点名称、事件类型。如果你添加了多个监听器并且你想区分数据的变化。您可以编写自己的类并在创建对象时为其添加一些信息。

      class ListenerClass:
          def __init__(self, appname):
              self.appname = appname
      
          def listener(self, event):
              print(event.event_type)  # can be 'put' or 'patch'
              print(event.path)  # relative to the reference, it seems
              print(event.data)  # new data at /reference/event.path. None if deleted
              print(self.appname) # Extra data related to change add your own member variable
      

      创建对象:

      listenerObject = ListenerClass(my_app_name + '1')
      db.reference('PatientMonitoring', app= obj).listen(listenerObject.listener)
      
      listenerObject = ListenerClass(my_app_name + '2')
      db.reference('SomeOtherPath', app= obj).listen(listenerObject.listener)
      

      完整代码:

      import firebase_admin
      from firebase_admin import credentials
      from firebase_admin import db
      
      # Initialising Database with credentials
      json_path = r'E:\Projectz\FYP\FreshOnes\Python\PastLocations\fyp-healthapp-project-firebase-adminsdk-40qfo-f8fc938674.json'
      my_app_name = 'fyp-healthapp-project'
      xyz = {'databaseURL': 'https://{}.firebaseio.com'.format(my_app_name),'storageBucket': '{}.appspot.com'.format(my_app_name)}
      
      cred = credentials.Certificate(json_path)        
      obj = firebase_admin.initialize_app(cred,xyz , name=my_app_name)
      
      # Create Objects Here, You can use loops and create many listener, But listener will create thread per every listener, Don't create irrelevant listeners. It won't work if you are running on machine with thread constraint
      
      listenerObject = ListenerClass(my_app_name + '1') # Decide your own parameters, How you want to differentiate. Depends on you
      db.reference('PatientMonitoring', app= obj).listen(listenerObject.listener)
      
      listenerObject = ListenerClass(my_app_name + '2')
      db.reference('SomeOtherPath', app= obj).listen(listenerObject.listener)
      

      【讨论】:

        【解决方案4】:

        正如您在 Firebase Admin SDK home page 上的每种语言功能图表中所见,Python 和 Go 目前没有实时事件侦听器。如果您需要在后端使用它,则必须使用 node.js 或 Java SDK。

        【讨论】:

        • 你能给我发一些例子或者把我重定向到一个网页吗??
        • 我已将您链接到 Firebase Admin SDK 的页面。从那里开始。
        【解决方案5】:

        您可以使用 Pyrebase,它是 Firebase API 的 Python 包装器。

        更多信息在这里:

        https://github.com/thisbejim/Pyrebase

        要检索数据需要使用val(),例如:

        users = db.child("users").get()
        print(users.val())
        

        【讨论】:

          【解决方案6】:

          Python Firebase 实时监听器完整代码:

          import firebase_admin
          from firebase_admin import credentials
          from firebase_admin import db
          
          def listener(event):
              print(event.event_type)  # can be 'put' or 'patch'
              print(event.path)  # relative to the reference, it seems
              print(event.data)  # new data at /reference/event.path. None if deleted
              
          json_path = r'E:\Projectz\FYP\FreshOnes\Python\PastLocations\fyp-healthapp-project-firebase-adminsdk-40qfo-f8fc938674.json'
          my_app_name = 'fyp-healthapp-project'
          xyz = {'databaseURL': 'https://{}.firebaseio.com'.format(my_app_name),'storageBucket': '{}.appspot.com'.format(my_app_name)}
          
          cred = credentials.Certificate(json_path)        
          obj = firebase_admin.initialize_app(cred,xyz , name=my_app_name)
          
          db.reference('PatientMonitoring', app= obj).listen(listener)
          

          输出:

          put
          /
          {'n0': '40', 'n1': '71'} # for first time its gonna fetch the data from path whether data is changed or not
          
          put # On data changed 
          /n1  
          725
          
          put # On data changed 
          /n0
          401
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-08-22
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            • 2019-05-25
            • 2017-10-03
            • 2018-08-02
            相关资源
            最近更新 更多