Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django会话密钥获取或创建_Python_Django_Session - Fatal编程技术网

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),设置了会话密钥,因为没有会话就无法登录。