Python - Как мне получить и использовать данные из Firebase? - PullRequest
0 голосов
/ 08 февраля 2019

Вот мой обновленный код с ревизиями.Я только добавил 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

1 Ответ

0 голосов
/ 08 февраля 2019

Здесь нужно понять пару понятий.Первая - это система rule базы данных 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, чтобы запросить его.,Следующая концепция здесь - отправка некоторых специальных аргументов в URL вашего запроса get (прочитайте документацию Firebase здесь ).В этом случае вам нужно попытаться получить данные из вашего местоположения верхнего уровня (/) и 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

Обратите внимание, как вы используете символ ?, чтобы указать, что вы собираетесь отправлять некоторые специальные параметры, и & означает, что прибывает другой специальный параметр.Также убедитесь, что ваши значения, которые вы упорядочиваете или равняетесь, заключены в " (при условии, что их строки в вашей базе данных являются такими, какие они есть на данный момент).

Когда вы выполняете запрос get наэтот 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...