Skip to main content

Send push notifications to mobile devices & browsers through FCM in Django.

Project description

fcm-django
=========================


.. image:: https://badge.fury.io/py/fcm-django.svg
:target: https://badge.fury.io/py/fcm-django

Django app for Firebase Cloud Messaging. Used as an unified platform for sending push notifications to mobile devices & browsers (android / ios / chrome / firefox / ...).

FCMDevice model fields
- *registration_id* (required - is FCM token)
- *name* (optional)
- *active* (default: true)
- *user* (optional)
- *device_id* (optional - can be used to uniquely identify devices)
- *type* ('android', 'web', 'ios')

Functionality:
- all necessary migrations
- model admins for django admin
- admin actions for testing single and bulk notification sending
- automatic device pruning: devices to which notifications fail to send are marked as inactive
- devices marked as inactive will not be sent notifications
- Django rest framework viewsets

Setup
-----
You can install the library directly from pypi using pip:

$ pip install fcm-django


Edit your settings.py file:

.. code-block:: python

INSTALLED_APPS = (
...
"fcm_django"
)

FCM_DJANGO_SETTINGS = {
"FCM_SERVER_KEY": "[your api key]",
# true if you want to have only one active device per registered user at a time
# default: False
"ONE_DEVICE_PER_USER": True/False,
# devices to which notifications cannot be sent,
# are deleted upon receiving error response from FCM
# default: False
"DELETE_INACTIVE_DEVICES": True/False,
}

Native Django migrations are in use. ``manage.py migrate`` will install and migrate all models.

Messages
--------

You can read more about different types of messages here_.

.. _here: https://firebase.google.com/docs/cloud-messaging/concept-options

In short, there are two types: notifications and data messages.

Notification:

.. code-block:: json

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}

Data message:

.. code-block:: json

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data" : {
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
},
}

As in the following example, you can send either a notification, a data message, or both.

Sending messages
----------------

For a list of possible parameters see https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

.. code-block:: python

from fcm_django.models import FCMDevice

device = FCMDevice.objects.all().first()

device.send_message("Title", "Message")
device.send_message(data={"test": "test"})
device.send_message(title="Title", body="Message", icon=..., data={"test": "test"})

By default the message will be sent using the FCM server key specified in the settings.py. This default key can be overridden by specifying a key when calling send_message. This can be used to send messages using different firebase projects.

.. code-block:: python

from fcm_django.models import FCMDevice

device = FCMDevice.objects.all().first()
device.send_message(title="Title", body="Message", api_key="[project 1 api key]")
device.send_message(title="Title", body="Message", api_key="[project 2 api key]")

Sending messages in bulk
------------------------

.. code-block:: python

from fcm_django.models import FCMDevice

devices = FCMDevice.objects.all()

devices.send_message(title="Title", body="Message")
devices.send_message(title="Title", body="Message", data={"test": "test"})
devices.send_message(data={"test": "test"})


Django REST Framework (DRF) support
-----------------------------------
Viewsets come in two different varieties:

- ``FCMDeviceViewSet``

- Permissions as specified in settings (``AllowAny`` by default, which is not recommended)
- A device may be registered without associating it with a user
- Will not allow duplicate registration_id's

- ``FCMDeviceAuthorizedViewSet``

- Permissions are ``IsAuthenticated`` and custom permission ``IsOwner``, which will only allow the ``request.user`` to get and update devices that belong to that user
- Requires a user to be authenticated, so all devices will be associated with a user
- Will allow duplicate registration_id's for different users, so you are responsible for cleanup (if that is generally perceived as undesired behaviour or if the package itself should be doing the cleanup, open an issue or email me)

Routes can be added one of two ways:

- Routers_ (include all views)

http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers#using-routers

.. code-block:: python

from fcm_django.api.rest_framework import FCMDeviceAuthorizedViewSet

from rest_framework.routers import DefaultRouter

router = DefaultRouter()

router.register(r'devices', FCMDeviceAuthorizedViewSet)

urlpatterns = patterns('',
# URLs will show up at <api_root>/devices
# DRF browsable API which lists all available endpoints
url(r'^', include(router.urls)),
# ...
)

- Using as_view_ (specify which views to include)

http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers#binding-viewsets-to-urls-explicitly

.. code-block:: python

from fcm_django.api.rest_framework import FCMDeviceAuthorizedViewSet

urlpatterns = patterns('',
# Only allow creation of devices by authenticated users
url(r'^devices?$', FCMDeviceAuthorizedViewSet.as_view({'post': 'create'}), name='create_fcm_device'),
# ...
)

Demo project for implementation of web push notifications
-------------------
Demonstrates the use of service workers:
https://github.com/xtrinch/fcm-django-web-demo


Python 3 support
----------------
``fcm-django`` is fully compatible with Python 3.4 & 3.5

Acknowledgements
----------------
Library relies on pyFCM for sending notifications, for more info about all the possible fields, see:
https://github.com/olucurious/PyFCM

Need help, have any questions, suggestions?
----------------
Submit an issue/PR or email me at mojca.rojko@gmail.com

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

fcm-django-0.2.11.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

fcm_django-0.2.11-py2.py3-none-any.whl (13.8 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file fcm-django-0.2.11.tar.gz.

File metadata

  • Download URL: fcm-django-0.2.11.tar.gz
  • Upload date:
  • Size: 10.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for fcm-django-0.2.11.tar.gz
Algorithm Hash digest
SHA256 9d2c2b851289d7fd93c18d96ebbf8c4b3f44f92f12ea8a9d535780f209d9130c
MD5 aa61d51d51b53aee731ca3fd4824b1ca
BLAKE2b-256 9b48006e99b7fc51151c65fedaaa60dc3570448da616d9eaf7812c4db26cd829

See more details on using hashes here.

File details

Details for the file fcm_django-0.2.11-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for fcm_django-0.2.11-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f53ee226cab9c0bdb4d2922d45a2023081d4e9278d5e5d9e97d9a69d6e63d856
MD5 ecfa812b13be1cdc0caf25c4f911f219
BLAKE2b-256 5e944c94f7e4e197649f3fa537e1bb2490cf14a4a1a1936ab3662d90af6fb748

See more details on using hashes here.

Supported by

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