web-dev-qa-db-fra.com

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

J'ai une application Flask existante et je souhaite avoir un itinéraire vers une autre application. Plus concrètement, la deuxième application est un Plotly Dash app. Comment puis-je exécuter mon application Dash dans mon application Flask existante?

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

J'ai également essayé d'ajouter un itinéraire à l'instance Dash, car il s'agit d'une application Flask, mais j'obtiens l'erreur suivante:

AttributeError: 'Dash' object has no attribute 'route'
28
zthomas.nc

De la 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 itinéraires et autres fonctionnalités dont vous avez besoin.

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

A la question plus générale "comment puis-je servir deux instances Flask l'une à côté de l'autre", si vous n'utilisez pas une 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})
33
davidism

Définissez url_base_pathname dans votre instance Dash. 

app_flask = flask.Flask(__name__)

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

Vous pouvez maintenant rediriger vers votre application Plotly Dashboard sous les itinéraires Flask de votre choix.

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

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)
3
JustInTime

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

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

découvrez la solution complète dans le référentiel dash_on_flask

Les explications détaillées sont ici

0
Oleg