59 votes

Exécution d'une application Dash dans une application Flask

J'ai une application Flask existante, et je veux avoir une route pour une autre application . Plus concrètement, la deuxième application est une Plotly Dash application. Comment puis-je exécuter mon application Dash au sein de mon application Flask existante ?

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

J'ai également essayé d'ajouter une route à l'instance de Dash, puisqu'il s'agit d'une application Flask, mais j'obtiens l'erreur suivante :

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

64voto

davidism Points 5946

Desde el docs :

L'application Flask sous-jacente est disponible à l'adresse app.server .

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

Vous pouvez également passer votre propre instance d'application Flask dans Dash :

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

Maintenant que vous avez l'instance Flask, vous pouvez ajouter les routes et autres fonctionnalités dont vous avez besoin.

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

Pour la question plus générale "comment puis-je servir deux instances Flask l'une à côté de l'autre", en supposant que vous n'utilisiez pas une seule instance comme dans la réponse Dash ci-dessus, vous utiliseriez DispatcherMiddleware pour monter les deux applications.

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

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

37voto

chanioxaris Points 456

Définir url_base_pathname dans votre instance Dash.

app_flask = flask.Flask(__name__)

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

Maintenant, vous pouvez rediriger vers votre application Plotly Dashboard sous les routes Flask que vous voulez.

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

4 votes

Permettez-moi de signaler une seule chose sur laquelle je suis tombé : dans votre main, vous devriez ensuite exécuter l'app_flask. Je sais que cela peut paraître évident, mais cela peut faire gagner quelques minutes aux débutants comme moi.

13voto

JustInTime Points 364

Ok pour ceux qui sont assez paresseux comme moi, voici le code

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 votes

J'ai essayé votre code. Il ressemblait à ce que je cherchais comme cas de test. J'obtiens ce qui suit : /usr/local/lib/python3.7/site-packages/flask/app.py", ligne 1107, in register_blueprint blueprint, self.blueprints[blueprint.name], blueprint.name AssertionError : Une collision de noms s'est produite entre les blueprints <flask.blueprints.objet Blueprint à 0x1133d8fd0> et <flask.blueprints.objet Blueprint à 0x1139184a8>. Les deux partagent le même nom "assets". Les Blueprints qui sont créés à la volée ont besoin de noms uniques.

0 votes

J'ai rencontré le même problème. Je remarque que la méthode a fonctionné pour une redirection, mais pas pour deux redirections vers des applications Dask. Je n'ai aucune idée de la façon de changer le nom des actifs.

0 votes

Il semble que vous devez faire attention à la version de flask que vous utilisez, j'ai eu deux expériences différentes en utilisant flask 1.0 et flask 0.12.

3voto

Oleg Komarov Points 6000

Si vous voulez intégrer une application Dash dans une application Flask qui utilise :

  • l'usine d'applications et
  • nécessite une authentification (Flask-Login)

consultez la solution complète dans le dépôt dash_on_flask .

Des explications détaillées sont ici .

-3voto

Mandeep Singh Points 37

Pour résoudre ce problème, voici ce que j'ai fait et j'ai réussi. Ceci devrait être documenté dans la documentation officielle de 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")'

Ensuite, vous pouvez contrôler vers quel tableau de bord il se dirige depuis l'intérieur du flacon.

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)

vous pouvez créer différentes fonctions avec différents graphiques entre le code Flask et continuer à appeler le code dans dash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X