Запуск приложения Dash в приложении Flask

У меня есть существующее приложение Flask, и я хочу иметь маршрут к другому приложению. Более конкретно, второе приложение - это Plotly Dash. Как запустить приложение Dash в существующем приложении Flask?

@app.route('/plotly_dashboard') 
def render_dashboard():
    # go to dash app

Я также попытался добавить маршрут к экземпляру Dash, так как это приложение Flask, но я получаю сообщение об ошибке:

AttributeError: 'Dash' object has no attribute 'route'

Ответ 1

Из docs:

Подходящее приложение Flask доступно в app.server.

import dash
app = dash.Dash(__name__)
server = app.server

Вы также можете передать свой собственный экземпляр приложения Flask в Dash:

import flask
server = flask.Flask(__name__)
app = dash.Dash(__name__, server=server)

Теперь, когда у вас есть экземпляр Flask, вы можете добавить любые маршруты и другие функциональные возможности, которые вам нужны.

@server.route('/hello')
def hello():
    return 'Hello, World!'

К более общему вопросу "как я могу обслуживать два экземпляра Flask рядом друг с другом", предполагая, что вы не используете один экземпляр, как в приведенном выше ответе Dash, вы должны использовать DispatcherMiddleware для установки обоих приложений.

dash_app = Dash(__name__)
flask_app = Flask(__name__)

application = DispatcherMiddleware(flask_app, {'/dash': dash_app.server})

Ответ 2

Установите url_base_pathname в свой экземпляр Dash.

app_flask = flask.Flask(__name__)

app_dash = dash.Dash(__name__, server=app_flask, url_base_pathname='/pathname')

Теперь вы можете перенаправить свое приложение Plotly Dashboard по любым маршрутам Flask, которые вы хотите.

@app_flask.route('/plotly_dashboard') 
def render_dashboard():
    return flask.redirect('/pathname')

Ответ 3

Хорошо для тех, кто достаточно ленив, как я, вот код

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 app1 for dashboards')])
dash_app2.layout = html.Div([html.H1('Hi there, I am app2 for reports')])
@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)

Ответ 4

Если вы хотите встроить приложение Dash в приложение Flask, которое использует:

  • фабрика приложений и
  • требует аутентификации (Flask-Login)

проверить полное решение в репо dash_on_flask.

Обширные объяснения здесь.

Ответ 5

Чтобы решить эту проблему, вот что я сделал и был успешным. Это должно быть задокументировано в официальной документации DASH

####################################
import dash_core_components as dcc
import dash_html_components as html
from dash import Dash
from dash.dependencies import Input, State, Output

from flask          import Flask, flash, redirect, render_template,    request, session, abort, url_for, json, make_response

url_router=''

@application.route("/view_tables", methods=['GET','POST'])
def view_tabales:
  # Logic for displaying dashboard using Dash
  server.layout = html.Div(
                    children=[
                    #division for graph 1
                    html.Div([html.H1(children='Capital Charge'),],className='text-center'),

                    html.Div([html.Div([html.H3(children='''Correlation for assets'''),],className='text-primary'),
                                # define the graph
                                dcc.Graph(
                                    id='Delta-graph',
                                    figure={
                                        'data': [
                                            {'x': df_delta['Correlation_Level'], 
                                             'y': df_delta['Capital_Charge'], 
                                             'type': 'bar', 
                                             'name': 'Delta',
                                             #'domain': {'x': [0, .48],'y': [0, .49]},
                                             }
                                        ],
                                        # sizes the graph
                                        'layout': {
                                            'title': 'Delta','margin': {'l': 10, 'r': 0, 't': 30, 'b': 10},
                                            "height":300,
                                        }
                                    }
                                )],className='col-md-4'),
  url_router = 'Dash(__name__,server=application, url_base_pathname="/dash")'

Затем вы можете контролировать, к какой приборной панели она движется из колбы.

if url_router !='':
      server = url_router

server.layout = html.Div(children = [html.H1(children = ' MEP dashboard - error 404')])


# run the app.
if __name__ == "__main__":
   # Setting debug to True enables debug output. This line should be
   # removed before deploying a production app.
   server.secret_key = os.urandom(12)
   server.run_server(debug=True,port=5000)

Вы можете создавать разные функции с разными графиками между кодом Flask и продолжать вызывать код в тире