Skip to main content

A Django app to include a manifest.json and Service Worker instance to enable progressive web app behavior

Project description

django-pwa

|Build Status| |Maintainability| |codecov| |PyPI - Downloads| |PyPI - Downloads| |PyPI - Downloads|

This Django app turns your project into a progressive web app <https://developers.google.com/web/progressive-web-apps/>__. Navigating to your site on an Android phone will prompt you to add the app to your home screen.

.. figure:: https://github.com/silviolleite/django-pwa/raw/master/images/screenshot1.png :alt: Prompt for install

Prompt for install

Launching the app from your home screen will display your app without browser chrome <https://github.com/silviolleite/django-pwa/raw/master/images/screenshot2.png>__. As such, it’s critical that your application provides all navigation within the HTML (no reliance on the browser back or forward button).

Requirements

Progressive Web Apps require HTTPS unless being served from localhost. If you’re not already using HTTPS on your site, check out Let’s Encrypt <https://letsencrypt.org/>__ and ZeroSSL <https://zerossl.com/>__.

Installation

Install from PyPI:

::

pip install django-pwa

Configuration

Add pwa to your list of INSTALLED_APPS in settings.py:

.. code:: python

INSTALLED_APPS = [ ... 'pwa', ... ]

Define STATICFILES_DIRS for your custom PWA_APP_ICONS

.. code:: python

STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]

Configure your app name, description, icons and splash screen images in settings.py:

.. code:: python

PWA_APP_NAME = 'My App' PWA_APP_DESCRIPTION = "My app description" PWA_APP_THEME_COLOR = '#0A0302' PWA_APP_BACKGROUND_COLOR = '#ffffff' PWA_APP_DISPLAY = 'standalone' PWA_APP_SCOPE = '/' PWA_APP_ORIENTATION = 'any' PWA_APP_START_URL = '/' PWA_APP_STATUS_BAR_COLOR = 'default' PWA_APP_ICONS = [ { 'src': '/static/images/my_app_icon.png', 'sizes': '160x160' } ] PWA_APP_ICONS_APPLE = [ { 'src': '/static/images/my_apple_icon.png', 'sizes': '160x160' } ] PWA_APP_SPLASH_SCREEN = [ { 'src': '/static/images/icons/splash-640x1136.png', 'media': '(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)' } ] PWA_APP_DIR = 'ltr' PWA_APP_LANG = 'en-US'

Show console.log ^^^^^^^^^^^^^^^^

Set the PWA_APP_DEBUG_MODE = False to disable the the console.log on browser.

All settings are optional, and the app will work fine with its internal defaults. Highly recommend setting at least PWA_APP_NAME, PWA_APP_DESCRIPTION, PWA_APP_ICONS and PWA_APP_SPLASH_SCREEN.

Add the progressive web app URLs to urls.py:

.. code:: python

from django.urls import url, include

urlpatterns = [ ... url('', include('pwa.urls')), # You MUST use an empty string as the URL prefix ... ]

Inject the required meta tags in your base.html (or wherever your HTML

is defined):

.. code:: html

{% load pwa %}

... {% progressive_web_app_meta %} ...

Troubleshooting

While running the Django test server:

  1. Verify that /manifest.json is being served
  2. Verify that /serviceworker.js is being served
  3. Verify that /offline is being served
  4. Use the Application tab in the Chrome Developer Tools to verify the progressive web app is configured correctly.
  5. Use the “Add to homescreen” link on the Application Tab to verify you can add the app successfully.

The Service Worker

By default, the service worker implemented by this app is:

.. code:: js

// Base Service Worker implementation. To use your own Service Worker, set the PWA_SERVICE_WORKER_PATH variable in settings.py

var staticCacheName = "django-pwa-v" + new Date().getTime(); var filesToCache = [ '/offline', '/css/django-pwa-app.css', '/images/icons/icon-72x72.png', '/images/icons/icon-96x96.png', '/images/icons/icon-128x128.png', '/images/icons/icon-144x144.png', '/images/icons/icon-152x152.png', '/images/icons/icon-192x192.png', '/images/icons/icon-384x384.png', '/images/icons/icon-512x512.png', '/static/images/icons/splash-640x1136.png', '/static/images/icons/splash-750x1334.png', '/static/images/icons/splash-1242x2208.png', '/static/images/icons/splash-1125x2436.png', '/static/images/icons/splash-828x1792.png', '/static/images/icons/splash-1242x2688.png', '/static/images/icons/splash-1536x2048.png', '/static/images/icons/splash-1668x2224.png', '/static/images/icons/splash-1668x2388.png', '/static/images/icons/splash-2048x2732.png' ];

// Cache on install self.addEventListener("install", event => { this.skipWaiting(); event.waitUntil( caches.open(staticCacheName) .then(cache => { return cache.addAll(filesToCache); }) ) });

// Clear cache on activate self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames .filter(cacheName => (cacheName.startsWith("django-pwa-"))) .filter(cacheName => (cacheName !== staticCacheName)) .map(cacheName => caches.delete(cacheName)) ); }) ); });

// Serve from Cache self.addEventListener("fetch", event => { event.respondWith( caches.match(event.request) .then(response => { return response || fetch(event.request); }) .catch(() => { return caches.match('offline'); }) ) });

Adding Your Own Service Worker

To add service worker functionality, you’ll want to create a serviceworker.js or similarly named template in a template directory, and then point at it using the PWA_SERVICE_WORKER_PATH variable (PWA_APP_FETCH_URL is passed through).

.. code:: python

PWA_SERVICE_WORKER_PATH = os.path.join(BASE_DIR, 'my_app', 'serviceworker.js')

The offline view

By default, the offline view is implemented in templates/offline.html You can overwrite it in a template directory if you continue using the default serviceworker.js.

Feedback

I welcome your feedback and pull requests. Enjoy!

License

All files in this repository are distributed under the MIT license.

.. |Build Status| image:: https://travis-ci.org/silviolleite/django-pwa.svg :target: https://travis-ci.org/silviolleite/django-pwa .. |Maintainability| image:: https://api.codeclimate.com/v1/badges/246542ea921058c4f76f/maintainability :target: https://codeclimate.com/github/silviolleite/django-pwa/maintainability .. |codecov| image:: https://codecov.io/gh/silviolleite/django-pwa/branch/master/graph/badge.svg :target: https://codecov.io/gh/silviolleite/django-pwa .. |PyPI - Downloads| image:: https://img.shields.io/pypi/dm/django-pwa.svg :target: https://pypi.org/project/django-pwa/ .. |PyPI - Downloads| image:: https://img.shields.io/pypi/v/django-pwa.svg :target: https://pypi.org/project/django-pwa .. |PyPI - Downloads| image:: https://img.shields.io/pypi/djversions/django-pwa.svg :target: https://pypi.org/project/django-pwa

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

django-pwa-1.0.10.tar.gz (451.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_pwa-1.0.10-py3-none-any.whl (456.6 kB view details)

Uploaded Python 3

File details

Details for the file django-pwa-1.0.10.tar.gz.

File metadata

  • Download URL: django-pwa-1.0.10.tar.gz
  • Upload date:
  • Size: 451.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.7.5

File hashes

Hashes for django-pwa-1.0.10.tar.gz
Algorithm Hash digest
SHA256 07ed9dd57108838e3fe44b551a82032ca4ed76e31cb3c3e8d51604e0fe7e81e9
MD5 1521e69739dbe9c400132668dcbe0467
BLAKE2b-256 71b0c2e89b17722d9ce5df32e86f44cd3aca128a95b94cd7dae76c8f604820ab

See more details on using hashes here.

File details

Details for the file django_pwa-1.0.10-py3-none-any.whl.

File metadata

  • Download URL: django_pwa-1.0.10-py3-none-any.whl
  • Upload date:
  • Size: 456.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.7.5

File hashes

Hashes for django_pwa-1.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 b1a2057b1e72c40c3a14beb90b958482da185f1d40a141fcae3d76580984b930
MD5 cc24adaab2d3ae69cc1a3df534de524a
BLAKE2b-256 beef25d1092562bd0bedfcc298f38fee6650371ca3ef10b452255f2a0a4ec248

See more details on using hashes here.

Supported by

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