Django对接MongoDB的CVAT登出未删session导致二次登录失败如何解决
CVAT集成MongoDB二次登录报错修复方案
报错信息与根因
二次登录CVAT时提示「Could not login」,浏览器控制台报错如下:
FAILED SQL: INSERT INTO "auth_user_groups" ("user_id", "group_id") VALUES (%(0)s, %(1)s)
报错截图:
根因:首次登录后登出时,Django未自动删除auth_user_groups集合内关联的session id,二次登录时插入重复记录触发唯一索引冲突,导致登录流程中断。
无需手动删库的修复方案
以下三种方案任选一种即可实现多次登录登出无异常:
方案1:修改用户组分配逻辑为幂等操作
修改CVAT认证模块中用户组分配的代码,插入前先判断记录是否存在,避免重复插入:
- 找到CVAT认证后端代码,默认路径为
cvat/apps/iam/backends.py - 找到登录成功后给用户分配默认用户组的代码段,替换为如下逻辑:
from django.contrib.auth.models import Group # 原有的认证成功后处理逻辑中,替换用户组添加逻辑 def assign_default_groups(user): # 替换为你实际配置的默认用户组名称 target_group, _ = Group.objects.get_or_create(name="default") # 先判断关联关系是否已存在,不存在才执行插入 if not target_group.user_set.filter(id=user.id).exists(): target_group.user_set.add(user)
方案2:绑定登出信号自动清理关联记录
通过Django登出信号触发自动清理逻辑,每次用户登出时自动删除auth_user_groups中对应用户的关联记录:
- 在
cvat/apps/iam目录下新建signals.py文件,写入如下代码:
from django.contrib.auth.signals import user_logged_out from django.dispatch import receiver from django.contrib.auth.models import UserGroup @receiver(user_logged_out) def clear_auth_group_relation_on_logout(sender, user, request, **kwargs): # 可过滤不需要清理的用户,比如超级管理员 if user and not user.is_superuser: UserGroup.objects.filter(user_id=user.id).delete()
- 打开同目录下的
apps.py,注册信号:
from django.apps import AppConfig class IamConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'cvat.apps.iam' def ready(self): # 导入信号完成注册 import cvat.apps.iam.signals
方案3:修改数据库配置忽略插入冲突
如果你使用djongo作为MongoDB的Django驱动,可以直接修改数据库配置,遇到重复插入冲突时自动忽略错误,不阻断登录流程:
打开CVAT的Django配置文件settings.py,修改数据库配置项:
DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': '你的MongoDB数据库名称', 'CLIENT': { 'host': '你的MongoDB服务地址', 'port': 27017, # 有鉴权的话补充username、password配置 }, 'OPTIONS': { # 开启插入冲突忽略,重复唯一索引插入时不会抛出错误 'ignore_conflicts': True } } }
验证方法
完成任意一种方案的修改后,重启CVAT所有服务,连续执行多次登录、登出操作,无需手动清理MongoDB数据,即可正常登录无报错。
内容的提问来源于stack exchange,提问作者tec data
相关产品推荐
相关产品推荐


