##############################
Add a web UI with Dash (basic)
##############################
**Audience:** Users who want to add a web UI with Dash by Plotly.
**Prereqs:** Basic python knowledge.
----
*************
What is Dash?
*************
`Dash `_ is the original low-code framework for rapidly building data apps in Python, R, Julia, and F# (experimental).
Install Dash with:
.. code:: bash
pip install dash
----
************************
Create the dash demo app
************************
To explain how to use Dash with Lightning, let's build a simple app with Dash.
..
To explain how to use Dash with Lightning, let's replicate the |dash_link|.
.. |dash_link| raw:: html
example running here
In the next few sections we'll build an app step-by-step.
First **create a file named app.py** with the app content:
.. code:: bash
import lightning as L
import dash
import plotly.express as px
class LitDash(L.LightningWork):
def run(self):
dash_app = dash.Dash(__name__)
X = [1, 2, 3, 4, 5, 6]
Y = [2, 4, 8, 16, 32, 64]
fig = px.line(x=X, y=Y)
dash_app.layout = dash.html.Div(children=[
dash.html.H1(children='⚡ Hello Dash + Lightning⚡'),
dash.html.Div(children='The Dash framework running inside a ⚡ Lightning App'),
dash.dcc.Graph(id='example-graph', figure=fig)
])
dash_app.run_server(host=self.host, port=self.port)
class LitApp(L.LightningFlow):
def __init__(self):
super().__init__()
self.lit_dash = LitDash(parallel=True)
def run(self):
self.lit_dash.run()
def configure_layout(self):
tab1 = {"name": "home", "content": self.lit_dash}
return tab1
app = L.LightningApp(LitApp())
add 'dash' to a requirements.txt file:
.. code:: bash
echo "dash" >> requirements.txt
this is a best practice to make apps reproducible.
----
***********
Run the app
***********
Run the app locally to see it!
.. code:: python
lightning run app app.py
Now run it on the cloud as well:
.. code:: python
lightning run app app.py --cloud
----
************************
Step-by-step walkthrough
************************
In this section, we explain each part of this code in detail.
----
0. Define a Dash app
^^^^^^^^^^^^^^^^^^^^
First, find the dash app you want to integrate. In this example, that app looks like:
.. code:: python
import dash
import plotly.express as px
dash_app = dash.Dash(__name__)
X = [1, 2, 3, 4, 5, 6]
Y = [2, 4, 8, 16, 32, 64]
fig = px.line(x=X, y=Y)
dash_app.layout = dash.html.Div(children=[
dash.html.H1(children='⚡ Hello Dash + Lightning⚡'),
dash.html.Div(children='The Dash framework running inside a ⚡ Lightning App'),
dash.dcc.Graph(id='example-graph', figure=fig)
])
dash_app.run_server(host='0.0.0.0', port=80)
This dash app plots a simple line curve along with some HTMlapp.
`Visit the Dash documentation for the full API `_.
----
1. Add Dash to a component
^^^^^^^^^^^^^^^^^^^^^^^^^^
Add the dash app to the run method of a ``LightningWork`` component and run the server on that component's **host** and **port**:
.. code:: python
:emphasize-lines: 6, 18
import lightning as L
import dash
import plotly.express as px
class LitDash(L.LightningWork):
def run(self):
dash_app = dash.Dash(__name__)
X = [1, 2, 3, 4, 5, 6]
Y = [2, 4, 8, 16, 32, 64]
fig = px.line(x=X, y=Y)
dash_app.layout = dash.html.Div(children=[
dash.html.H1(children='⚡ Hello Dash + Lightning⚡'),
dash.html.Div(children='The Dash framework running inside a ⚡ Lightning App'),
dash.dcc.Graph(id='example-graph', figure=fig)
])
dash_app.run_server(host=self.host, port=self.port)
class LitApp(L.LightningFlow):
def __init__(self):
super().__init__()
self.lit_dash = LitDash(parallel=True)
def run(self):
self.lit_dash.run()
def configure_layout(self):
tab1 = {"name": "home", "content": self.lit_dash}
return tab1
app = L.LightningApp(LitApp())
----
2. Route the UI in the root component
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The final step, is to tell the Root component in which tab to render this component's UI.
In this case, we render the ``LitDash`` UI in the ``home`` tab of the application.
.. code:: python
:emphasize-lines: 23, 29
import lightning as L
import dash
import plotly.express as px
class LitDash(L.LightningWork):
def run(self):
dash_app = dash.Dash(__name__)
X = [1, 2, 3, 4, 5, 6]
Y = [2, 4, 8, 16, 32, 64]
fig = px.line(x=X, y=Y)
dash_app.layout = dash.html.Div(children=[
dash.html.H1(children='⚡ Hello Dash + Lightning⚡'),
dash.html.Div(children='The Dash framework running inside a ⚡ Lightning App'),
dash.dcc.Graph(id='example-graph', figure=fig)
])
dash_app.run_server(host=self.host, port=self.port)
class LitApp(L.LightningFlow):
def __init__(self):
super().__init__()
self.lit_dash = LitDash(parallel=True)
def run(self):
self.lit_dash.run()
def configure_layout(self):
tab1 = {"name": "home", "content": self.lit_dash}
return tab1
app = L.LightningApp(LitApp())
We use the ``parallel=True`` argument of ``LightningWork`` to run the server in the background
while the rest of the Lightning App runs everything else.