Projet

Général

Profil

Development #45461

IntegrityError: null value in column "session_key" violates not-null constraint

Ajouté par Sentry Io il y a presque 4 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
24 juillet 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/publik/issues/3488/

DoesNotExist: SessionIndex matching query does not exist.
  File "django/db/models/query.py", line 464, in get_or_create
    return self.get(**lookup), False
  File "django/db/models/query.py", line 380, in get
    self.model._meta.object_name

IntegrityError: null value in column "session_key" violates not-null constraint
DETAIL:  Failing row contains (97, _EAA90AC394B5BBAB321CEABFB28B25D5, null, 2496).

  File "django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)

IntegrityError: null value in column "session_key" violates not-null constraint
DETAIL:  Failing row contains (97, _EAA90AC394B5BBAB321CEABFB28B25D5, null, 2496).

(23 additional frame(s) were not displayed)
...
  File "django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)

Fichiers

Révisions associées

Révision bdbc2512 (diff)
Ajouté par Valentin Deniaud il y a plus de 3 ans

views: handle empty session at authentication (#45461)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 4 ans

  • Projet changé de Suivi des traces à django-mellon

(je ne sais trop quelle situation peut amener request.session.session_key à être vide).

#2

Mis à jour par Benjamin Dauvergne il y a presque 4 ans

Un session nouvelle, je crois que session_key n'est alloué qu'à la sauvegarde.

#3

Mis à jour par Valentin Deniaud il y a presque 4 ans

  • Assigné à mis à Valentin Deniaud
#4

Mis à jour par Valentin Deniaud il y a presque 4 ans

Benjamin Dauvergne a écrit :

Un session nouvelle, je crois que session_key n'est alloué qu'à la sauvegarde.

Restait donc à comprendre pourquoi la plupart du temps il y en a une, et parfois non.

J'ai bien farfouillé et finalement réussi à reproduire :
  • aller sur combo, ouvrir deux fois le lien connexion
  • s'identifier avec un premier utilisateur
  • sur la seconde page, s'identifier avec un utilisateur différent, et crash

C'est parce que dans django/contrib/auth/__init__.py :

    if SESSION_KEY in request.session:
        if _get_user_session_key(request) != user.pk or (
                session_auth_hash and
                not constant_time_compare(request.session.get(HASH_SESSION_KEY, ''), session_auth_hash)):
            # To avoid reusing another user's session, create a new, empty
            # session if the existing session corresponds to a different
            # authenticated user.
            request.session.flush()
    else:
        request.session.cycle_key()

Et dans la plupart des cas on a le cycle_key() qui nous initialise une session, mais dans le cas du crash on tombe sur le flush et session_key nous arrive vide.

Patch tout simple, faire nous même l'initialisation quand ça arrive.

#5

Mis à jour par Frédéric Péters il y a presque 4 ans

  • Statut changé de Solution proposée à Solution validée

Typo dans l'intitulé du commit (athentication) à corriger, mais ok.

#6

Mis à jour par Valentin Deniaud il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit bdbc251291b1f006d17ad719e2ebc42ffab222e9
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Mon Jul 27 17:45:13 2020 +0200

    views: handle empty session at authentication (#45461)
#7

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF