python firebase realtime listener

前端 未结 6 1073
离开以前
离开以前 2020-12-05 16:47

Hi there I\'m new in python. I would like to implement the listener on my Firebase DB. When I change one or more parameters on the DB my Python code have to do something. Ho

相关标签:
6条回答
  • 2020-12-05 17:14

    You can use Pyrebase, which is a python wrapper for the Firebase API.

    more info here:

    https://github.com/thisbejim/Pyrebase

    To retrieve data you need to use val(), example:

    users = db.child("users").get()
    print(users.val())
    
    0 讨论(0)
  • 2020-12-05 17:20

    It looks like this is supported now (october 2018): although it's not documented in the 'Retrieving Data' guide, you can find the needed functionality in the API reference. I tested it and it works like this:

    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)
    
    0 讨论(0)
  • 2020-12-05 17:20

    As you can see on the per-language feature chart on the Firebase Admin SDK home page, Python and Go currently don't have realtime event listeners. If you need that on your backend, you'll have to use the node.js or Java SDKs.

    0 讨论(0)
  • 2020-12-05 17:21

    Python Firebase Realtime Listener Full Code :

    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)
    

    Output:

    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
    
    0 讨论(0)
  • 2020-12-05 17:28

    If Anybody wants to create multiple listener using same listener function and want to get more info about triggered node, One can do like this.

    Normal Listener function will get a Event object it has only Data, Node Name, Event type. If you add multiple listener and You want to differentiate between the data change. You can write your own class and add some info to it while creating object.

    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
    

    Creating Objects:

    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)
    

    Full Code:

    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)
    
    0 讨论(0)
  • 2020-12-05 17:36

    As Peter Haddad suggested, you should use Pyrebase for achieving something like that given that the python SDK still does not support realtime event listeners.

    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)
    
    0 讨论(0)
提交回复
热议问题