[PYTHON] J'ai comparé Jinja2 en lisant le document pour l'utiliser avec Django

Cet article est l'article du 16e jour du calendrier de l'avent Django 2016.

Qu'est-ce que Jinja2

En termes simples, c'est un moteur de modèle Python. Page officielle: http://jinja.pocoo.org/ Inspiré du moteur de template de Django, il ressemble au moteur de template par défaut de Django. Jinja2 est plus riche en fonctionnalités que le moteur de modèle de Django et peut être utilisé à d'autres fins telles que LaTex et le courrier électronique, plutôt qu'un moteur de modèle dédié à l'écriture de HTML et XML.

Officiellement pris en charge depuis Django 1.8. (L'installation de la bibliothèque est requise)

À propos, l'origine du nom est Si vous traduisez le sanctuaire en anglais, Temple, Template et Temple ont des prononciations similaires → Il semble être Jinja w

Comment j'ai décidé d'enquêter

Je suis nouveau sur Django, donc je n'ai jamais utilisé Jinja2 avec Django me demandant si je devais utiliser le moteur de template par défaut pour le moment. Je l'ai utilisé dans Other Uses (je suis désolé pour mon article w), mais je n'ai rien fait de spécial, donc j'ai beaucoup lu la documentation. Il n'y a pas une telle chose.

~~ Je suis plus habitué à Rails que Django lors du développement de frameworks Web, donc je veux vraiment utiliser Slim made by Ruby ~~ Il existe un moteur de template plus pratique pour faciliter le développement. Je voulais l'utiliser si possible, alors cette fois j'ai décidé d'étudier Jinja2 en me concentrant sur l'utilisation dans Django.

Il semble que Django dispose également d'un moteur de template de type Slim, mais je l'ai arrêté car il y a peu d'informations et il semble difficile de chercher.

** Cet article ne décrit que les choses liées à Django, je ne couvrirai donc pas d'autres utilisations. ** **

Environnement d'exécution

En fait, remplacer le template Django par Jinja2 m'a semblé difficile, donc cette fois j'ai juste remplacé une petite partie du projet existant par un essai. Comme je l'écrirai dans le prochain élément d'introduction, le moteur de modèle par défaut et Jinja2 ont été mélangés dans un seul projet. ** Python 3.3 et supérieur ne semble pas être entièrement pris en charge **, vous devez donc faire attention si vous utilisez 3.4 ou supérieur. Cependant, puisque le test lui-même a réussi, même s'il y a des bogues, seuls les petits le seront. http://jinja.pocoo.org/docs/dev/intro/#experimental-python-3-support

introduction

Réécrivez TEMPLATE dans le fichier settings.py de Django comme suit. Par défaut, Jinja2 recherchera dans le répertoire jinja2 des fichiers modèles, donc passer à Jinja2 avec BACKEND dans l'état habituel ne fonctionnera pas. Il semble qu'il soit nécessaire de changer le nom du répertoire des modèles de chaque application en jinja2 ou de le spécifier explicitement avec DIRS. Dans l'exemple ci-dessous, le paramètre Jinja2 est ajouté au paramètre habituel (?).

Dans mon environnement de développement local, j'ai mis django_debug_toolbar etc., mais afin de passer le chemin vers les modèles de ces bibliothèques, je devais également mettre les paramètres habituels du modèle. Dans un environnement de production, ces bibliothèques ne sont pas utilisées, et seuls les modèles définis par eux-mêmes sont utilisés (probablement), il semble donc que seuls les paramètres Jinja2 soient suffisants.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
        'APP_DIRS': True,
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Différence avec Django

La documentation est complète, mais il y a de nombreuses parties qui ne sont pas pertinentes pour une utilisation en tant que moteur de template de Django, donc pour le moment, je pense que vous pouvez voir ce que vous pouvez faire en regardant l'URL ci-dessous. http://jinja.pocoo.org/docs/dev/templates/#synopsis

Bien qu'il s'appelle Django Inspire, il existe de nombreuses différences dans les spécifications détaillées, je ne présenterai donc que les différences majeures.

Différence de description lors de l'exécution d'une méthode

Avec JinJa2, vous pouvez écrire des traitements comme Python même sur un modèle. Comme indiqué ci-dessous, Django n'a pas (), mais Jinja2 ajoute (). Django: {% for page in user.get_created_pages %} Jinja2: {% for page in user.get_created_pages() %} Grâce à cela, il est possible d'ajouter order_by au modèle Django côté template. Cependant, je ne pense pas que ce soit cool de presser une telle description du côté du modèle.

macro

http://jinja.pocoo.org/docs/dev/templates/#macros Dans Django, si vous voulez faire autre chose que le traitement fourni depuis le début sur le modèle, je pense que vous avez défini votre propre balise de modèle, mais dans Jinja2, vous le définissez en utilisant quelque chose appelé macro. La macro définie dans le modèle peut être réutilisée à l'aide de call. Je vais omettre les détails w

Vous pouvez utiliser divers opérateurs et filtres (balises de modèle?)

http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters Il existe étonnamment de nombreux filtres. C'est une impression que vous pouvez utiliser ou avoir des méthodes qui peuvent être utilisées pour chacun des tableaux, chaînes de caractères et objets numériques de Python.

http://jinja.pocoo.org/docs/dev/templates/#math J'utilise django-mathfilter quand je veux exécuter quatre règles sur un modèle avec Django, mais Jinja2 ne semble pas en avoir besoin. C'est sobre, mais je suis content. Il existe également de nombreux opérateurs de comparaison.

C'est extrêmement plus facile que de créer et d'utiliser vous-même des balises de modèle.

Gestion des variables

Par exemple, lorsque vous souhaitez afficher les variables suivantes dans un modèle

foo = {"bar": 1}

Pour le modèle par défaut de Django

foo.bar

Par conséquent, vous ne pouvez pas écrire foo [" bar "], mais dans le cas de Jinja2, vous pouvez également utiliser foo [" bar "]. Je suis également heureux car il me semblait toujours étrange d'accéder aux variables dict avec des points.

Gestion des variables globales

http://qiita.com/ryu22e/items/e50f8a3fbd6fe836c1b4 Je ne l'écrirai pas car certaines personnes ont déjà écrit l'article. Je pense que context_processor est applicable au moteur de template par défaut de Django, mais je ne suis pas sûr que la possibilité de définir des variables globales soit l'avantage de Jinja2 car je ne l'ai jamais fait moi-même.

Résumé

Il a plus de fonctionnalités que ce à quoi je m'attendais et c'est devenu un article approximatif.

C'est très polyvalent et je veux l'utiliser tout de suite, mais bien qu'il s'appelle Django Inspire, il y a beaucoup de différences mineures, et j'ai eu l'impression que remplacer un projet existant par Jinja2 semble un peu ennuyeux. Lors du passage à Slim avec Rails, il existe une commande de conversion, il était donc relativement facile de passer, mais Jinja2 semble impossible à moins que vous ne vérifiiez tout correctement. J'aimerais l'essayer lors de la création d'une nouvelle application.

De plus, je ne pense pas qu'il soit bon de bourrer la logique du côté du modèle ou de toucher les données en premier lieu, alors j'ai pensé que je devais être particulièrement prudent lors de l'utilisation de Jinja2. La même chose est écrite dans le document. http://jinja.pocoo.org/docs/dev/faq/#isn-t-it-a-terrible-idea-to-put-logic-into-templates

Recommended Posts

J'ai comparé Jinja2 en lisant le document pour l'utiliser avec Django
[Python] Je souhaite utiliser l'option -h avec argparse
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
Je souhaite utiliser Django Debug Toolbar dans les applications Ajax
J'ai changé le générateur de jetons jwt en simplejwt avec Django Rest Auth.
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
Le moyen le plus simple de démarrer avec Django
Je veux utiliser MATLAB feval avec python
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Je voulais jouer avec la courbe de Bézier
Le moyen le plus simple d'utiliser OpenCV avec python
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
Je souhaite utiliser ip vrf avec SONiC
Je souhaite utiliser la fonction d'activation Mish
J'ai essayé d'entraîner la fonction péché avec chainer
Je veux faire défiler la table de décalage Django, mais ...
Utiliser Gentelella avec Django
J'ai essayé de toucher un fichier CSV avec Python
Je voulais utiliser la bibliothèque Python de MATLAB
Je veux hériter de l'arrière avec la classe de données python
Spécifiez MinGW comme compilateur utilisé dans Python
Utilisez LESS avec Django
Transition vers l'écran de mise à jour avec le Django a tag
J'ai essayé de résoudre le problème avec Python Vol.1
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Je veux utiliser le jeu de données R avec python
Je t'ai écrit pour regarder le signal avec Go
J'ai essayé de trouver l'entropie de l'image avec python
Je veux utiliser la dernière version de gcc même si je n'ai pas les privilèges sudo! !!
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
J'ai essayé de simuler la propagation de l'infection avec Python
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
Pourquoi puis-je utiliser le module en important avec python?
C'était trop facile d'utiliser une base de données existante avec Django
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
Je veux créer un éditeur de blog avec l'administrateur de django
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Comprendre comment utiliser Jinja2 rend le développement avec Flask plus intelligent
J'ai remarqué en essayant d'exécuter ninix-aya avec Docker (partie 3)
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je ne savais pas comment utiliser l'instruction [python] for
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
J'ai essayé de résumer comment utiliser à nouveau le référentiel EPEL
J'ai comparé lame et jinja2
Utilisez prefetch_related commodément avec Django
Pour fêter la sortie de Django 3.0, j'ai essayé ASGI, le successeur spirituel de WSGI, mais le socket Web n'a pas fonctionné.
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Répétez avec While. Script pour tweeter ou rechercher depuis le terminal
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux connaître la météo avec LINE bot avec Heroku + Python
[Version septembre 2020] Explique la procédure d'utilisation de l'API Gmail avec Python