Development #45461
IntegrityError: null value in column "session_key" violates not-null constraint
0%
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
Historique
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).
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.
Mis à jour par Valentin Deniaud il y a presque 4 ans
- Fichier 0001-views-handle-empty-session-at-athentication-45461.patch 0001-views-handle-empty-session-at-athentication-45461.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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.
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.
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)
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
views: handle empty session at authentication (#45461)