Skip to content
FCM Django: Send push notifications via django to websites, iOS & android mobile devices through FCM (Firebase Cloud Messaging)
Branch: master
Clone or download
Latest commit 6941730 Nov 4, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs Update index.rst Feb 16, 2017
fcm_django db writing optimized Oct 29, 2019
.gitignore added translation for app label and model verbose name Nov 28, 2018
LICENSE.txt Update LICENSE.txt Feb 18, 2017 renames Aug 5, 2016
README.rst Fixes #81 Oct 21, 2019 Initial commit Aug 5, 2016
requirements.txt pyfcm==1.4.7 compatible Oct 21, 2019
setup.cfg Create setup.cfg Aug 5, 2016 Bump version Oct 23, 2019



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')
  • 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


You can install the library directly from pypi using pip:

$ pip install fcm-django

Edit your file:


        "APP_VERBOSE_NAME": "[string for AppConfig's verbose_name]",
         # default: _('FCM Django')
        "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. migrate will install and migrate all models.


You can read more about different types of messages here.

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


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

Data message:

   "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

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"})

Sending messages in bulk

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"})

Sending messages to topic

from fcm_django.fcm import fcm_send_topic_message

fcm_send_topic_message(topic_name='My topic', message_body='Hello', message_title='A message')

Using multiple FCM server keys

By default the message will be sent using the FCM server key specified in the 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.

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]")

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:

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)

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:

Python 3 support

fcm-django is fully compatible with Python 2.7 & 3.4 & 3.5 & 3.6 & 3.7


Library relies on pyFCM for sending notifications, for more info about all the possible fields, see:

Need help, have any questions, suggestions?

Submit an issue/PR or email me at

You can’t perform that action at this time.