web-dev-qa-db-ja.com

Flaskアプリ内でDashアプリを実行する

既存のFlaskアプリがあり、別のアプリへのルートが必要です。より具体的には、2番目のアプリは Plotly Dash アプリです。既存のFlaskアプリ内でDashアプリを実行するにはどうすればよいですか?

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

Flaskアプリであるため、Dashインスタンスにルートを追加しようとしましたが、エラーが発生します。

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

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!'

上記のダッシュの回答のように1つのインスタンスを使用しないことにした場合、「2つのFlaskインスタンスを互いに隣り合わせて提供する方法」というより一般的な質問には、 DispatcherMiddlewareを使用します 両方のアプリケーションをマウントします。

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

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

Dashインスタンスにurl_base_pathnameを設定します。

app_flask = flask.Flask(__name__)

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

これで、任意のFlaskルートの下でPlotlyダッシュボードアプリにリダイレクトできます。

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

私のように怠areな人のために、ここにコードがあります

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
JustInTime

Dashアプリを以下を使用するFlaskアプリに埋め込む場合:

  • アプリケーションファクトリー
  • 認証が必要です(Flask-Login)

リポジトリで完全なソリューションを確認してください dash_on_flask

詳細な説明は here です。

2
Oleg