I have created below model tracking user-session relationships:
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)
And to populate entries of this model, registered below user_logged_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)
The model and user login handler signal are deployed and working as expected in production. Problem is above mentioned signal sometimes raises database integrity error:
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".
The probability (experimental) of above exception is fairly low at about 0.04%. I couldn't reproduce this error in my local development environment. What can be cause for this error and how can I prevent it?