python firebase实时监听器

时间:2018-04-16 18:09:20

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

你好,我是python的新手。 我想在Firebase DB上实现监听器。 当我在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

6 个答案:

答案 0 :(得分:10)

现在似乎已受支持。(2018年10月):尽管here中没有记录,但您可以在the 'Retrieving Data' guide中找到所需的功能。我对其进行了测试,其工作方式如下:

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)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

更多信息:

https://github.com/thisbejim/Pyrebase

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

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

答案 3 :(得分:0)

根据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)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果有人想使用相同的监听器功能创建多个监听器,并且想要获取有关触发节点的更多信息,则可以这样做。

Normal Listener函数将获得一个Event对象,该对象只有Data,Node Name和Event类型。如果添加多个侦听器,则要区分数据更改。您可以编写自己的类,并在创建对象时向其中添加一些信息。

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)