Python - 如何获取和使用来自firebase的数据?

问题描述 投票:0回答:1

这是我更新的代码和修订版。我只添加了user_num = 1以试图避免我得到的不受支持的操作数错误,但这也不起作用。

的.py

class MetropolisApp(App):
    user_num = 1
    database_url = 'https://metropolis-58211.firebaseio.com/'

    def build(self):
        self.my_firebase = MyFirebase()
        return ControlScreens()

    def on_start(self):
        user_num_req = requests.get("https://metropolis-58211.firebaseio.com/user_num.json")
        self.user_num = user_num_req.json()

        db = requests.get('https://metropolis-58211.firebaseio.com/' + str(self.user_num) + '.json')
        #print(db.ok)
        data = json.loads(db.content.decode())
        #print(data)


    def post(self, firstname, lastname, email, username, password):

        self.user_num += 1

        # Make a python dictionary
        fname_data = {"fname": firstname}
        lname_data = {"lname": lastname}
        email_data = {"email": email}
        user_id = {"userid": username}
        user_pw = {"userpw": password}

        # Send the python dictionary
        requests.post(url=self.database_url + str(self.user_num) + '.json', json=fname_data)
        requests.post(url=self.database_url + str(self.user_num) + '.json', json=lname_data)
        requests.post(url=self.database_url + str(self.user_num) + '.json', json=email_data)
        requests.post(url=self.database_url + str(self.user_num) + '.json', json=user_id)
        requests.post(url=self.database_url + str(self.user_num) + '.json', json=user_pw)

    def in_database(self, firstname, lastname, email, username, password):

        fname_data = {"fname": firstname}
        lname_data = {"lname": lastname}
        email_data = {"email": email}
        user_id = {"userid": username}
        user_pw = {"userpw": password}

        requests.patch(url=self.database_url + str(self.user_num) + '.json', json=fname_data)
        requests.patch(url=self.database_url + str(self.user_num) + '.json', json=lname_data)
        requests.patch(url=self.database_url + str(self.user_num) + '.json', json=email_data)
        requests.patch(url=self.database_url + str(self.user_num) + '.json', json=user_id)
        requests.patch(url=self.database_url + str(self.user_num) + '.json', json=user_pw)

        check_request = requests.get(
            'https://metropolis-58211.firebaseio.com/.json?orderBy="userid"&equalTo="%s"' % self.root.ids[
                'user_login'].text)
        print(check_request.json())

        # print(self.root.ids)

不确定是否需要.kv文件,但这里是我遇到错误的主要代码。

编辑数据库

enter image description here

python firebase kivy
1个回答
0
投票

这里有几个概念需要理解。第一个是Firebase实时数据库的规则系统。规则系统规定允许对数据库进行何种类型的读/写操作。规则系统的一个重要部分是使用indexes告诉Firebase您希望能够通过某个参数查询数据。例如,您需要通过userid参数查询数据库。在实时数据库的规则选项卡中,您需要告诉Firebase让'indexOn'为'userid'参数,如下所示:

{
  "rules": {
    ".read": true, // Note - this allows all reads from anyone anywhere. only use for testing
    ".write": true, // same comment
    ".indexOn": ["userid"] // You can allow multiple indexOns by doing ["userid","foo","bar"]
  }
}

上面的“.indexOn”部分是您的顶级规则(数据库中的/)的一部分,并且您希望索引某些特殊标识符(/special_identifier/userid)中的数据。在这种情况下,测试用户的特殊标识符是2

既然您允许通过userid参数查询数据库,则需要使用python实际发送请求以进行查询。这里的下一个概念是在get请求的URL中发送一些特殊参数(阅读Firebase的文档here)。在这种情况下,您需要尝试从顶级(/)位置获取数据,并且orderBy userid并且仅返回值equalTo self.root.ids['user_login'].text

在这种情况下,您的URL将是:

'https://metropolis-58211.firebaseio.com/.json?orderBy="userid"&equalTo="%s"'%self.root.ids['user_login'].text

注意你如何使用?字符指定你将发送一些特殊参数,而&意味着另一个特殊参数即将到来。还要确保您在"中包含您订购或等于的值(假设它们在您的数据库中的字符串,它们目前正在进行)。

当您对该URL执行get请求时,它将返回该用户的数据或空字典。

check_request = requests.get('https://metropolis-58211.firebaseio.com/.json?orderBy="userid"&equalTo="%s"'%self.root.ids['user_login'].text)
print(check_request.json()) # If this has data, the user exists, if it's an empty dictionary, {}, the user doesn't exist
© www.soinside.com 2019 - 2024. All rights reserved.