Skip to main content

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...

Metadata

Release files for firebase 4.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for firebase 4.0.1
File Size Uploaded Provenance
firebase-4.0.1.tar.gz 12.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for firebase 4.0.1
File Interpreter ABI Platform
firebase-4.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 25.3 kB

Release files / firebase-4.0.1.tar.gz

Download URL firebase-4.0.1.tar.gz
Size 12.9 kB
Tags Source
SHA-256 checksum
How to use checksums
46ddd748c2a5e064d38b76cc6c01fc6fdc5df49184d8774c1c178ba79746121c
BLAKE2b-256 checksum
How to use checksums
a46fec2c7207f53115d39ae2a5bdb04b0df3cf341d6cc52cacbed0a315e02407
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Release files / firebase-4.0.1-py3-none-any.whl

Download URL firebase-4.0.1-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5d91cbd8cb572a0cd3ea404e108b20fe58548ef8bcf464c83077367835b175f4
BLAKE2b-256 checksum
How to use checksums
56d13ae55fbac562398ea144ba93869a9d176d0fe55f7f5a870098b396d33c88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Security for firebase 4.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page