【问题标题】:Running a Dash app within a Flask app在 Flask 应用程序中运行 Dash 应用程序
【发布时间】:2018-02-01 09:45:55
【问题描述】:

我有一个现有的 Flask 应用程序,并且我想有一条到 另一个应用程序的路由。更具体地说,第二个应用是Plotly Dash 应用。如何在我现有的 Flask 应用中运行我的 Dash 应用?

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

我还尝试添加到 Dash 实例的路由,因为它是一个 Flask 应用程序,但我得到了错误:

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

【问题讨论】:

    标签: python flask plotly-dash


    【解决方案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】:

      在您的 Dash 实例中设置 url_base_pathname。

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

      现在您可以在您想要的任何 Flask 路由下重定向到您的 Plotly Dashboard 应用程序。

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

      【讨论】:

      • 让我指出我偶然发现的一件事:然后你应该在你的 main 中运行 app_flask。我知道这可能很明显,但它可能会为像我这样的初学者节省一些时间
      【解决方案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)
      

      【讨论】:

      • 我试过你的代码。它看起来就像我正在寻找的测试用例。我得到以下信息:/usr/local/lib/python3.7/site-packages/flask/app.py",第 1107 行,在 register_blueprint 蓝图中,self.blueprints[blueprint.name],blueprint.name AssertionError: A name蓝图 和 之间发生冲突。两者共享相同的名称“assets”。动态创建的蓝图需要唯一的名称。
      • 遇到了同样的问题。我注意到该方法适用于一次重定向,但不适用于两次重定向到 dask 应用程序。我不知道如何更改资产名称。
      • 看来你用的flask版本要注意了,我用flask 1.0和flask 0.12有两种不同的体验。
      • 我使用了来自werkzeug.middleware.dispatcher 的调度中间件,因为werkzeug.wsgi 抛出了一个错误。这是documentation link 和代码:from werkzeug.middleware.dispatcher import DispatcherMiddleware
      • 是否可以将烧瓶路由中发布的数据传递给触发组件(例如绘图)更新的破折号回调?如果你想建议我开始一个我已经做过的新问题,但它被标记为重复......stackoverflow.com/questions/69134233/…
      【解决方案4】:
      #here are full codee
      from dash import Dash
      import flask
      from dash import html
      
      server = flask.Flask(__name__)
      app = Dash(__name__, server=server, url_base_pathname='/ATM_Data_Anlaysis/')
      app.layout = html.Div([html.H1('This Is head',style={'textAlign':'center'})])
      
      @server.route("/dash")
      def MyDashApp():
          return app.index()
      
      if __name__ == '__main__':
          app.run_server(debug=True)
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码 sn-p 可能是解决方案,但including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案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 代码之间使用不同的图表创建不同的函数,并在 dash 中继续调用代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-25
        • 2020-04-22
        • 1970-01-01
        • 2020-09-04
        • 2018-06-30
        • 2020-07-13
        • 1970-01-01
        相关资源
        最近更新 更多