当前位置: 首页 > 工具软件 > Dash Reports > 使用案例 >

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

施敏达
2023-12-01

我想创建一个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'/*&…

 类似资料: