Récupérer la liste des membres par API #83

Open
opened 2020-11-07 11:17:53 +01:00 by Darks · 5 comments
Owner

La génération de la page /admin/membres est très longue. ~10 à 15 secondes en local pour ~15000 membres, alors que mon PC a des perfs largement supérieures au VPS.

Après test, il s'avère que le bottleneck est la génération du template.

{% for user in users %}
	<tr><td><a href="{{ url_for('user_by_id', user_id=user.id) }}" title="Page de profil publique de {{ user.name }}">{{ user.name }}</a></td>
			<td style="color: {{ 'red' if not user.email_confirmed else 'inherit' }};">{{ user.email }}</td>
			<td style="text-align: center">{{ user.register_date | date('%Y-%d-%d') }}</td>
			<td>{% for g in user.groups %}
				<span style="{{ g.css }}">{{ g.name }}</span>
				{{ ', ' if not loop.last }}
				{% endfor %}</td>
			<td>{% for priv in user.special_privileges() %}
				<code>{{ priv }}</code>
				{{- ', ' if not loop.last }}
				{% endfor %}</td>
			<td style="text-align: center"><a href="{{ url_for('adm_edit_account', user_id=user.id) }}">Modifier</a></td>
	</tr>
{% endfor %}
# +10 secondes
{% for user in users %}
	A			
{% endfor %}
        
# <1 seconde

L'idée est donc de générer via un endpoint API une liste de membres (format JSON), de l'envoyer au client, et de laisser ce dernier la mettre en forme et la filtrer.

On devrait ainsi avoir des perfs plus correctes.

La génération de la page `/admin/membres` est très longue. ~10 à 15 secondes en local pour ~15000 membres, alors que mon PC a des perfs largement supérieures au VPS. Après test, il s'avère que le bottleneck est la génération du template. ``` {% for user in users %} <tr><td><a href="{{ url_for('user_by_id', user_id=user.id) }}" title="Page de profil publique de {{ user.name }}">{{ user.name }}</a></td> <td style="color: {{ 'red' if not user.email_confirmed else 'inherit' }};">{{ user.email }}</td> <td style="text-align: center">{{ user.register_date | date('%Y-%d-%d') }}</td> <td>{% for g in user.groups %} <span style="{{ g.css }}">{{ g.name }}</span> {{ ', ' if not loop.last }} {% endfor %}</td> <td>{% for priv in user.special_privileges() %} <code>{{ priv }}</code> {{- ', ' if not loop.last }} {% endfor %}</td> <td style="text-align: center"><a href="{{ url_for('adm_edit_account', user_id=user.id) }}">Modifier</a></td> </tr> {% endfor %} # +10 secondes ``` ``` {% for user in users %} A {% endfor %} # <1 seconde ``` L'idée est donc de générer via un endpoint API une liste de membres (format JSON), de l'envoyer au client, et de laisser ce dernier la mettre en forme et la filtrer. On devrait ainsi avoir des perfs plus correctes.
Darks added the
performance
label 2020-11-07 11:17:53 +01:00
Owner

Oh, intéressant. Le template est limitant... ma première réaction était surtout de paginer dans le panel admin. Ultimement si on a n'a pas de JS on reste coincés sur l'affichage (on peut demander à nos admins d'avoir du JS à la limite, mais pas à tout le monde).

Oh, intéressant. Le template est limitant... ma première réaction était surtout de paginer dans le panel admin. Ultimement si on a n'a pas de JS on reste coincés sur l'affichage (on peut demander à nos admins d'avoir du JS à la limite, mais pas à tout le monde).
Author
Owner

C'est ce qu'on s'est dit avec Eragon :

  • le panel admin est réservé aux admins, on peut leur demander d'avoir Js actif pour utiliser ce bout
  • la liste en tant que telle est inutile, c'est le filtrage qui lui donne tout son potentiel, donc Js là aussi
  • le json sera peut-être plus adapté pour le filtrage/affichage
C'est ce qu'on s'est dit avec Eragon : - le panel admin est réservé aux admins, on peut leur demander d'avoir Js actif pour utiliser ce bout - la liste en tant que telle est inutile, c'est le filtrage qui lui donne tout son potentiel, donc Js là aussi - le json sera peut-être plus adapté pour le filtrage/affichage
Owner

Bah écoute ACK pour ça, je vois pas de raisons de s'embêter.

Bah écoute ACK pour ça, je vois pas de raisons de s'embêter.
Owner

Puisqu'en en parlait tout à l'heure je me demande quand même s'il y a pas juste un truc pathologique dans la recherche des groupes qui ne provoque pas un nombre déraisonnable de requêtes SQL. Il est possible que formuler le template autrement et/ou charger explicitement les données à l'avance aille sensiblement plus vite.

Puisqu'en en parlait tout à l'heure je me demande quand même s'il y a pas juste un truc pathologique dans la recherche des groupes qui ne provoque pas un nombre déraisonnable de requêtes SQL. Il est possible que formuler le template autrement et/ou charger explicitement les données à l'avance aille sensiblement plus vite.
Owner

Darks et Breizh préfèrent filtrer sur le serveur (avec un format typé, et renvoyer du JSON). Ça m'est égal mais j'irai pas le coder, et il vaudrait mieux que ce soit assez factorisé pour pouvoir filtrer aussi des tables de topics, programmes, etc... sans avoir à tout recoder.

Darks et Breizh préfèrent filtrer sur le serveur (avec un format typé, et renvoyer du JSON). Ça m'est égal mais j'irai pas le coder, et il vaudrait mieux que ce soit assez factorisé pour pouvoir filtrer aussi des tables de topics, programmes, etc... sans avoir à tout recoder.
Darks referenced this issue from a commit 2021-07-23 23:28:34 +02:00
Sign in to join this conversation.
No description provided.