将Dash应用程序集成到Flask:最小示例 - python

我想创建一个Flask Web应用程序。我想将多个Dash-App集成到此站点中,并在首页上显示每个Dash-app的链接。
这是一个最小的示例:
主页应如下所示:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def main():
   return "Hello World"

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

可以说我们有一个Dash应用,看起来像这样:

import dash
import dash_html_components as html 
app = dash.Dash(__name__)

app.layout = html.Div("Hello world 1")

if __name__=="__main__":
    app.run_server(debug=True)

我的问题现在是:如何通过以下方式将Dash应用程序集成到Flask应用程序中:
1)Flask应用程序中应有一个指向Dash应用程序的链接2)Dash应用程序的位置应为例如/dash(在这种情况下,主页位于/)3)如果存在是第二个和第三个Dash应用程序,应该容易添加其他链接和位置(例如/dash2/dash3,...)

有很多有关此问题的文章-但是,我没有发现任何最小的例子。

参考方案

将一个或多个Dash应用程序与现有WSGI应用程序结合

以下示例通过将两个Dash应用程序与Flask应用程序结合使用来说明这种方法。

flask_app.py

from flask import Flask

flask_app = Flask(__name__)

@flask_app.route('/')
def index():
    return 'Hello Flask app'

app1.py

import dash
import dash_html_components as html

app = dash.Dash(
    __name__,
    requests_pathname_prefix='/app1/'
)

app.layout = html.Div("Dash app 1")  

app2.py

import dash
import dash_html_components as html

app = dash.Dash(
    __name__,
    requests_pathname_prefix='/app2/'
)

app.layout = html.Div("Dash app 2") 

wsgi.py

from werkzeug.wsgi import DispatcherMiddleware

from app1 import app as app1
from app2 import app as app2

application = DispatcherMiddleware(flask_app, {
    '/app1': app1.server,
    '/app2': app2.server,
})  

在此示例中,Flask应用程序已安装在/上,而两个Dash应用程序已安装在/ app1和/ app2上。在这种方法中,我们不会将Flask服务器传递给Dash应用程序,而是让它们创建自己的服务器,DispatcherMiddleware会根据传入请求的前缀将请求路由到这些服务器。在每个Dash应用程序中,必须将request_pathname_prefix指定为该应用程序的安装点,以匹配DispatcherMiddleware设置的路由前缀。

请注意,wsgi.py中的应用程序对象的类型为werkzeug.wsgi.DispatcherMiddleware,它没有运行方法。可以像这样的WSGI应用程序运行:

$ gunicorn wsgi:application 

或者,您可以使用Werkzeug开发服务器(不适合生产)运行该应用程序:

运行

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple

from app1 import app as app1
from app2 import app as app2

application = DispatcherMiddleware(flask_app, {
    '/app1': app1.server,
    '/app2': app2.server,
})

if __name__ == '__main__':
    run_simple('localhost', 8050, application) 

如果在使用这种方法时需要访问Dash开发工具(无论是与WSGI服务器一起运行还是使用Werkzeug开发服务器),则必须为每个Dash应用程序手动调用它们。可以在初始化DispatcherMiddleware之前添加以下行以执行此操作:

app1.enable_dev_tools(debug=True)
app2.enable_dev_tools(debug=True)  

注意:调试模式不应在生产中启用。在Gunicorn上使用调试模式时,必须使用--reload命令行标志才能热加载工作。

在此示例中,与两个Dash应用程序组合的现有应用程序是Flask应用程序,但是这种方法可以实现WSGI规范的任何Web应用程序组合。可以在带有一个或多个Dash应用程序的WSGI文档中找到WSGI Web框架列表。

参考-https://dash.plot.ly/integrating-dash

编辑:

没有WSGI的多个Dash应用

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 Dash1')])
dash_app2.layout = html.Div([html.H1('Hi there, I am Dash2')])
@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)

flask:异常后停止服务器 - python

我想在发生未处理的异常时立即停止我的Flask服务器。这是一个例子:from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): 1/0 # argh, exception return 'Hello World!' i…

WTForms Flask(wtf_flask)验证程序如何为RadioField包括“必需”属性 - python

我基本上在寻找的是WTForms的InputRequired()的RadioField等效验证器。我的意思是,当您尝试提交表单而不在具有InputRequired()验证器的StringField字段中输入任何文本时,用户会在文本字段上方看到提示,提示是"Please fill out this field"。我希望用户必须选择male或…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python Dash Plotly:在悬停时显示默认最近数据或在图形中比较悬停时的数据 - python

我正在使用Dash Plotly构建一个简单的应用程序。默认设置是图形“比较悬停时的数据”。我想将默认设置更改为“在悬停时显示最近的数据”:如何在下面的代码中完成此操作?import dash import dash_core_components as dcc import dash_html_components as html app = dash.D…

Flask Cors无法运作 - python

我正在尝试在Flask应用程序中启用CORS,但无论我把来源如何,似乎总是可以从浏览器访问URL。我不知道我做错了什么。这是我的代码from flask import Flask, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app, resources={r'/*&…