Django栈中如何在不终止请求时获取用户输入处理数据冲突
解决Django+Vue上传Excel冲突时的用户交互问题
最优方案:异步处理+会话式交互
这种模式既不用中断初始解析流程,也能在检测到冲突时触发用户选择,同时避免无效预询问:
步骤1:服务器端先完成解析与冲突检测
- Django接收Vue上传的Excel文件后,直接调用解析器提取所有样本数据,同步比对数据库中已存在的样本ID
- 无冲突时:直接执行数据写入,返回处理结果和异常信息
- 有冲突时:
- 将已解析的完整数据(含冲突标记)存入临时存储(如Redis,设置15分钟过期),生成唯一
session_key关联该数据 - 返回
206 Partial Content状态码(或自定义业务状态码),携带冲突详情(重复样本ID数量、示例)和session_key
- 将已解析的完整数据(含冲突标记)存入临时存储(如Redis,设置15分钟过期),生成唯一
步骤2:前端触发用户交互获取处理指令
- 前端识别到206状态后,弹出确认框,提供三个选项:「重新加载原文件所有数据」「更新现有数据」「仅追加新数据」
- 用户选择后,前端携带
session_key和选中的处理模式(如mode=overwrite/update/append)发送新请求到Django
步骤3:服务器执行最终处理
- 通过
session_key从临时存储取出已解析数据 - 根据处理模式执行对应逻辑:
overwrite:删除数据库中重复样本,写入所有新数据update:用新数据覆盖重复样本字段,同时写入新样本append:跳过重复样本,仅写入新数据
- 返回最终处理结果,清理临时存储的过期数据
方案优势
- 无无效预询问:仅在真冲突时触发用户交互,不干扰正常上传流程
- 复用解析结果:已完成的解析数据临时保存,无需用户重新上传,节省资源
- 流程连贯:用户在同一上传会话内完成冲突处理,体验更顺畅
关键实现细节
- 临时存储优先选Redis,用Django Cache框架配置即可,支持自动过期清理
- 解析数据序列化时注意处理Excel特殊格式(日期、数值),确保能完整还原
- 若临时数据过期,前端请求时返回「会话已过期,请重新上传」,引导用户重新操作
内容的提问来源于stack exchange,提问作者Patrick Upson
相关产品推荐
相关产品推荐

