A plugin to simplify creating multi-page Dash apps

Overview

Multi-Page Dash App Plugin

A plugin to simplify creating multi-page Dash apps. This is a preview of functionality that will of Dash 2.1.

Background

The goal of this plugin is to remove as much boilerplate as possible when creating multi-page Dash apps.

This plugin allows users to simply place their layouts in pages/ and call dash.register_page with the desired URL path of that page.

This plugin will automatically:

  • Create the URL routing callback
  • Add page information to dash.page_registry that can be used when creating navigation bars
  • Set validate_layout accordingly so that you don't need to suppress_callback_exceptions for simple multi-page layouts
  • Set the order of dash.page_registry based off order and the filename
  • Set </code> and and their social media equivalents accordingly in the index_string of the HTML that is served on page-load
  • Set a clientside callback to update the </code> as you navigate pages with dcc.Link
  • Set the social media meta image accordingly based off of images available in assets

Usage

Option 1 - In this project

Clone this repo and then run python app.py. pages_plugin.py is the functionality that will become part of the dash library. The pages/ folder demonstrates examples of how to use dash.register_page.

Option 2 - In your own projects

  1. Copy pages_plugin.py into your project folder. In the future, this will be part of dash and you won't need to copy this file.
  2. In app.py, pass the plugin into Dash:
import pages_plugin

app = Dash(__name__, plugins=[pages_plugin])
  1. Create a folder called pages/ and place your app layouts in files within that folder. Each file needs to:
  • Define layout. This can be a variable or function that returns a component
  • Call dash.register_page(__name__) to tell pages_plugin that this page should be part of the multi-page framework

For example: pages/historical_outlook.py

import dash
from dash import html

dash.register_page(__name__)

def layout():
    return html.Div('This page is the historical outlook')

dash.register_page will can accept various arguments to customize aspects about the page like path (the URL of the page), title (the browser tab's title of the page), and more. See the API reference below for details.

pages/home.py

import dash
from dash import html

dash.register_page(
    __name__,
    path='/',
    title='Analytics App'
)

def layout():
    return html.Div('This is the home page')
  1. Modify app.layout to display the URLs for page navigation and include the container that displays the page's content.
  • dash.page_registry: The page URLs can be found in dash.page_registry. This is an OrderedDict with keys being the page's module name (e.g. pages.historical_outlook) and values being a dictionary containing keys path, name, order, title, description, image, and layout. This page_registry is populated from calling dash.register_page within pages/.
  • pages_plugin.page_container: This component defines where the page's content will render on page navigation.

app.py

import pages_plugin

app = Dash(__name__, plugins=[pages_plugin])

app.layout = html.Div([
    # Display the URLs by looping through `dash.page_registry`
    # In practice, this might be a `ddk.Header` or a `dbc.NavbarSimple`
    html.Div([dcc.Link(page['name'], href=page['path']) for page in dash.page_registry),
    
    html.Hr()
    
    # Set the container where the page content will be rendered into on page navigation
    pages_plugin.page_container
])

Refrence

dash.register_page

def register_page(
    module,
    path=None,
    name=None,
    order=None,
    title=None,
    description=None,
    image=None,
    layout=None,
    **kwargs
):

Assigns the variables to dash.page_registry as an OrderedDict (ordered by order).

dash.page_registry is used by pages_plugin to set up the layouts as a multi-page Dash app. This includes the URL routing callbacks (using dcc.Location) and the HTML templates to include title, meta description, and the meta description image.

dash.page_registry can also be used by Dash developers to create the page navigation links or by template authors.

  • module: The module path where this page's layout is defined. Often __name__.

  • path: URL Path, e.g. / or /home-page. If not supplied, will be inferred from module, e.g. pages.weekly_analytics to /weekly-analytics

  • name: The name of the link. If not supplied, will be inferred from module, e.g. pages.weekly_analytics to Weekly analytics

  • order: The order of the pages in page_registry. If not supplied, then the filename is used and the page with path / has order 0

  • title: The name of the page . That is, what appears in the browser title. If not supplied, will use the supplied name or will be inferred by module, e.g. pages.weekly_analytics to Weekly analytics

  • description: The . If not supplied, then nothing is supplied.

  • image: The meta description image used by social media platforms. If not supplied, then it looks for the following images in assets/:

    • A page specific image: assets/. is used, e.g. assets/weekly_analytics.png
    • A generic app image at assets/app.
    • A logo at assets/logo.
  • layout: The layout function or component for this page. If not supplied, then looks for layout from within the supplied module.

  • **kwargs: Arbitrary keyword arguments that can be stored

page_registry stores the original property that was passed in under supplied_ and the coerced property under . For example, if this was called:

register_page(
    'pages.historical_outlook',
    name='Our historical view',
    custom_key='custom value'
)

Then this will appear in page_registry:

OrderedDict([
    (
        'pages.historical_outlook', 
        dict(
            module='pages.historical_outlook',
            
            supplied_path=None,
            path='/historical-outlook',
            
            supplied_name='Our historical view',
            name='Our historical view',
            
            supplied_title=None,
            title='Our historical view'
            
            supplied_description=None,
            description='Our historical view',
            
            supplied_order=None,
            order=1,
            
            supplied_layout=None,
            layout=<function pages.historical_outlook.layout>,
            
            custom_key='custom value'
        )
    ),
])
Owner
Plotly
Plotly
Blender 2.93 addon for loading Quake II MD2 files

io_mesh_md2 is a Blender 2.93 addon for importing Quake II MD2 files.

Joshua Skelton 11 Aug 31, 2022
Tools to connect to and interact with the Mila cluster

milatools The milatools package provides the mila command, which is meant to help with connecting to and interacting with the Mila cluster. Install Re

Mila 32 Dec 01, 2022
A simple tool to extract python code from a Jupyter notebook, and then run pylint on it for static analysis.

Jupyter Pylinter A simple tool to extract python code from a Jupyter notebook, and then run pylint on it for static analysis. If you find this tool us

Edmund Goodman 10 Oct 13, 2022
Script to generate a massive volume of data in sql, csv, json or xml format

DataGenerator Made with Python Open for pull requests 1. Dependencies To install required dependencies run pip install -r requirements.txt 2. Executi

icrescenti 3 Sep 20, 2022
one_click_kag_server is a program which tries to fully automate the creation of a King Arthur's Gold server.

one_click_kag_server is a program which tries to fully automate the creation of a King Arthur's Gold server.

Benjamin Gorman 4 Jan 05, 2022
password generator

Password generator technologies used What is? It is Password generator How to Download? Download on releases Clone repo git clone https://github.com/m

1 Dec 16, 2021
Early version for manipulate Geo localization data trough API REST.

Backend para obtener los datos (beta) Descripción El servidor está diseñado para recibir y almacenar datos enviados en forma de JSON por una aplicació

Víctor Omar Vento Hernández 1 Nov 14, 2021
Gradually automate your procedures, one step at a time

Gradualist Gradually automate your procedures, one step at a time Inspired by https://blog.danslimmon.com/2019/07/15/ Features Main Features Converts

Ross Jacobs 8 Jul 24, 2022
Script for generating Hearthstone card spoilers & checklists

This is a script for generating text spoilers and set checklists for Hearthstone. Installation & Running Python 3.6 or higher is required. Copy/clone

John T. Wodder II 1 Oct 11, 2022
Python script to launch burp scans automatically

SimpleAutoBurp Python script that takes a config.json file as config and uses Burp Suite Pro to scan a list of websites.

Adan Álvarez 26 Jul 18, 2022
✨ Un bot Twitter totalement fait en Python par moi, et en français.

Twitter Bot ❗ Un bot Twitter totalement fait en Python par moi, et en français. Il faut remplacer auth = tweepy.OAuthHandler(consumer_key, consumer_se

MrGabin 3 Jun 06, 2021
Automatically Generate Rulesets for IIS for Intelligent HTTP/S C2 Redirection

Automatically Generate Rulesets for IIS for Intelligent HTTP/S C2 Redirection This project converts a Cobalt Strike profile to a functional web.config

Jesse 99 Dec 13, 2022
Audio Steganography is a technique used to transmit hidden information by modifying an audio signal in an imperceptible manner.

Audio Steganography Audio Steganography is a technique used to transmit hidden information by modifying an audio signal in an imperceptible manner. Ab

Karan Yuvraj Singh 1 Oct 17, 2021
Fraud Multiplication Table Detection in python

Fraud-Multiplication-Table-Detection-in-python In this program, I have detected fraud multiplication table using python without class. Here, I have co

Sachin Vinayak Dabhade 4 Sep 24, 2021
Convert any-bit number to decimal number and vise versa.

2deci Convert any-bit number to decimal number and vise versa. --bit n to set bit to n --exp xxx to set expression to xxx --r to run reversely (from d

3 Sep 15, 2021
Give you a better view of your Docker registry disk usage.

registry-du Give you a better view of your Docker registry disk usage. This small tool will analysis your Docker registry(vanilla or Harbor both work)

Nova Kwok 16 Jan 07, 2023
Python tool to check a web applications compliance with OWASP HTTP response headers best practices

Check Your Head A quick and easy way to check a web applications response headers!

Zak 6 Nov 09, 2021
🔩 Like builtins, but boltons. 250+ constructs, recipes, and snippets which extend (and rely on nothing but) the Python standard library. Nothing like Michael Bolton.

Boltons boltons should be builtins. Boltons is a set of over 230 BSD-licensed, pure-Python utilities in the same spirit as — and yet conspicuously mis

Mahmoud Hashemi 6k Jan 04, 2023
Bounding Boxes Python Utils

Bounding Boxes Python Utils

Vadim 4 May 01, 2022
Run functions in parallel easily, with their results typed correctly!

typesafe_parmap pip install pip install typesafe-parmap Run functions in parallel safely with typesafe parmap! GitHub: https://github.com/thejaminato

James Chua 3 Nov 06, 2021