Интеграция приложений Da sh в Flask: минимальный пример - PullRequest
1 голос
/ 07 января 2020

Я хочу создать Flask веб-приложение. Я хочу интегрировать несколько Da sh -Apps в этот сайт и отображать ссылки на каждое Da sh -app на главной странице. Вот минимальный пример: домашняя страница должна выглядеть следующим образом:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def main():
   return "Hello World"

if __name__ == "__main__":
   app.run(debug = True)

Допустим, у нас есть приложение Da sh, которое выглядит следующим образом:

import dash
import dash_html_components as html 
app = dash.Dash(__name__)

app.layout = html.Div("Hello world 1")

if __name__=="__main__":
    app.run_server(debug=True)

Мой вопрос сейчас: Как я могу интегрировать приложение Da sh в приложение Flask следующим образом: 1) в приложении Flask должна быть ссылка, ведущая к приложению Da sh 2) местоположение приложение Da sh должно быть, например, /dash (домашняя страница в этом случае находится по адресу /) 3) если есть второе и третье приложение Da sh, должно быть легко добавить другое ссылка и местоположение (например, /dash2, /dash3, ...)

Существует множество сообщений, посвященных этой проблеме, однако я не нашел минимального примера.

1 Ответ

2 голосов
/ 07 января 2020

Объединение одного или нескольких приложений 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)
...