¿Existe una extensión de archivo idiomática para las plantillas de Jinja?

6 minutos de lectura

avatar de usuario
chris tonkinson

Necesito distinguir programáticamente entre archivos de plantilla Jinja, otros archivos de plantilla (como ERB) y archivos de texto sin formato sin plantilla.

De acuerdo a Documentación Jinja:

Una plantilla de Jinja no necesita tener una extensión específica: .html, .xml o cualquier otra extensión está bien.

Pero, ¿qué debo usar cuando se requiere una extensión explícita? .py es engañoso, y cualquier búsqueda que incluya las palabras “jinja” y “extensión” se ve muy afectada por la discusión en torno a Extensiones Jinja.

Fácilmente podría dictar una convención para todo el proyecto (.jnj o .ja viene a la mente) pero esto es para código abierto, por lo que no quiero ir en contra de la tendencia si ya existe una práctica establecida en alguna parte.


EDITAR 1: Nuevamente, entiendo que el proyecto Jinja, a propósito, no define una extensión de archivo predeterminada. Estoy preguntando si han surgido convenciones no oficiales para circunstancias en las que se desea una por algún motivo específico del proyecto.


EDITAR 2: Aclaración: Esto no es para contenido HTML.

  • Nota al margen para otros que encontraron esto mientras buscaban en el contexto de HTML: una cosa a tener en cuenta es que las extensiones de archivo tienen consecuencias en lo que respecta a los escapes automáticos de HTML. Si está cargando macros para usar en una plantilla HTML, {% import "whatever.html" as foo %} actuará como era de esperar mientras {% import "whatever.jinja" as foo %} conducirá escapes automáticos como > convirtiéndose >. Sospecho que esto es parte de por qué muchos usuarios de Django y Flask terminan usando .html.

    – alegría23

    16 de diciembre de 2015 a las 1:44


  • @mirth23, ¿podría dar más detalles sobre eso? Me funciona bien. Formulario HTML, la macro se agrega como HTML de trabajo a la plantilla, aunque estoy usando .html.j2 como extensión para todos ellos.

    – tbrlpld

    17 oct 2019 a las 21:45

avatar de usuario
Asamblea

Actualización 2021:: Jinja ahora recomienda oficialmente usar la extensión .jinja. controlar documentos


Actualizar:
Las cosas cambiaron desde que escribí esta respuesta, .jinja2 y .j2 están de moda.


Los autores de Jinja no definieron una extensión predeterminada. A la mayoría de los editores de plantillas de Jinja les gusta Extensión Vim, Extensión TextMate, Extensión Emacsy PyCharm no mencione ninguna extensión predeterminada para hacer cumplir el resaltado de Jinja.

Django ya había un debate similar sobre la configuración de una extensión predeterminada, y terminó como un no arreglará tema. Cito del mensaje de cierre:

La detección de tipo de archivo basada en la extensión es defectuosa por las mismas razones descritas en estos comentarios, por lo que debe realizar una inspección interna, al igual que funciona la detección de tipo MIME.

Le sugiero que use el suyo propio ya que no hay uno común.

  • Tiene razón, sé que no definen un valor predeterminado (y esa decisión se tomó con cuidado y consideración), pero mi proyecto requiere una extensión explícita: pregunto si han surgido convenciones no oficiales (antes de simplemente elegir uno arbitrariamente).

    –Chris Tonkinson

    13 de abril de 2015 a las 11:05


  • hasta donde yo sé, hay uno. Personalmente, uso html.

    – Asamblea

    13 de abril de 2015 a las 11:06

  • si hubiera una extensión común, los desarrolladores tenderán a implementarla en los editores ya que la mayoría de esos editores son desarrollados por la comunidad

    – Asamblea

    13 de abril de 2015 a las 11:08

  • No estoy trabajando en un proyecto web. Incluso si lo fuera, html no sería apropiado ya que, de nuevo, no distingue entre un archivo HTML con Jinja, y uno sin que (que es lo que tengo que hacer).

    –Chris Tonkinson

    13 de abril de 2015 a las 11:08

  • yo suelo .jinja2ja ja.

    – Raman Shah

    29 de octubre de 2015 a las 9:35

Ansible utiliza el .j2 extensión.

No pude encontrar una documentación definitiva sobre ese punto preciso, pero vemos ocurrencias del .j2 extensión en muchos lugares de su documentación:

si buscas .j2 en las siguientes páginas verá muchas ocurrencias:

http://docs.ansible.com/ansible/template_module.html
http://docs.ansible.com/ansible/playbooks_intro.html

Esta es la convención que uso también para otros proyectos, excepto las plantillas de django.

  • Los usuarios de Sublime Text pueden estar interesados ​​en saber que reconoce la extensión .j2 y puede, por ejemplo, detectar que *.html.j2 es una plantilla HTML jinja. Muy genial.

    – Jimmidy Joo

    30 de marzo de 2017 a las 19:19

  • Yo uso al revés como template.j2.html. Por lo tanto, cualquier editor podría resaltar la sintaxis, pero aún así marcarla como una plantilla.

    – Andor

    12 de junio de 2019 a las 9:13

avatar de usuario
Migwell

Usos de PyCharm de IntelliJ .jinja2 como su patrón para reconocer plantillas Jinja2. Por esa razón yo uso el mismo (y recomiendo que otros también lo hagan)

tipos de archivos pycharm

  • No veo “Plantilla Jinja 2” o *.jinja2 en mi lista de tipos de archivo. Estoy ejecutando 2018.3 Community Edition con muy pocas extensiones/complementos. EDITAR: Apuesto a que esto es específico de Professional Edition: jetbrains.com/help/pycharm/configuring-template-languages.html

    – Cody A. Ray

    20 de marzo de 2019 a las 4:52

avatar de usuario
geerlingguy

Quería agregar una respuesta adicional en 2020, ya que recientemente el proyecto Jinja2 decidió eliminar el ‘2’ del nombre… lo que significa que ahora es solo “Jinja”.

Ansible todavía usa .j2 en mucha documentación, pero dado que la documentación oficial del motor de plantillas de Jinja ahora recomienda .jinja si desea usar algo que no sea extensiones de archivo específicas de Jinja (consulte documentos aquío cuando se agregó el cambio), creo que la gente comenzará a moverse de esa manera (y abandonará el uso de .j2 o .jinja2).

avatar de usuario
rd2

Solo para su información: Johnride mencionado anteriormente sobre el uso de Ansible .j2 como su convención para el archivo de plantilla, lo cual es correcto, simplemente señalando las “mejores prácticas” documentadas que ahora han apagadoque menciona:

las plantillas terminan en .j2

avatar de usuario
Kiran Jonnalagadda

yo suelo .html.jinja2, .js.jinja2, .css.jinja2 etc. para indicar que (a) es una plantilla Jinja2 y (b) se compilará en un archivo HTML, JS o CSS. me gusta el .j2 elección en Ansible, pero IMO usando .jinja2 hace que sea más fácil para un nuevo colaborador adivinar qué lenguaje de plantillas se está utilizando.

Para los usuarios de Flask, dado que es bueno tener escape automático:

def _select_jinja_autoescape(filename):
    """
    Returns `True` if autoescaping should be active for the given template name.
    """
    if filename is None:
        return False
    return filename.endswith(('.html', '.htm', '.xml', '.xhtml',
        '.html.jinja', '.html.jinja2', '.xml.jinja', '.xml.jinja2',
        '.xhtml.jinja', '.xhtml.jinja2'))

app.jinja_env.autoescape = _select_jinja_autoescape

avatar de usuario
elemento21

Uso la extensión .jnj, y para resaltar la sintaxis y fragmentos en vim, solo copié, renombré y modifiqué la configuración para ramita.

Cuando necesito algunas configuraciones para html (como comentarios, equilibrio de etiquetas, sangría, etc.) en la plantilla jinja, también tengo una función configurada hace un tiempo para trabajar con PHP y WordPress: cambia a html y vuelve al tipo de archivo anterior:

let g:my_file_type = 0

function! ToggleFileType()
  if g:my_file_type == 0
      set ft=html
      let g:my_file_type = 1
  else
      filetype detect
      let g:my_file_type = 0
  endif
endfunction

Y está vinculado a la tecla F12 con nmap <silent> <F12> :call ToggleFileType()<CR>

¿Ha sido útil esta solución?