По умолчанию Dash запускает свой веб-сервер на localhost - то есть на вашем компьютере локально. Для того, что бы ваше приложение могли использовать другие люди, Dash приложение нужно установить на хостинг, а чтобы оно заработало, нужно обеспечить взаимодействие Dash приложения с веб-сервером через WSGI.
Dash состоит из клиентской части, написанной на react.js и работающей в браузере и серверной части, которая написана на Python и работает на веб-сервере. Это дает нам возможность подгрузки данных динамически, что позволяет многостраничному приложению работать в одном окне без перезагрузки всей страницы. Для того, что бы установить Dash на наш хостинг необходимо сделать следующие шаги:
import dash
app = dash.Dash(__name__, suppress_callback_exceptions=True)
server = app.server
index.py используется для запуска приложений, поэтому нужно прописать после from app import app
строку server = app.server
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from app import app
from apps import app1, app2
server = app.server # Если не добавить эту строку, то не заработает.
app.layout = html.Div([
dcc.Location(id='url', refresh=False),
html.Div(id='page-content')
])
@app.callback(Output('page-content', 'children'),
[Input('url', 'pathname')])
def display_page(pathname):
if pathname in ['/', '/apps/app1']:
return app1.layout
elif pathname == '/apps/app2':
return app2.layout
else:
return '404'
if __name__ == '__main__':
app.run_server(debug=True)
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from app import app
layout = html.Div([
html.H3('App 1'),
dcc.Dropdown(
id='app-1-dropdown',
options=[
{'label': 'App 1 - {}'.format(i), 'value': i} for i in [
'NYC', 'MTL', 'LA'
]
]
),
html.Div(id='app-1-display-value'),
dcc.Link('Go to App 2', href='/apps/app2')
])
@app.callback(
Output('app-1-display-value', 'children'),
[Input('app-1-dropdown', 'value')])
def display_value(value):
return 'You have selected "{}"'.format(value)
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from app import app
layout = html.Div([
html.H3('App 2'),
dcc.Dropdown(
id='app-2-dropdown',
options=[
{'label': 'App 2 - {}'.format(i), 'value': i} for i in [
'MSK', 'SPB', 'EKB'
]
]
),
html.Div(id='app-2-display-value'),
dcc.Link('Go to App 1', href='/apps/app1')
])
@app.callback(
Output('app-2-display-value', 'children'),
[Input('app-2-dropdown', 'value')])
def display_value(value):
return 'You have selected "{}"'.format(value)
В итоге у нас должна получится файловая структура:
- app.py
- index.py
- apps
|-- __init__.py
|-- app1.py
|-- app2.py
APP_PATH=/home/cXXXXX/yoursite.ru/app/index.py
APPLICATION=server
где server - имя той самой переменной из index.py, которое мы прописали ранее.