Python Django会话密钥获取或创建
我创建了以下模型跟踪用户会话关系:Python Django会话密钥获取或创建,python,django,session,Python,Django,Session,我创建了以下模型跟踪用户会话关系: from django.conf import settings from django.contrib.sessions.models import Session USER_MODEL = settings.AUTH_USER_MODEL class UserSession(models.Model): user = models.ForeignKey(USER_MODEL, on_delete=models.CASCADE) ses
from django.conf import settings
from django.contrib.sessions.models import Session
USER_MODEL = settings.AUTH_USER_MODEL
class UserSession(models.Model):
user = models.ForeignKey(USER_MODEL, on_delete=models.CASCADE)
session = models.ForeignKey(Session, on_delete=models.CASCADE)
要填充此模型的条目,请在下面注册user\u logged\u in
handler:
from django.contrib.auth import get_user_model
from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from accounts.models import UserSession
User = get_user_model()
@receiver(user_logged_in, sender=User, dispatch_uid="handle_user_login")
def handle_user_login(sender, request, user, **kwargs):
if not request.session.session_key:
request.session.create()
UserSession.objects.get_or_create(user=user, session_id=request.session.session_key)
模型和用户登录处理程序信号在生产中按预期部署和工作。问题是上述信号有时会引发数据库完整性错误:
insert or update on table "accounts_usersession" violates foreign key constraint "accounts_usersessio_session_id_fee1fd0b_fk_django_se"
DETAIL: Key (session_id)=(56aklsn6q00dm7hnszsksokbilj1p444) is not present in table "django_session".
上述异常的概率(实验)相当低,约为0.04%。我无法在本地开发环境中重现此错误。导致此错误的原因是什么?我如何防止它?我的假设是有人正在清理会话表中的数据。你确定你是唯一有数据库访问权限的人吗?@undoos我认为没有人从该表中删除数据。如您所见,如果session_key为None,我将创建session。用户的登录请求和这个信号的触发之间只有几毫秒的时间。这一短时间段也减少了从数据库中删除和插入到usersession表中的重叠重合。等一下,为什么要为登录的用户创建会话?如果这是在跟踪关系,它应该只观察,而不是创建。实际上,根据定义,发出此信号的登录用户有一个会话,您不应该干预。@Melvyn session.session_key可以是None,如果是,我应该创建新会话。看这个问题:不,你没有。答案是一个
save()
而不是一个create,这听起来很正常。查看触发登录信号的代码(django.contrib.auth.login),设置了会话密钥,因为没有会话就无法登录。