You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django集成Plotly多用户独立主题设置问题及优化咨询

问题根源

你遇到的核心问题是:Plotly的pio.templates.default是进程级全局变量,Django作为多用户Web框架,所有请求共享同一进程的全局状态——当一个用户修改全局默认模板时,后续所有用户的图表都会使用这个模板,完全破坏了用户之间的主题隔离。

最佳实践与重构方案

核心思路:放弃全局模板设置,改为为每个用户的图表单独指定模板,依赖Django的Session存储用户主题偏好,在生成图表时动态应用对应模板。

1. 保留模板注册,移除全局默认设置

仅注册自定义模板,不要设置全局默认(全局默认是导致冲突的根源):

import plotly.io as pio
from apps.dashboards.themes.dark_theme import dark_template
from apps.dashboards.themes.white_theme import white_template

# 注册自定义模板(一次性全局操作,无用户隔离问题)
pio.templates["white_template"] = white_template
pio.templates["dark_template"] = dark_template

# 移除这行全局默认设置:
# pio.templates.default = "dark_template"

2. 重构主题切换视图:仅维护用户Session

切换主题时只把用户偏好存入Session,绝不修改全局模板设置:

class ChangeTheme(View):
    def post(self, request):
        response = {}
        try:
            light_mode = request.POST.get("light_mode") == "true"
            # 仅将主题偏好存入当前用户的Session(用户隔离)
            request.session["light_mode"] = light_mode
            # Django会自动保存Session修改,无需手动调用save()
        except Exception as error:
            response["error"] = str(error)
            # 建议添加日志记录:logger.error("Theme switch failed: %s", error)
        return HttpResponse(json.dumps(response), content_type="application/json")

3. 生成图表时动态应用用户专属模板

在所有生成Plotly图表的视图中,先从Session获取用户主题,再为当前图表单独应用模板:

from django.http import HttpResponse
import plotly.graph_objects as go
import json

class GenerateChartView(View):
    def get(self, request):
        # 从Session获取用户主题,默认使用深色主题
        light_mode = request.session.get("light_mode", False)
        target_template = "white_template" if light_mode else "dark_template"

        # 创建图表示例
        fig = go.Figure(data=[go.Bar(x=[1,2,3], y=[4,1,2])])
        
        # 为当前图表单独应用模板(用户隔离的关键)
        fig.update_layout(template=target_template)

        # 将图表转为JSON返回前端
        chart_json = json.dumps(fig.to_dict())
        return HttpResponse(chart_json, content_type="application/json")

额外优化:封装主题获取逻辑

把获取用户主题的逻辑封装成工具函数,避免重复代码:

# apps/dashboards/utils.py
def get_user_theme(request):
    """获取当前用户的主题模板名称"""
    return "white_template" if request.session.get("light_mode", False) else "dark_template"

在图表视图中调用:

from apps.dashboards.utils import get_user_theme

target_template = get_user_theme(request)
fig.update_layout(template=target_template)

内容的提问来源于stack exchange,提问作者Kushal Raut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:42:42