Jinja模板是否有惯用的文件扩展名?


69

我需要以编程方式区分Jinja模板文件,其他模板文件(例如ERB)和无模板纯文本文件。

根据Jinja文档

Jinja模板不需要特定的扩展名:.html,.xml或任何其他扩展名都可以。

但是当需要显式扩展时我应该使用什么?.py会引起误解,围绕Jinja Extensions的讨论会严重搜索搜索包括“ jinja”和“ extension”一词的所有内容。

我可以很容易地规定一个项目范围内的约定(.jnj或者.ja想到),但这是针对开放源代码的,因此,如果某个地方已经建立了惯例,那么我不想逆潮流。


编辑1:同样,我了解Jinja项目(故意)没有定义默认文件扩展名。我要问的是,出于某些项目特定的原因,在某些情况下需要使用非官方的约定。


编辑2:说明:这不适用于HTML内容。


3
在HTML上下文中搜索时发现的其他人的旁注:要注意的一件事是,就HTML自动转义而言,文件扩展名会带来后果。如果您要加载要在HTML模板中使用的宏,{% import "whatever.html" as foo %}则操作会毫不奇怪,同时{% import "whatever.jinja" as foo %}会导致自动转义>成为>。我怀疑这就是为什么许多Django和Flask用户最终使用的一部分.html
mirth23

@ mirth23您可以详细说明吗?我对我来说很好。尽管我.html.j2将所有宏都用作扩展名,但是将宏形式的HTML作为工作HTML添加到了模板中。
tbr

Answers:


27

更新: 自从我写了这个答案以来,情况发生了变化,.jinja2并且还在.j2不断发展。


Jinja作者未定义默认扩展名。大多数Jinja模板编辑器(例如Vim扩展TextMate扩展Emacs扩展PyCharm)都没有提到默认扩展来强制Jinja突出显示。

Django对于设置默认扩展名已经有类似的争论,最终以wontfix问题告终。我引用结束语:

由于这些注释中所述的原因,基于扩展名的文件类型检测存在缺陷,因此您必须进行一些内部检查,就像MIME类型检测一样。

我建议您使用自己的,因为没有共同之处。


3
没错,我知道他们没有定义默认值(这个决定是经过精心考虑的),但是我的项目需要显式扩展-我问是否有任何非正式的约定出现(在选择之前一个)。
克里斯·汤金森

据我所知,只有一个。我个人使用html
bigOther

如果存在通用扩展,则开发人员将倾向于在编辑器中实施该扩展,因为这些编辑器中的大多数都是由社区开发的
bigOther 2015年

1
我不在从事Web项目。即使我是html不合适的,也不会再合适,它不能区分带有Jinja的HTML文件和没有Jinja的HTML文件(这是我需要做的)。
克里斯·汤金森

23
我用.jinja2,哈哈。
拉曼·沙

44

Ansible使用.j2扩展名。

我找不到关于该精确点的权威文档,但我们.j2在其文档的许多地方都看到了扩展的出现:

如果您.j2在以下页面中查找,将会发现很多情况:

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

这也是我在其他项目中使用的约定,除了django模板。


7
Sublime Text用户可能会对了解它识别.j2扩展名感兴趣,例如可以检测* .html.j2是HTML jinja模板。很酷。
JimmidyJoo

我使用另一种方式,例如template.j2.html。因此,任何编辑器都可以突出显示该语法,但仍将其标记为模板。
安道尔

12

仅供参考-上面提到的有关Ansible.j2的模板文件约定是正确的,上面提到了Ansible ,只是指出了他们现在提出的“最佳做法” ,其中提到:

模板以 .j2



9

我想在2020年添加一个额外的答案,因为Jinja2项目最近决定将名称中的“ 2”删除……这意味着它现在只是“ Jinja”。

Ansible仍在.j2许多文档中使用,但是作为正式的Jinja模板引擎文档,现在建议.jinja您是否要使用非特定于Jinja的文件扩展名之外的其他文件(请参阅此处的文档,或添加更改时),我认为人们将开始以这种方式移动(并放弃使用.j2.jinja2)。


7

我用.html.jinja2.js.jinja2.css.jinja2等来表示(一)这是一个Jinja2的模板,和(b)将汇编成HTML,JS或CSS文件。我喜欢.j2Ansible中的选择,但是IMO的使用.jinja2使新贡献者更容易猜测正在使用哪种模板语言。

对于Flask用户,因为自动转义很高兴:

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

2

我用.jnj扩展-和语法高亮和vim的片断我只是复制,重命名和调整设置树枝

当我需要在Jinja模板中对html进行一些设置(例如注释,标签平衡,缩进等)时,我还设置了一个函数来与PHP和WordPress一起使用-它可以切换到html并返回到以前的文件类型:

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

并与F12键绑定 nmap <silent> <F12> :call ToggleFileType()<CR>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.