在生产环节下,咱们要把后端程序(其实就是python)计算出来的数据和html页面结合起来作,这个时候模版就派上大用处了。css
Jinja是日本寺庙的意思,而且寺庙的英文temple和template发音类似。JinaJa是Flask默认的仿DJango模版的一个模版引擎,由Flask做者开发。它速度快,被普遍使用,而且提供了可选的沙箱模版来保证执行环境的安全。它有以下优势:html
默认安装Flask 的时候也会把Jinja2给安装上。若是没有安装能够单独安装下。python
[root@localhost FlaskPratcie]# pip list |grep Jinja2 # 检查是否安装 [root@localhost FlaskPratcie]# pip install Jinja2 # 没有安装就给安装下
咱们看看最简单模版用法,这个jinja2语法也是适用于Django.shell
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul id="navigation'"> {% for item in items %} <li><a href="{ item.href}"> {{ item.caption }}</a></li> {% endfor %} </ul> <h1>{{ title | trim }}</h1> </body> </html>
语法解释:编程
合理使用模版继承,让模版重复使用,可以提升工做效率和代码质量。flask
<!DOCTYPE html> <html lang="en"> <head> {% block head %} <meta charset="UTF-8"> <title>Title</title> {% endblock %} </head> <body> <div> {% block content %} <ul id="navigation'"> heheh </ul> {% endblock %} </div> <div> {% block footer %} {% endblock %} </div> </body> </html>
咱们再看看子模版的内容:后端
{% extends 'simple.html' %} {% block title %} index {% endblock %} {% block head %} {{ super() }} <style type="text/css"> .import { color: #000;} </style> {% endblock %}
语法解释:安全
{% extends 'simple.html' %} {% block title %} index {% endblock %} <h1>{{ self.title() }}</h1> # 再次使用title这个块
宏相似于常规编程语言中的函数,它用于把平常行为抽象成可重复用的函数编程语言
from jinja2 import Template print Template(''' {% macro hello(name)%} HEllo {{ name }} {% endmacro %} <p> {{ hello('ljf') }}</p> ''').render()
经过set为变量赋值。函数
from jinja2 import Template print Template(''' {% set a = 1 %} {% set b,c = range(2) %} <p> {{a }} {{ b }} {{ c }} </p> ''').render()
include 语句包含一个模版,渲染的时候会在include语句对应位置添加被包含的模块内容。
{% include 'header.html' %} html_body {% include 'footer.html' %}
include同时还支持“ignore missing”,若是模版不存在,Jinja会忽略这条语句:
{% include 'header.html' ignore missing %}
Jinja 支持不一样的模版中导入宏并使用,与Python中import语句相似。有两种方式来导入模版,能够把整个模版导入到一个变量(import xx)或者从其中导入特定的宏(from xxx import xxx。
咱们如今写一个宏模版,文件名为hong1.html:
{% macro hello(name) %} hello {{ name }} {% endmacro %} {% macro strftime(time,fmt='%Y-%m-%d %H:%M:%S') %} {{ time.strftime(fmt) }} {% endmacro %}
咱们在写一个文件,这个文件名为hello_macro.html,咱们这个hello_macro.html里面导入hong1.html,注意,两个文件在同一个目录下面。代码以下:
{% import 'hong1.html' as macro %} {% from 'hong1.html' import hello as _hello,strftime %} </p>{{ macro.hello('Leo') }}</p> </p>{{ strftime(time) }}</p>
写完以后,咱们在写一个py文件,内容以下:
from jinja2 import FileSystemLoader,Environment from datetime import datetime loader = FileSystemLoader('/root/PycharmProjects/FlaskPratcie/templates/chapter3/section1/') # 这个是导入hello_macro.html所在的父目录便可 template = Environment(loader=loader).get_template('hello_macro.html') print(template.render(time=datetime.now()))
写完后执行py文件,打印的信息以下:
</p> hello Leo </p> </p> 2017-04-19 23:34:28 </p>
打印出来的结果若是你的和我同样,说明宏已经可以正确导入了。