AlexandreDecan / Lexpage

Code Python/Django à la base du Lexpage v4 http://www.lexpage.net
GNU General Public License v3.0
4 stars 5 forks source link

Discussion - migrer vers Jinja2 pour les templates #170

Open AlexandreDecan opened 8 years ago

AlexandreDecan commented 8 years ago

Django Template System et Jinja2 partagent beaucoup de points communs, mais aussi pas mal de petites différences de syntaxe. Historiquement, Jinja2 était 10 à 20x plus rapide que Django pour le rendu des templates, mais je n'ai aucune idée si cette affirmation est encore vraie à l'heure actuelle.

Quoiqu'il en soit, Jinja2 est un moteur de rendu proposé maintenant en standard dans Django (1.9 : https://docs.djangoproject.com/en/1.9/topics/templates/).

http://jinja.pocoo.org/docs/dev/

Outre les différences syntaxiques entre les deux, et la supposée différence de performances, Jinja2 permet d'intégrer quand nécessaire un peu de logique dans les templates, des macros, etc. Il serait peut-être intéressant de peser le pour et le contre d'une migration de DTS vers Jinja2, afin d'éviter d'utiliser certains "hacks" dans les templates à cause des limitations (justifiées, cela dit) de DTS.

Qu'en penses-tu @roidelapluie ?

AlexandreDecan commented 8 years ago

Quelques avantages en vrac :

Quelques inconvénients :

roidelapluie commented 8 years ago

Je connais très bien j2. La question est: est ce qu'on peut mixer les 2?

AlexandreDecan commented 8 years ago

Visiblement oui, en plaçant les templates dans des répertoires spécifiques pour chaque moteur. Pourquoi souhaites-tu mixer les deux ?

roidelapluie commented 8 years ago

Comme ça on évite une autre PR géante, on peut faire des PR avec 2/3 templates à la fois

AlexandreDecan commented 8 years ago

https://docs.djangoproject.com/en/1.9/topics/templates/#django.template.backends.base.Template.render

On peut effectivement mixer les deux, en séparant les sources. Si on souhaite faire une transition en douceur, c'est une bonne approche : placer les templates Jinja2 dans un répertoire parallèle dans chaque app, et dès qu'une template est prête avec Jinja2, on peut la virer du répertoire historique "templates". Quand l'ensemble est migré, on renomme le répertoire de Jinja2 en "template" (ou pas).

Je regarde pour les filtres/tags spécifiques à Django. Je suis sûr que si ça n'existe pas en builtin, quelqu'un aura pondu une extension pour supporter ça.

roidelapluie commented 8 years ago

On peut peut etre tester la parité jinja2/dst avec travis?

AlexandreDecan commented 8 years ago

Et visiblement, ce n'est pas difficile d'utiliser certains tags/filtres built-in de DTS dans Jinja2, il faut simplement les ajouter dans l'environnement.

https://docs.djangoproject.com/en/1.9/topics/templates/#django.template.backends.jinja2.Jinja2

AlexandreDecan commented 8 years ago

On pourrait, mais on risque d'avoir vite des différences notamment en terme d'espaces/retours à la ligne, et aussi je suppose qu'on va en profiter pour corriger quelques aberrations au passage :-D

Fondamentalement, la migration ne sera pas si factorisable que ça : les nombreux héritages/inclusions qu'on fait un peu partout vont nécessiter de dupliquer pas mal de templates à la fois dans DTS et dans Jinja2 pour garantir la transition. Ca ne va pas rendre les choses simples niveau organisation le temps de "tout migrer".

Je me demande si on peut encore charger "localement" des tags/filtres depuis un sous-répertoire "templatetags" d'une application. Je n'ai pas l'impression, et je ne vois rien dans la doc pour ça à première vue.

Tu as déjà utilisé Jinja2 dans un projet Django ? Je ne compte pas me précipiter vers une migration DTS -> Jinja2 sans méticuleusement m'assurer qu'on ne perdra pas en clarté/organisation au profit de quelques facilités d'écriture...

roidelapluie commented 8 years ago

Pas avec django. Mon blog utilise jinja2 par contre

AlexandreDecan commented 8 years ago

Il nous faudra au moins une implémentation des tags/filtres suivants :

Note que nous pouvons soit redéfinir ces tags from scratch, soit utiliser l'implémentation de Django.

Les filtres/tags suivants sont sans doute ré-écrivables autrement :

AlexandreDecan commented 8 years ago

Je pense qu'on va attendre Django 1.10 ou 1.11, que les gens se fassent les dents sur Jinja2 au travers de la 1.9 et remontent les bugs ;-)

AlexandreDecan commented 7 years ago

https://niwinz.github.io/django-jinja/latest/

AlexandreDecan commented 7 years ago

https://docs.djangoproject.com/fr/1.11/topics/templates/ Mais d'abord passer en 1.11 (par facilité), donc #179

AlexandreDecan commented 7 years ago

J'ai fait quelques tests, ils sont visibles dans la branche "jinja2". En particulier, il y a une configuration par défaut utilisant Jinja2 quand les templates sont définies (dossier "jinja2" au lieu de "templates"). J'ai converti grossièrement les templates correspondant à la page d'accueil (sidebar, navbar, etc. inclus).

Le retour que j'en fait :

Même s'il existe déjà un middleware django-jinja2 pour faciliter le passage de l'un à l'autre, je ne suis pas convaincu que ça soit une bonne idée que d'utiliser ce middlware, car grosso-modo, on ne fait que porter les features de base de Django vers Jinja2 via de gros workarounds. A terme, ce serait bien plus propre et sain de réfléchir directement en "Jinja2". Mais est-ce que l'on veut réellement y arriver ?

Bien que j'apprécie la souplesse de Jinja2 (notamment pour faire de arithmétique ou un peu de logique procédurale), est-ce que l'absence de cette souplesse est un réel problème pour Lexpage ?