【问题标题】:Flask's DispatcherMiddleware not playing nice with Plotly's DashFlask DispatcherMiddleware 不能很好地与 Plotly Dash 配合使用
【发布时间】:2017-08-30 18:23:24
【问题描述】:

我有一个现有的 Flask Web 应用程序,我想将一个现有的 Dash 应用程序 (a Plotly Flask app) 合并到其中。作为Flask's documentation recommends,我正在使用DispatcherMiddleware 来实现这一点:

flask_app = Flask(__name__) # App with both apps attached to it 
app = Flask(__name__) # Existing Flask App 
dash_app = Dash(__name__) # Dash app 

dash_app.config.supress_callback_exceptions = True

# Use DispatcherMiddleware to route separate apps into one
flask_app.wsgi_app = DispatcherMiddleware(app, {'/dash': dash_app.server})

我们最终运行flask_app:

if __name__ == "__main__":
    flask_app.run(debug=True)

但是,当我前往127.0.0.1:<port>/dash/ 时,网页上出现以下错误:

我在控制台日志中看到以下内容:

127.0.0.1 - - [30/Aug/2017 11:11:02] "GET /dash HTTP/1.1" 301 -
127.0.0.1 - - [30/Aug/2017 11:11:02] "GET /dash/ HTTP/1.1" 200 -
127.0.0.1 - - [30/Aug/2017 11:11:03] "GET /_dash-layout HTTP/1.1" 404 -
127.0.0.1 - - [30/Aug/2017 11:11:03] "GET /_dash-dependencies HTTP/1.1" 404 

如何让布局为我的 Dash 应用程序正确加载?

【问题讨论】:

    标签: python plotly plotly-dash


    【解决方案1】:

    这就是我克服这个问题的方法。不漂亮但有效。

    你需要 run.py:

    from werkzeug.wsgi import DispatcherMiddleware
    from werkzeug.serving import run_simple
    from server import server
    from dash_app  import app as app1
    from flask_app import app as app2
    
    app = DispatcherMiddleware(server, 
                               {'/myflaskapp': app2})
    if __name__ == '__main__':
        run_simple('localhost', 5000, app, use_reloader=True)
    

    您的 server.py 将如下所示:

    from flask import Flask, render_template
    
    server = Flask(__name__)
    
    @server.route('/')
    def server_root():
        return render_template('index.html')
    

    你的 dash_app.py:

    import dash
    from server import server
    app = dash.Dash(name='mydash', sharing=True, server=server, url_base_pathname='/mydash')
    

    最后是你的 flask_app.py:

    from flask import Flask
    app = Flask(__name__)
    @app.route("/news")
    def news():
        return render_template('news.html')
    

    您的 flask_app 位于 /myflaskapp/news

    您的 dash_app 位于 /mydash

    【讨论】:

    • 感谢您的回答。这是有道理的,但您能否详细说明为什么它有效?只是好奇。
    • 从您的代码中,dash_dependencies 在服务器根目录 ('/') 中“遗留”,而不是移动到应用程序所在的路径“/dash”,然后布局渲染失败。指定 url_base_pathname 后,依赖项将移动到指定路径。希望这是有道理的!
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多