Объединение одного или нескольких приложений Da sh с существующими приложениями WSGI
Следующий пример иллюстрирует этот подход путем объединения двух приложений Da sh с приложением Flask.
flask_app.py
from flask import Flask
flask_app = Flask(__name__)
@flask_app.route('/')
def index():
return 'Hello Flask app'
app1.py
import dash
import dash_html_components as html
app = dash.Dash(
__name__,
requests_pathname_prefix='/app1/'
)
app.layout = html.Div("Dash app 1")
app2.py
import dash
import dash_html_components as html
app = dash.Dash(
__name__,
requests_pathname_prefix='/app2/'
)
app.layout = html.Div("Dash app 2")
wsgi.py
from werkzeug.wsgi import DispatcherMiddleware
from app1 import app as app1
from app2 import app as app2
application = DispatcherMiddleware(flask_app, {
'/app1': app1.server,
'/app2': app2.server,
})
В этом примере приложение Flask было смонтировано в /, а два приложения Da sh имеют был установлен в / app1 и / app2. При таком подходе мы не передаем сервер Flask приложениям Da sh, а позволяем им создавать свои собственные, к которым DispatcherMiddleware направляет запросы на основе префикса входящих запросов. Внутри каждого приложения Da sh необходимо указать request_pathname_prefix в качестве точки монтирования приложения, чтобы соответствовать префиксу маршрута, установленному DispatcherMiddleware.
Обратите внимание, что объект приложения в wsgi.py имеет тип werkzeug. wsgi.DispatcherMiddleware, у которого нет метода запуска. Это можно запустить как приложение WSGI, например:
$ gunicorn wsgi:application
В качестве альтернативы, вы можете использовать сервер разработки Werkzeug (который не подходит для работы) для запуска приложения:
run.py
from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from app1 import app as app1
from app2 import app as app2
application = DispatcherMiddleware(flask_app, {
'/app1': app1.server,
'/app2': app2.server,
})
if __name__ == '__main__':
run_simple('localhost', 8050, application)
Если вам нужен доступ к инструментам разработки Da sh при использовании этого подхода (будь то работа с сервером WSGI или использование сервера разработки Werkzeug), вы должны вызвать их вручную для каждого приложения Da sh. Для этого можно добавить следующие строки перед инициализацией DispatcherMiddleware:
app1.enable_dev_tools(debug=True)
app2.enable_dev_tools(debug=True)
Примечание: режим отладки не должен быть включен в рабочей среде. При использовании режима отладки с Gunicorn флаг командной строки --reload необходим для горячей перезагрузки.
В этом примере существующее приложение, объединенное с двумя приложениями Da sh, является приложением Flask однако этот подход позволяет комбинировать любое веб-приложение, реализующее спецификацию WSGI. Список веб-фреймворков WSGI можно найти в документации WSGI с одним или несколькими приложениями Da sh.
Справочник - https://dash.plot.ly/integrating-dash
Отредактировано :
Несколько приложений Da sh без WSGI
from dash import Dash
from werkzeug.wsgi import DispatcherMiddleware
import flask
from werkzeug.serving import run_simple
import dash_html_components as html
server = flask.Flask(__name__)
dash_app1 = Dash(__name__, server = server, url_base_pathname='/dashboard/')
dash_app2 = Dash(__name__, server = server, url_base_pathname='/reports/')
dash_app1.layout = html.Div([html.H1('Hi there, I am Dash1')])
dash_app2.layout = html.Div([html.H1('Hi there, I am Dash2')])
@server.route('/')
@server.route('/hello')
def hello():
return 'hello world!'
@server.route('/dashboard/')
def render_dashboard():
return flask.redirect('/dash1')
@server.route('/reports/')
def render_reports():
return flask.redirect('/dash2')
app = DispatcherMiddleware(server, {
'/dash1': dash_app1.server,
'/dash2': dash_app2.server
})
run_simple('0.0.0.0', 8080, app, use_reloader=True, use_debugger=True)