如何在Django应用间传递用户专属选择数据?
Django+Dash 用户选择留存方案建议
优先推荐:使用Django Model存储用户选择
这是最可靠的持久化方案,适合需要长期保存、跨会话生效的场景,完全能实现用户专属的数据隔离。
1. 创建关联用户的Model
定义一个模型来绑定用户和其选择内容:
from django.db import models from django.contrib.auth.models import User class UserSelection(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) selection_key = models.CharField(max_length=50) # 标记选择来源,比如"dashboard1_dropdown" selection_value = models.CharField(max_length=255) # 下拉选择的具体值 updated_at = models.DateTimeField(auto_now=True) class Meta: unique_together = ('user', 'selection_key') # 确保同一用户同一选择项只有一条记录
执行迁移命令生成数据表:
python manage.py makemigrations python manage.py migrate
2. 在第一个Dash App中保存用户选择
在下拉菜单的回调里,通过app.get_request()获取当前登录用户,然后更新或创建选择记录:
from django_plotly_dash import DjangoDash from .models import UserSelection app = DjangoDash('DropdownApp') # 你的下拉菜单布局 app.layout = ... @app.callback( Output('status-output', 'children'), Input('target-dropdown', 'value') ) def save_user_selection(selected_value): request = app.get_request() user = request.user if user.is_authenticated: # 存在则更新,不存在则创建 UserSelection.objects.update_or_create( user=user, selection_key='main_dropdown', defaults={'selection_value': selected_value} ) return f"已选择:{selected_value}"
3. 在第二个Dash App中读取用户选择
同样通过请求对象获取用户,查询对应的选择记录:
from django_plotly_dash import DjangoDash from .models import UserSelection app2 = DjangoDash('AnotherApp') # 第二个App的布局 app2.layout = ... @app2.callback( Output('preloaded-input', 'value'), Input('page-load-trigger', 'n_clicks') ) def load_user_selection(n_clicks): request = app2.get_request() user = request.user if user.is_authenticated: try: selection = UserSelection.objects.get(user=user, selection_key='main_dropdown') return selection.selection_value except UserSelection.DoesNotExist: return "请先完成选择" # 无选择时的默认提示 return None
其他可选方案
如果不需要长期保存选择,可根据场景选以下轻量方案:
- Django Session:仅在当前会话生效,会话结束后数据自动清除
保存:
读取:request.session['user_dropdown_choice'] = selected_value request.session.save()selected_value = request.session.get('user_dropdown_choice', None) - Redis缓存:适合高并发场景,可设置过期时间
保存:
读取:from django.core.cache import cache cache.set(f"user_{user.id}_dropdown", selected_value, timeout=86400) # 24小时过期selected_value = cache.get(f"user_{user.id}_dropdown")
关键注意点
之前的API方案失效,大概率是没正确关联当前登录用户。无论用哪种方案,核心都是在Dash回调中获取当前请求的用户对象,再针对该用户做数据的读写操作,确保数据是用户专属的。
内容的提问来源于stack exchange,提问作者Ata K
相关产品推荐
相关产品推荐

