【问题标题】:Is there an idiomatic file extension for Jinja templates?Jinja 模板是否有惯用的文件扩展名?
【发布时间】:2015-06-17 21:55:56
【问题描述】:

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

根据Jinja documentation:

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

但是当需要显式扩展时我应该使用什么? .py 具有误导性,包括“jinja”和“extension”在内的任何搜索都会被围绕 Jinja Extensions 的讨论严重洗掉。

我可以轻松地制定一个项目范围的约定(想到.jnj 或.ja),但这是针对开源的,所以如果某处已经建立了实践,我不想逆潮流而动。


编辑 1: 同样,我知道 Jinja 项目 - 故意 - 没有定义默认文件扩展名。我想问是否有任何非官方约定出现在出于某些特定项目原因需要的情况下。


编辑 2: 澄清:这不适用于 HTML 内容。

【问题讨论】:

  • 对于在 HTML 上下文中搜索时发现此问题的其他人的旁注:需要注意的一件事是文件扩展名对 HTML 自动转义有影响。如果您正在加载宏以在 HTML 模板中使用,{% import "whatever.html" as foo %} 将毫无意外地发挥作用,而 {% import "whatever.jinja" as foo %} 将导致自动转义,如 > 变为 >。我怀疑这是为什么很多 Django 和 Flask 用户最终使用 .html 的部分原因。
  • @mirth23 你能详细说明一下吗?我工作得很好。 HTML 表单宏作为工作 HTML 添加到模板中,尽管我使用 .html.j2 作为它们的扩展。

标签: python templates file-extension jinja2


【解决方案1】:

Ansible 使用 .j2 扩展名。

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

如果您在以下页面中查找.j2,您会看到很多出现:

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

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

【讨论】:

  • Sublime Text 用户可能有兴趣了解它识别 .j2 扩展名,并且可以检测 *.html.j2 是一个 HTML jinja 模板。很酷。
  • 我使用相反的方式,如 template.j2.html。因此,它可以是任何编辑器突出显示的语法,但仍将其标记为模板。
【解决方案2】:

2021 年更新::Jinja 现在正式推荐使用扩展名.jinja。检查docs


更新: 自从我写下这个答案后,情况发生了变化,.jinja2 和 .j2 正在流行。


Jinja Authors 没有定义默认扩展名。大多数 Jinja 模板编辑器,如 Vim extension、TextMate extension、Emacs extension 和 PyCharm 都没有提到强制 Jinja 突出显示的默认扩展名。

Django 已经 a similar debate 关于设置默认扩展,并以 wontfix 问题结束。我引用结束语:

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

我建议你应该使用自己的,因为没有通用的。

【讨论】:

  • 你是对的,我知道他们没有定义默认值(并且这个决定是经过深思熟虑的)但是我的项目需要一个明确的扩展 - 我问是否有任何非官方的已经出现的约定(在简单地任意选择之前)。
  • 据我所知,有一个。就个人而言,我使用html。
  • 如果有一个通用的扩展,开发者会倾向于在编辑器中实现它,因为这些编辑器大部分是由社区开发的
  • 我没有从事网络项目。即使我是,html 也不合适,它不区分 HTML 文件 with Jinja 和一个 without (这是我需要做)。
  • 我用.jinja2,哈哈。
【解决方案3】:

IntelliJ 的 PyCharm 使用 .jinja2 作为识别 Jinja2 模板的模式。出于这个原因,我使用相同的(并建议其他人也这样做)

【讨论】:

【解决方案4】:

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

Ansible 在很多文档中仍然使用.j2,但是如果您想使用非 Jinja 特定的文件扩展名以外的其他东西(请参阅docs here,或when the change was added),我认为人们会开始朝那个方向发展(并放弃使用.j2 或.jinja2)。

【讨论】:

    【解决方案5】:

    仅供参考 - Johnride 上面提到了 Ansible 使用 .j2 作为模板文件的约定,这是正确的,只是指出他们 have now put out 记录的“最佳实践”,其中提到:

    模板以.j2结尾

    【讨论】:

      【解决方案6】:

      我使用.html.jinja2、.js.jinja2、.css.jinja2 等表示 (a) 它是 Jinja2 模板,并且 (b) 将编译成 HTML、JS 或 CSS 文件。我喜欢 Ansible 中的 .j2 选项,但使用 .jinja2 的 IMO 使新贡献者更容易猜测正在使用什么模板语言。

      对于 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
      

      【讨论】:

        【解决方案7】:

        我使用 .jnj 扩展名 - 对于语法高亮和 vim 中的 sn-ps,我刚刚复制、重命名和调整了 twig 的设置。

        当我需要在 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
        

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

        【讨论】:

          【解决方案8】:

          正如官方网页上提到的,文件扩展名无关紧要,但对于语法高亮,一些 IDE 可以使用.jinja。 最新的 Jinja 3.0 版本也是如此。

          模板文件扩展名如上所述,任何文件都可以作为 模板,无论文件扩展名如何。添加 .jinja 扩展, 像 user.html.jinja 可能会使某些 IDE 或编辑器更容易 插件,但不是必需的。后面介绍的自动转义,可以 基于文件扩展名应用,所以你需要采取额外的 在这种情况下考虑后缀。

          识别模板的另一个很好的启发式方法是它们位于 模板文件夹,无论扩展名如何。这是一个常见的布局 项目。

          您可以在这里查看最新版本:https://jinja.palletsprojects.com/en/3.0.x/templates/

          【讨论】:

            猜你喜欢
            • 2015-11-24
            • 2013-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            相关资源
            最近更新 更多