webentwicklung-frage-antwort-db.com.de

Ausführen einer Dash-App in einer Flask-App

Ich habe eine vorhandene Flask-App und möchte eine Route zu einer anderen App haben. Konkreter ist die zweite App eine Plotly Dash App. Wie kann ich meine Dash-App in meiner vorhandenen Flask-App ausführen?

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

Ich habe auch versucht, der Dash-Instanz eine Route hinzuzufügen, da es sich um eine Flask-App handelt. Ich bekomme jedoch den Fehler:

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

Aus den docs :

Die zugrunde liegende Flask-App ist unter app.server verfügbar.

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

Sie können auch Ihre eigene Flask-App-Instanz an Dash übergeben:

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

Nun, da Sie die Flask-Instanz haben, können Sie beliebige Routen und andere Funktionen hinzufügen.

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

Zur allgemeineren Frage "Wie kann ich zwei Flask-Instanzen nebeneinander bedienen", vorausgesetzt, Sie verwenden am Ende keine Instanz wie in der obigen Dash-Antwort, würden Sie DispatcherMiddleware verwenden, um beide Anwendungen bereitzustellen.

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

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

Legen Sie url_base_pathname in Ihrer Dash-Instanz fest. 

app_flask = flask.Flask(__name__)

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

Nun können Sie unter beliebigen Flask-Routen zu Ihrer Plotly Dashboard-App umleiten.

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

Ok für diejenigen, die wie ich faul genug sind, hier ist der 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

Wenn Sie eine Dash-App in eine Flask-App einbetten möchten, die Folgendes verwendet:

  • die Anwendungsfabrik und
  • erfordert Authentifizierung (Flask-Login)

Überprüfen Sie die vollständige Lösung im Repo dash_on_flask

Ausführliche Erklärungen sind hier

0
Oleg