복붙노트

[PYTHON] Flask 앱에서 대시 앱 실행하기

PYTHON

Flask 앱에서 대시 앱 실행하기

기존의 Flask 앱이 있는데 다른 앱에 대한 경로를 갖고 싶습니다. 더 구체적으로 두 번째 앱은 Plotly Dash 앱입니다. 기존 Flask 앱에서 대시 앱을 실행하려면 어떻게해야합니까?

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

Flask 앱이기 때문에 Dash 인스턴스에 대한 경로를 추가하려고 시도했지만 오류가 발생합니다.

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

해결법

  1. ==============================

    1.문서에서 :

    문서에서 :

    Flask 인스턴스가 생겼으므로 필요한 경로와 기타 기능을 추가 할 수 있습니다.

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

    좀 더 일반적인 질문 인 "어떻게 서로 옆에 두 개의 Flask 인스턴스를 제공 할 수 있습니까?"위의 대시 답변 에서처럼 하나의 인스턴스를 사용하지 않는다고 가정하면 DispatcherMiddleware를 사용하여 두 응용 프로그램을 모두 마운트합니다.

    dash_app = Dash(__name__)
    flask_app = Flask(__name__)
    
    application = DispatcherMiddleware(flask_app, {'/dash': dash_app.server})
    
  2. ==============================

    2.Dash 인스턴스에 url_base_pathname을 설정하십시오.

    Dash 인스턴스에 url_base_pathname을 설정하십시오.

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

    이제 원하는 플라스크 (Flask) 경로 아래에서 플롯 대시 보드 앱으로 리디렉션 할 수 있습니다.

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

    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. ==============================

    4.이 문제를 해결하기 위해 내가 한 일과 성공한 일이 여기에 있습니다. 이 내용은 공식 DASH 문서에 문서화되어야합니다.

    이 문제를 해결하기 위해 내가 한 일과 성공한 일이 여기에 있습니다. 이 내용은 공식 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 코드간에 다른 그래프로 다른 함수를 만들 수 있으며 대시로 코드를 계속 호출 할 수 있습니다.

  5. from https://stackoverflow.com/questions/45845872/running-a-dash-app-within-a-flask-app by cc-by-sa and MIT license