5 JInja2模版(适用于Django和Flask)

模版

在生产环节下,咱们要把后端程序(其实就是python)计算出来的数据和html页面结合起来作,这个时候模版就派上大用处了。css

Flask下的模版---Jinja2

Jinja是日本寺庙的意思,而且寺庙的英文temple和template发音类似。JinaJa是Flask默认的仿DJango模版的一个模版引擎,由Flask做者开发。它速度快,被普遍使用,而且提供了可选的沙箱模版来保证执行环境的安全。它有以下优势:html

  • 让HTML设计者和后端Python开发工做分离
  • 减小使用python的复杂度,页面逻辑应该独立于业务逻辑,这样才能开发出易于维护的程序。
  • 模版很是灵活、快速和安全,对设计者和开发者会更友好
  • 提供了控制语句、继承等高级功能,减小开发的复杂度。

默认安装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>

语法解释:编程

  • {# ... #} 模版注释,他不会出如今渲染的页面里
  • {% ... %} 用于执行诸如for循环或者赋值的语句
  • {{ ... }} 用于把表达式的结果输出到模版上
  • for 循环必须像shell脚步同样,有结束标签,这里的就是{% for x in y %} .... {% endfor %}
  • 获取变量的值,咱们有两种方式获取:
  1. {{ item.href }}
  2. {{ item['href'] }}
  • {{ title | trim }} trim是一个过滤器,在模版中经过管道符号(|)把变量和过滤器分开。咱们也能够经过多个过滤器,如{{ title|trim|striptags }} 等。striptags也是一个过滤器,Jinja2内部提供了很是多的过滤器,点我查看其它过滤器

模版继承

合理使用模版继承,让模版重复使用,可以提升工做效率和代码质量。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>
  • {% block xxx%} ..... {% endblock %} 是一个代码块,能够在子模版里面重写这个代码块里面的内容,就等于python里面的子类继承父类后,能够重写一个和父类某个方法同名的方法来覆盖掉父类的某一个方法。
子模版

咱们再看看子模版的内容:后端

{% extends 'simple.html' %}
{% block title %} index {% endblock %}
{% block head %}
    {{ super() }}
    <style type="text/css">
        .import {
            color: #000;}
    </style>
{% endblock %}

语法解释:安全

  • {% extends 'xxx' %} 表示继承这个母版,xxx是这个母版的文件名
  • super() 方法表示先使用母版里面的base.html的head块的内容,在这基础之上添加css样式
  • 若是你想用屡次使用一个块,可使用特殊“self” 变量并调用与块同名的函数,以下所示
{% 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()
  • macro 这个等同于python里面的def,shell里面的function ,js里面的function同样,定义一个方法罢了

赋值

经过set为变量赋值。函数

from jinja2 import Template
print Template('''
 {% set a = 1 %}
 {% set b,c = range(2) %}
 <p> {{a }} {{ b }} {{ c }} </p>
''').render()

include

include 语句包含一个模版,渲染的时候会在include语句对应位置添加被包含的模块内容。

{% include 'header.html' %}
    html_body
{% include 'footer.html' %}

include同时还支持“ignore missing”,若是模版不存在,Jinja会忽略这条语句:

{% include 'header.html' ignore missing %}

import

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>

打印出来的结果若是你的和我同样,说明宏已经可以正确导入了。

相关文章
相关标签/搜索