Integrate Dash Plotly to your existing Django and Docker project.
3 min readJan 28, 2021
Developers are always looking around to integrate solutions in existing projects rather than creating a separate app or project for analytics and visualizations. Dash and Plotly provides a huge support to integrate graphs and create an interactive dashboard for your existing project.
Prerequisites
- Django
- Docker
- Plotly
- Redis
- Dash
#requirements.txtDjango==3.0.5
pandas
requests
django-plotly-dash==1.5.0
django-redis==4.10.0
dpd-components==0.1.0
redis==3.3.11
plotly==4.14.3
channels==2.3.0
channels-redis==2.4.0
daphne==2.3.0
dash==1.19.0
aioredis==1.3.0
asgiref==3.2.2
async-timeout==3.0.1
attrs==19.3.0
autobahn==19.10.1
Automat==0.7.0
cffi==1.13.0
dash-bootstrap-components==0.11.1
Setting up Docker and Docker-compose
- Dockerfile
#DockerfileFROM python:3.6LABEL maintainer="Developer"ENV PYTHONBUFFER 1COPY ./requirements.txt /requirements.txtRUN pip install -r /requirements.txtRUN mkdir /appWORKDIR /appCOPY ./app /app
- Docker-Compose file
Here we are using local host so, network_mode points to host value.
version: "3.3"#if you want to create a new user add MYSQL_USER and MYSQL_PASSWORD for addding new user on to mysql containerservices: app: network_mode: host #comment this if you are using mysql docker image. This specifies that container with run with local host mode without ip build: context: . ports: - '5000:5000' env_file: - .env # include .env file in your root directory to add up database variables volumes: - ./app:/app command: sh -c "python manage.py runserver 0.0.0.0:5000" depends_on: - redis redis: restart: always image: redis:latest expose: - "6379"
settings.py configuration
INSTALLED_APPS = [
... 'apps.plotlydash',
'django_plotly_dash.apps.DjangoPlotlyDashConfig',
'channels',
'channels_redis', ...
]X_FRAME_OPTIONS = 'SAMEORIGIN'WSGI_APPLICATION = 'core.wsgi.application'ASGI_APPLICATION = 'core.routing.application'CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { 'hosts': [('127.0.0.1', 6379),], } } }STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'django_plotly_dash.finders.DashAssetFinder', 'django_plotly_dash.finders.DashComponentFinder', 'django_plotly_dash.finders.DashAppDirectoryFinder',]PLOTLY_COMPONENTS = [ 'dash_core_components', 'dash_html_components', 'dash_renderer', 'dpd_components']
Creating app file
#simpleexample.pyimport dash_core_components as dccimport dash_html_components as htmlfrom dash.dependencies import Input, Outputimport plotly.graph_objs as gofrom django_plotly_dash import DjangoDashexternal_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']app = DjangoDash('SimpleExample', external_stylesheets=external_stylesheets)app.layout = html.Div([ dcc.Graph(id='slider-graph', animate=True, style={"backgroundColor": "#1a2d46", 'color': '#ffffff'}), dcc.Slider( id='slider-updatemode', marks={i: '{}'.format(i) for i in range(20)}, max=20, value=2, step=1, updatemode='drag', ),])@app.callback( Output('slider-graph', 'figure'), [Input('slider-updatemode', 'value')])def display_value(value): x = [] for i in range(value): x.append(i) y = [] for i in range(value): y.append(i*i) graph = go.Scatter( x=x, y=y, name='Manipulate Graph' ) layout = go.Layout( paper_bgcolor='#27293d', plot_bgcolor='rgba(0,0,0,0)', xaxis=dict(range=[min(x), max(x)]), yaxis=dict(range=[min(y), max(y)]), font=dict(color='white'), ) return {'data': [graph], 'layout': layout}
Create routing.py file
#routing.py
from django_plotly_dash.routing import application
Create urls.py or add the below code in urls.py file of your app.
#urls.py
from .path import simpleexample or import simpleexample #set it according to your relative path.
Create index.html to view your app
#index.html<div class="{% plotly_class name='SimpleExample' %} col-md-12 card shadow mb-4">{% plotly_app name='SimpleExample' ratio=0.45 %}</div>
Run command
$docker-compose up -d --build #This will run 2 containers and install dependencies$docker exec -it <container-id> /bin/bash #this will let you execute commands in container$python manage.py migrate #this command will add all the tables into database$python manage.py collectstatic --no-input #this will add all the static files into static folder