Skip to main content

Python interface to the Google's Firebase REST APIs

Project description

Python interface to the Google's Firebase REST APIs

Author: Joe Tilsed | Created: 09.02.2019 | Last Updated: 22.02.2023 | Version 4.0.1

Firebase

Python interface to the Google's Firebase REST APIs

Firebase

Installation

$ pip install firebase

Getting Started

You can fetch any of your data in JSON format by appending '.json' to the end of the URL in which your data resides and, then send an HTTPS request through your browser. Like all other REST specific APIs, Firebase offers a client to update(PATCH, PUT), create(POST), or remove(DELETE) his stored data along with just to fetch it.

The library provides all the corresponding methods for those actions in both synchronous and asynchronous manner. You can just start an asynchronous GET request with your callback function, and the method

To fetch all the users in your storage simply do the following:

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None)
result = firebase.get('/users', None)
print(result)

>> {'1': 'Joe Tilsed', '2': 'Sydney Cox'}

The second argument of get method is the name of the snapshot. Thus, if you leave it NULL, you get the data in the URL /users.json. Besides, if you set it to 1, you get the data in the url /users/1.json. In other words, you get the user whose ID equals to 1.

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None)
result = firebase.get('/users', '1')
print(result)

>> {'1': 'Joe Tilsed'}

You can also provide extra query parameters that will be appended to the url or extra key-value pairs sent in the HTTP header.

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None)
result = firebase.get('/users/2', None, {'print': 'pretty'}, {'X_FANCY_HEADER': 'VERY FANCY'})
print(result)

>> {'2': 'Sydney Cox'}

Creating new data requires a POST or PUT request. Assuming you don't append print=silent to the url, if you use POST the returning value becomes the name of the snapshot, if PUT you get the data you just sent. If print=silent is provided, you get just NULL because the backend never sends an output.

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None)
new_user = 'Dave'

result = firebase.post('/users', new_user, {'print': 'pretty'}, {'X_FANCY_HEADER': 'VERY FANCY'})
print(result)

>> {u'name': u'<UID Hash>'}

result = firebase.post('/users', new_user, {'print': 'silent'}, {'X_FANCY_HEADER': 'VERY FANCY'})
print(result == None)

>> True

Deleting data is relatively easy compared to other actions. You just set the url and that's all. Backend sends no output as a result of a delete operation.

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', None)
firebase.delete('/users', '3')

# Dave goes away.

Authentication

Authentication in Firebase is nothing but to simply creating a token that conforms to the JWT standards and, putting it into the querystring with the name auth. The library creates that token for you so you never end up struggling with constructing a valid token on your own. If the data has been protected against write/read operations with some security rules, the backend sends an appropriate error message back to the client with the status code 403 Forbidden.

from firebase import firebase

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', authentication=None)
result = firebase.get('/users', None, {'print': 'pretty'})

print(result)

>> {'error': 'Permission denied.'}

authentication = firebase.FirebaseAuthentication('THIS_IS_MY_SECRET', 'Joe@Tilsed.com', extra={'id': 123})
firebase.authentication = authentication
print(authentication.extra)

>> {'admin': False, 'debug': False, 'email': 'Joe@Tilsed.com', 'id': 123, 'provider': 'password'}

user = authentication.get_user()
print(user.firebase_auth_token)

>> "eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJhZG1pbiI6IGZhbHNlLCAiZGVidWciOiBmYWxzZSwgIml
    hdCI6IDEzNjE5NTAxNzQsICJkIjogeyJkZWJ1ZyI6IGZhbHNlLCAiYWRtaW4iOiBmYWxzZSwgInByb3ZpZGVyIjog
    InBhc3N3b3JkIiwgImlkIjogNSwgImVtYWlsIjogIm96Z3VydnRAZ21haWwuY29tIn0sICJ2IjogMH0.lq4IRVfvE
    GQklslOlS4uIBLSSJj88YNrloWXvisRgfQ"

result = firebase.get('/users', None, {'print': 'pretty'})
print(result)

>> {'1': 'Joe Tilsed', '2': 'Sydney Cox'}

Concurrency

The interface heavily depends on the standart multiprocessing library when concurrency comes in. While creating an asynchronous call, an on-demand process pool is created and, the async method is executed by one of the idle process inside the pool. The pool remains alive until the main process dies. So every time you trigger an async call, you always use the same pool. When the method returns, the pool process ships the returning value back to the main process within the callback function provided.

import json

from firebase import firebase
from firebase import jsonutil

firebase = firebase.FirebaseApplication('https://your_storage.firebaseio.com', authentication=None)

def log_user(response):
    with open('/tmp/users/%s.json' % response.keys()[0], 'w') as users_file:
        users_file.write(json.dumps(response, cls=jsonutil.JSONEncoder))

firebase.get_async('/users', None, {'print': 'pretty'}, callback=log_user)
# That's all folks...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

firebase-4.0.1.tar.gz (12.9 kB view details)

Uploaded Source

Built Distribution

firebase-4.0.1-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file firebase-4.0.1.tar.gz.

File metadata

  • Download URL: firebase-4.0.1.tar.gz
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for firebase-4.0.1.tar.gz
Algorithm Hash digest
SHA256 46ddd748c2a5e064d38b76cc6c01fc6fdc5df49184d8774c1c178ba79746121c
MD5 f20c49b27d3512ba8388e57af318e7f7
BLAKE2b-256 a46fec2c7207f53115d39ae2a5bdb04b0df3cf341d6cc52cacbed0a315e02407

See more details on using hashes here.

File details

Details for the file firebase-4.0.1-py3-none-any.whl.

File metadata

  • Download URL: firebase-4.0.1-py3-none-any.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for firebase-4.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d91cbd8cb572a0cd3ea404e108b20fe58548ef8bcf464c83077367835b175f4
MD5 b77ed2c4e94f4ee32fce3e365bea5bc9
BLAKE2b-256 56d13ae55fbac562398ea144ba93869a9d176d0fe55f7f5a870098b396d33c88

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page