How to detect changes in firebase child with python?

前端 未结 3 823
醉梦人生
醉梦人生 2021-01-03 15:31

I have some troubles with this application. What I need is that If I detect a change in the database (FIREBASE) particularly in \'sala\' and \'ventilacion\' nodes the functi

相关标签:
3条回答
  • 2021-01-03 15:37

    I was working on the same thing so according to current updates on pyrebase and learning from above posted answers, I got this running perfectly.(Please make sure your python is upgraded from python2 to python3 for running pyrebase and firebase-admin)

    import firebase_admin
    import pyrebase
    from firebase_admin import credentials
    
    config = {
        "apiKey": "",
        "authDomain": "",
        "databaseURL": "",
        "projectId": "",
        "storageBucket": "",
        "serviceAccount": "path to the service account json file you downloaded",
        "messagingSenderId": "",
        "appId": "",
        "measurementId": ""
    }
    
    firebase = pyrebase.initialize_app(config)
    storage = firebase.storage()
    cred = credentials.Certificate("path to downloaded json file")
    
    firebase_admin.initialize_app(cred, {
        "databaseURL": "same as config",
        "databaseAuthVariableOverride": None
    })
    db = firebase.database()
    
    def ignore_first_call(fn):
        called = False
    
        def wrapper(*args, **kwargs):
            nonlocal called
            if called:
                return fn(*args, **kwargs)
            else:
                called = True
                return None
        return wrapper
    
    def stream_handler(message):
        ab = str(1)
        all_videos = storage.child("videos/").list_files() #node where files are
    
        path_on_local = "local path to save the downloads"
        print(message["event"]) # put
        print(message["path"]) # /-K7yGTTEp7O549EzTYtI
        print(message["data"]) # {'title': 'Pyrebase', "body": "etc..."}
    
        node = str(message["path"]).split('/')[-2] 
        property = str(message["path"]).split('/')[-1]
        value = message["data"]
    
        if (message["event"] == "put"):
            for videos in all_videos:
                try:
                    print(videos.name)
                    z = storage.child(videos.name).get_url(None)
                    storage.child(videos.name).download(path_on_local + "/" + ab + ".mp4")
                    x = int(ab)
                    ab = str(x + 1)
                except:
                    print('Download Failed')
    
        else:
            print("error")
    
    my_stream = db.child("videos").stream(stream_handler)
    
    0 讨论(0)
  • 2021-01-03 15:38

    Question: How to detect changes in firebase child


    Note: All Examples use Public Access

    1. Setup Example Data and verify it's readable.
      This hase to be done once!

      temperature_c = 30
      data = {'date':time.strftime('%Y-%m-%d'), 
              'time':time.strftime('%H:%M:%S'), 
              'temperature':temperature_c}
      db.child('public').child('Device_1').set(data)
      
      response = db.child('public').child('Device_1').get()
      print(response.val())
      
    2. Create First Script doing Updates:

      for t in [25, 26, 27, 28, 29, 30, 31, 32, 33, 35]:
          temperature_c = t
          data = {'date':time.strftime('%Y-%m-%d'), 
                  'time':time.strftime('%H:%M:%S'), 
                  'temperature':temperature_c}
          db.child('public').child('Device_1').update(data)
          time.sleep(60)
      
    3. Create Second Script with Stream Handler

      def stream_handler(message):
          print('event={m[event]}; path={m[path]}; data={m[data]}'
              .format(m=message))
      
      my_stream =db.child('public').child('Device_1').stream(stream_handler)
      
      # Run Stream Handler forever
      while True:
          data = input("[{}] Type exit to disconnect: ".format('?'))
          if data.strip().lower() == 'exit':
              print('Stop Stream Handler')
              if my_stream: my_stream.close()
              break
      
    4. Run Stream Handler Script:

      Response Output from def stream_handler after startup (Initial Data):

      event="put"; path=/;  data={'Device_1': {'temperature': 30, 'time': '13:34:24', 'date': '2017-07-20'}}
      
    5. Run Updater Script:

    6. Watch Output from Stream Handler Script

      Response Output from def stream_handler after First Update Data:

      event=patch; path=/Device_1;  data={'temperature': 25, 'time': '13:49:12'}
      

    Tested with Python: 3.4.2


    Pyrebase
    streaming

    You can listen to live changes to your data with the stream() method.

    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)
    

    You should at least handle put and patch events. Refer to "Streaming from the REST API" for details.

    0 讨论(0)
  • 2021-01-03 15:50

    I know this post is 2 years old but hope this helps. Try using firebase_admin module.

    Use this command - pip install firebase-admin

    I too had a requirement where I needed to check for changes made to the Firebase database. I referred here

    Following is a sample code based on your question which you can refer from and try it out.

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import db
    
    
    cred = credentials.Certificate("path/to/serviceAccountKey.json")
    firebase_admin.initialize_app(cred, {
        'databaseURL': 'https://example.firebaseio.com',
        'databaseAuthVariableOverride': None
    })
    
    
    def ignore_first_call(fn):
        called = False
    
        def wrapper(*args, **kwargs):
            nonlocal called
            if called:
                return fn(*args, **kwargs)
            else:
                called = True
                return None
    
        return wrapper
    
    
    @ignore_first_call
    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
    
        node = str(event.path).split('/')[-2] #you can slice the path according to your requirement
        property = str(event.path).split('/')[-1] 
        value = event.data
        if (node=='sala'):
            #do something
        elif (node=='ventilacion'):
            #do something
        else:
            #do something else
    
    
    db.reference('/').listen(listener)
    
    0 讨论(0)
提交回复
热议问题