diff --git a/app/models/but_refcomp.py b/app/models/but_refcomp.py
index e9d046e28..824e7e3b6 100644
--- a/app/models/but_refcomp.py
+++ b/app/models/but_refcomp.py
@@ -9,6 +9,7 @@ from datetime import datetime
 import functools
 from operator import attrgetter
 
+from flask import g
 from flask_sqlalchemy.query import Query
 from sqlalchemy.orm import class_mapper
 import sqlalchemy
@@ -399,12 +400,6 @@ class ApcNiveau(db.Model, XMLModel):
         """Vrai si ce niveau fait partie du Tronc Commun"""
         return len(self.parcours) == self.competence.referentiel.parcours.count()
 
-    # Le ref. comp. ne change jamais (pas d'édition dans ScoDoc)
-    # on cache les résultats:
-    _niveaux_annee_de_parcours_cache: dict[
-        tuple[int, int, int, int], list["ApcNiveau"]
-    ] = {}
-
     @classmethod
     def niveaux_annee_de_parcours(
         cls,
@@ -424,9 +419,14 @@ class ApcNiveau(db.Model, XMLModel):
             referentiel_competence.id if referentiel_competence else None,
             competence.id if competence else None,
         )
-        result = cls._niveaux_annee_de_parcours_cache.get(key)
-        if result:
-            return result
+        _cache = getattr(g, "_niveaux_annee_de_parcours_cache", None)
+        if _cache:
+            result = g._niveaux_annee_de_parcours_cache.get(key, False)
+            if result is not False:
+                return result
+        else:
+            g._niveaux_annee_de_parcours_cache = {}
+            _cache = g._niveaux_annee_de_parcours_cache
         if annee not in {1, 2, 3}:
             raise ValueError("annee invalide pour un parcours BUT")
         referentiel_competence = (
@@ -444,12 +444,12 @@ class ApcNiveau(db.Model, XMLModel):
             if competence is not None:
                 query = query.filter(ApcCompetence.id == competence.id)
             result = query.all()
-            cls._niveaux_annee_de_parcours_cache[key] = result
+            _cache[key] = result
             return result
 
         annee_parcour: ApcAnneeParcours = parcour.annees.filter_by(ordre=annee).first()
         if not annee_parcour:
-            cls._niveaux_annee_de_parcours_cache[key] = []
+            _cache[key] = []
             return []
 
         if competence is None:
@@ -464,7 +464,7 @@ class ApcNiveau(db.Model, XMLModel):
             niveaux: list[ApcNiveau] = competence.niveaux.filter_by(
                 annee=f"BUT{int(annee)}"
             ).all()
-        cls._niveaux_annee_de_parcours_cache[key] = niveaux
+        _cache[key] = niveaux
         return niveaux