公司动态

如何在django-plotly-dash中持久化与共享Dash应用状态:DashApp与StatelessApp模型详解

📅 2026/8/27 16:30:18
如何在django-plotly-dash中持久化与共享Dash应用状态:DashApp与StatelessApp模型详解
如何在django-plotly-dash中持久化与共享Dash应用状态DashApp与StatelessApp模型详解【免费下载链接】django-plotly-dashExpose plotly dash apps as django tags项目地址: https://gitcode.com/gh_mirrors/dj/django-plotly-dashdjango-plotly-dash 是一个 Django 扩展库核心功能是把 Plotly Dash 应用作为 Django 模板标签嵌入页面并通过DashApp与StatelessApp两个模型实现应用状态的持久化存储与多用户共享。读完本文你将理解这两个模型如何分工以及如何让 Dash 应用在 Django 项目里记住用户操作、跨会话共享数据。为什么 Dash 应用需要状态持久化Dash 应用本身是无状态的用户在前端做的选择随着页面刷新或会话结束就会丢失。而 django-plotly-dash 的目标之一正是让多个 Dash 应用嵌入同一个 Django 页面后能够保存内部状态、在不同用户与不同会话之间共享状态。它的做法很直接用 Django 的 ORM 模型把 Dash 应用的界面状态序列化成 JSON存进数据库。应用每次加载时用数据库里的值覆盖默认布局值——这就是持久化的来源。两个核心模型模板与实例状态管理的核心定义在 django_plotly_dash/models.py 中配合 docs/models_and_state.rst 可完整理解其设计。StatelessApp无状态的应用模板StatelessApp代表一个不带任何具体状态的 Dash 应用只有两个关键字段字段说明app_name注册DjangoDash应用时传入的名称全局唯一slug自动生成的 URL 友好标识用于路由每当代码中通过模板标签引用一个 Dash 应用名称时若数据库里还没有对应的StatelessApp记录它会被自动创建。它的as_dash_app()方法负责返回内存中注册的DjangoDash对象——相当于模板到运行实例的桥梁。DashApp有状态的应用实例DashApp才是状态持久化的载体一个DashApp记录对应一份独立保存的应用状态字段说明stateless_app外键指向所属的StatelessApp保护性引用不可删除instance_name实例名称唯一不填时自动生成应用名序号base_state核心字段以 JSON 文本形式持久化的应用状态save_on_change布尔开关回调执行后若状态有变化是否自动写回数据库creation/update自动记录的创建与更新时间两者关系可以理解为StatelessApp是应用类别DashApp是类别下带状态的数据快照。同一个 Dash 应用可以创建任意多个DashApp实例彼此状态互不干扰。状态持久化是如何工作的整个持久化机制围绕DashApp的几个方法展开见 django_plotly_dash/models.pycurrent_state()把base_state中的 JSON 反序列化为内存状态update_current_state()回调的输入/输出会自动调用它把跟踪的变量值写回状态未被跟踪的变量会被忽略handle_current_state()回调结束后检查状态是否变化若save_on_changeTrue且内容有差异就调用save()持久化到数据库populate_values()遍历 Dash 布局把所有可持久化的初始值一次性灌入base_state。当应用通过app-slug_dash-layout端点请求布局时凡是存在于base_state中的值都会覆盖布局代码中的默认值——这样用户上次留下的选择就会自动恢复。在模板中引用持久化状态name 还是 slug嵌入应用使用的是模板标签定义于 django_plotly_dash/templatetags/plotly_dash.py至少提供name、slug、da三者之一nameAppName按应用名引用走StatelessApp不绑定具体状态实例slugliveoutput-2按DashApp实例的 slug 引用加载该实例的持久化状态daDashApp对象直接传入视图里查出的模型实例最灵活。示例演示中就用slug展示了同一个应用、两份不同状态的效果参考 demo/demo/templates/demo_four.html 与 demo/demo/plotly_apps.py{% load plotly_dash %} {% plotly_app nameLiveOutput ratio0.5 %} {% plotly_app slugliveoutput-2 ratio0.5 %}两行渲染的是同一个 Dash 应用但第二个引用了 slug 为liveoutput-2的DashApp实例因此加载的是该实例自己保存的状态。在 Django 管理后台管理应用状态django_plotly_dash/admin.py 为两个模型都注册了管理界面内置了实用的批量操作StatelessApp可批量Check stateless apps快速检查哪些已注册应用能正常实例化DashAppPopulate app instance调用populate_values()从布局中抓取全部初始值写入base_stateClone app instance基于现有实例克隆一份新的状态副本相当于另存为列表页直接展示instance_name、slug、save_on_change、更新时间等方便追踪每一份状态。这意味着无需写脚本就能在后台完成状态的初始化、复制与审计。快速上手安装与本地演示如果你希望动手体验状态持久化最省事的方式是运行项目自带的演示应用git clone https://gitcode.com/gh_mirrors/dj/django-plotly-dash cd django-plotly-dash ./make_env # 搭建开发虚拟环境 ./prepare_redis # 可选启动 Redis 容器 ./prepare_demo # 启动演示访问 http://localhost:8000在自己的项目中接入只需三步pip install django_plotly_dash、在INSTALLED_APPS中注册django_plotly_dash.apps.DjangoPlotlyDashConfig并在urls.py中include(django_plotly_dash.urls)最后执行./manage.py migrate建立数据表初始迁移见 django_plotly_dash/migrations/0001_initial.py。小结django-plotly-dash 用两个模型清晰地分离了关注点StatelessApp管理有哪些 Dash 应用随引用自动建记录DashApp管理每一份状态长什么样通过base_state的 JSON 持久化 save_on_change自动保存实现跨会话的持久化与共享。配合plotly_app模板标签的name/slug/da三种引用方式和 Django 管理后台的批量操作你就能在不重写 Dash 代码的前提下把任意 Dash 应用变成有记忆、可共享的 Django 页面组件。【免费下载链接】django-plotly-dashExpose plotly dash apps as django tags项目地址: https://gitcode.com/gh_mirrors/dj/django-plotly-dash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考