这是我带有修订的更新代码。我只添加了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文件,但这是我遇到错误的主要代码。
编辑的数据库
答案 0 :(得分: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进行获取请求时,它将返回该用户的数据或一个空字典。
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