如何使用mod_wsgi在本地服务器部署Dash应用实现每次访问新建实例
使用mod_wsgi部署支持单访问独立实例的Dash应用方案
该方案可实现任意用户、同一浏览器不同标签页访问服务时,都获取到独立的全新Dash应用对象,会话之间数据完全隔离。
1. 前置准备
- 服务器已安装Apache、对应Python版本的
mod_wsgi模块 - 已安装Dash相关依赖:
dash、flask
2. 编写WSGI入口文件
核心逻辑是将Dash实例创建封装为工厂函数,再通过自定义WSGI调度器实现每次请求都生成新的实例,示例代码如下:
# 项目根目录下新建wsgi.py作为入口文件 import dash from dash import html, callback, Input, Output def create_dash_app(): # 每次调用生成完全独立的Dash实例 app = dash.Dash(__name__) app.layout = html.Div([ html.Button("点击计数测试", id="count-btn"), html.Div(id="count-show", children="尚未点击") ]) # 回调仅属于当前生成的Dash实例,不会跨会话冲突 @callback( Output("count-show", "children"), Input("count-btn", "n_clicks"), prevent_initial_call=True ) def update_count(n): return f"当前会话点击次数:{n}" # 返回Dash绑定的Flask WSGI实例 return app.server # 自定义WSGI调度器,每次请求触发新实例创建 class WSGISessionDispatcher: def __call__(self, environ, start_response): current_app = create_dash_app() return current_app(environ, start_response) # mod_wsgi默认调用的全局application对象 application = WSGISessionDispatcher()
3. 配置Apache虚拟主机
编辑Apache的虚拟主机配置文件,示例配置如下:
<VirtualHost *:80> ServerName 你的服务域名或IP DocumentRoot /你的Dash项目根目录绝对路径 # 配置mod_wsgi守护进程,可根据服务器配置调整进程数和线程数 WSGIDaemonProcess dash_app user=www-data group=www-data processes=2 threads=4 WSGIScriptAlias / /你的Dash项目根目录绝对路径/wsgi.py WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On <Directory /你的Dash项目根目录绝对路径> Require all granted WSGIProcessGroup dash_app WSGIApplicationGroup %{GLOBAL} Options FollowSymLinks AllowOverride None </Directory> </VirtualHost>
配置完成后重启Apache服务生效。
4. 效果验证
- 同时打开两个浏览器标签页访问服务地址
- 在第一个标签页多次点击计数按钮,记录显示的数值
- 切换到第二个标签页点击按钮,可看到计数从1开始,和第一个标签页数值完全独立,即说明两个会话使用的是不同的Dash应用对象。
注意事项
- 性能提示:每次请求都新建实例会提升服务器资源消耗,若访问量较大,可调整为基于Cookie会话的实例复用逻辑,降低重复创建开销。
- 禁止在Dash实例外使用全局变量存储用户数据,全局变量会跨所有实例共享,会导致用户数据泄漏。
- 生产环境部署建议开启HTTPS,保障数据传输安全。
内容的提问来源于stack exchange,提问作者Dimitris A.
相关产品推荐
相关产品推荐

