其实我们在入门系列第三篇中已经介绍了模板,包括如何渲染模板,表达式和控制语句,模板继承,还有HTML转义。我们也知道了Flask模板是基于Jinja2实现的。其实Jinja2的模板功能远不止这些,想了想,还是决定在进阶系列中,更深入地介绍Jinja2模板引擎。

系列文章

  1. Flask进阶系列(一)-上下文环境
  2. Flask进阶系列(二)-信号
  3. Flask进阶系列(三)-Jinja2模板引擎
  4. Flask进阶系列(四)-视图
  5. Flask进阶系列(五)-文件和流
  6. Flask进阶系列(六)-蓝图(Blueprint)
  7. Flask进阶系列(七)-应用最佳实践
  8. Flask进阶系列(八)-部署和分发
  9. Flask进阶系列(九)-测试

Jinja2模板引擎同Flask一样,都是由一个叫Pocoo的组织维护着的,该组织另外几个有名的项目是WerkzeugSphinx。Werkzeug是Python的WSGI规范的函数库,也是Flask的基础库之一。如果朋友们看过Flask源码的话,会发现其实Flask本身代码没多少,正如其所标榜的,就是一个非常轻量级的Web框架。Flask很多实用的功能都是依赖Werkzeug和Jinja2实现的。Sphinx是Python的文档生成工具,用其写文档语法很类似于Markdown,Flask官网的文档就是由Sphinx生成的。

讲了那么多不相关的,我们还是回到Jinja2上。从Flask源码上看,其只指明对”.html”, “.htm”, “.xml”, “.xhtml”这四种类型的文件开启HTML格式自动转义。所以,我们定义模板文件时最好选这些后缀名,个人建议就使用”.html”文件。另外,Flask只选择加载了2个Jinja扩展,jinja2.ext.autoescapejinja2.ext.with_,其他扩展功能则无法使用,我们回头会介绍如何对Flask应用添加Jinja2的扩展。你可以通过app.jinja_env(这里的app就是你的Flask应用对象)来访问Jinja2的对象。不过我们不建议这么做,Flask开放了下面几个方法和装饰器来让应用开发者扩充Jinja2的功能:

函数 装饰器 作用
add_template_filter template_filter 自定义过滤器
add_template_test template_test 自定义测试器
add_template_global template_global 自定义全局函数

本来计划在一篇文章里介绍Jinja2模板引擎在Flask里的使用,结果发现内容太多了,还是决定写一个系列(系列中套系列,汗…),读者看起来也轻松点。这里就列个大纲:

另外,毕竟再怎么详细介绍,也无法比官网更全,所以还是那句老话,想再深入了解Jinja2的朋友们,可以参阅官方文档源代码