Запуск приложения 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 и продолжать вызывать код в тире