-
Notifications
You must be signed in to change notification settings - Fork 161
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cache menu par fragments #3736
Cache menu par fragments #3736
Conversation
<a href="{% url "tutorial:list" %}" class="mobile-menu-link {% block menu_tutorial %}{% endblock %}"> | ||
{% trans "Tutoriels" %} | ||
</a> | ||
{% cache 1800 menu_tutorial user.pk|default_if_none:"0" %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Est-ce que les menus des tutos et des articles peuvent être différents selon l'utilisateur ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je ne crois pas. J'ai pas lu beaucoup de doc à ce sujet, mais le fragment caché semble uniquement identifié par la clé de cache. Du coup on pourrait pas avoir plusieurs fragments cachés avec la même clé. Je pense pas que ça ferait vraiment une différence de toute façon.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ici on aurait la situation inverse : le même fragment caché plein de fois avec des clés différentes (puisque tu définis user.pk
comme clé de cache alors qu'en fait ce n'est pas un critère différenciant). C'est pas très important mais dommage.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah j'avais compris que tu proposais autre chose. Très bien vu en effet.
Pourquoi la clé originale était l'user.pk
@gustavi ? Dans quels cas le menu diffère entre deux utilisateurs ? Est-ce une affaire de groupe utilisateur ? Autre ?
J'ai l'impression que connecté et déconnecté le contenu de ces 3 menus est le même. Du coup on peut avoir qu'un seul cache par menu pour tous les utilisateurs, au lieu d'avoir un cache par menu par utilisateur, non ? Le cache hit sera nettement plus élevé, mais l'empreinte mémoire très très nettement plus basse, du coup on peut sans problème réduire la durée du cache à genre 10min.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, donc j'avais pas fait gaffe mais genre j'ai accès au menu ||CA de l'association||. Du coup il est dans mon menu. Donc on peut pas avoir le même cache pour tout le monde.
Peut-on le baser sur les groupes ? Genre un join des groupes ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Le menu forums est personnalisé (au moins par groupe). Les autres je ne pense pas, d'où mon commentaire.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok.
Du coup un fix intéressant et plus puissant que la solution en place ou la présente PR serait de se baser sur les groupes et le flag is_staff.
Il suffit de créer une clé, pour ça y'a plein d'options, en voici 2 :
groups = User.objects.filter(username='victor').prefetch_related('groups').values_list('groups', 'is_staff')
key = '-'.join([str(int(group)) + str(int(staff)) for (group, staff) in groups])
# ou alors
groups_pks = User.objects.filter(username='victor').prefetch_related('groups').values_list('groups', flat=True)
key = '{}-{}'.format(
str(int(self.is_staff)),
'-'.join(groups_pks)
)
Ça c'est la partie facile. Maintenant, la question que je me pose, c'est où faire ça ? Si on fait un filter
pour ça auquel on passe notre utilisateur et qu'on l'appelle à chaque cache_fragment, on ajoute une requête par fragment, ce qui est con. Du coup où ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'aime bien baser le clé sur les groupes. Par contre, le flag is_staff
n'est pas utilisé au sein de ZdS (de mémoire).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
L'option de @vhf avec les groupes me semble la meilleure option !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@GerardPaligot Il me semble que si. Tous les gens qui ont le badge "staff" semblent être is_staff=True
.
Je suis ravi d'implémenter cette histoire de groupe, mais j'aimerais bien quand même vos avis sur mes questions de mon précédent commentaire.
à QA |
Par hasard, tu connais la procédure pour avoir un cache actif en local ? PS : C'est moche de fail sur des erreurs lint. :) |
Yep @GerardPaligot https://github.com/vhf/zds-site/blob/10cac916752eee0952823f08dde88c1421290dc9/zds/settings_test_local.py Le caching casse un test pas très réaliste. J'enlève la partie du test qui passe pas ? |
Pourquoi le forum ne serait-il plus afficher suite au cache ? De mémoire, il est disponible dans le fil d'Ariane et ne devrait donc pas rentrer dans le cache. |
Il le serait si le test était correct. En l'occurrence le test passait par accident, grâce au menu. |
rofl ... :) Du coup, le |
Pas exactement @GerardPaligot . Ces forums et catégories sont créés dans le setUp, avant chaque test. Du coup la première fois qu'on y passe, on créé des catégories et des forums etc. Ensuite à la première requête HTTP, le menu se retrouve en cache. Puis au prochain test le setUp en créera d'autres avec un nom contenant un ID incrémenté. Le cache n'est pas donc presque jamais synchro. Pour te donner un exemple, si tu lances seulement les tests de
ensuite y'aura quelques tests sur d'autres forums, puis le test va casser là :
puis y'a plein d'autres tests qui passent, et le dernier sera genre :
Mais à ce moment là, dans le cache du menu, on a toujours
Ce qui est normal et attendu. C'est pour ça que je disais que le test n'était pas réaliste. Il simule une situation où chaque seconde on créé 5 forums et on les supprime après quelques fractions de secondes. |
Je confirme le 0 requête (GG) et j'ai bien un cache correct. QA ok donc. |
QA
.current
est bien celui sur lequel on se trouve après avoir navigué entre différentes sections du site./pages/apropos
, on passe de 10 requêtes au premier chargement à 0 (oui, 0) requête aux chargements suivants par tranche de 30 minutes. (0 pour visiteur pas connecté, hein, sinon y'a quand même les notifs, toussa)Notes
groups
à appliquer à la variableuser
dans les templates. Son contenu est toujours caché, donc on peut l'utilisé comme clé partout où on a besoin de cacher un fragment d'après les groupes. Vu qu'on change rarement de groupes et qu'il s'agit que de visuel, pas de fonctionnalité, j'ai mis un cache de 4h.