flask的模板引擎Jinja2介绍2

类似python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。
Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复。

定义:
{% macro 名称(参数)%}
{% end macro %}

代码举例:定义一个渲染输入框的宏 ,定义到xx.py文件中

{% macro inputshow(name, value='', type='text', size=30) %}
    <input type="{{type}}" name="{{name}}" value="{{value}}" size="{{size}}">
{% endmacro %}

调用的页面要先引入这个宏的定义:

{% from "includes/xx.html" import inputshow%}

使用:

{{ inputshow('psw', value='***', type='password', size=50)}}

模板继承

模板继承包含基本模板和子模板。其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充。
如基本模板layout.html为:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>标题</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/css/style.css">
    <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </head>
  <body>
    {% include 'includes/_navbar.html' %}
    <div class="container">
      {% include 'includes/_messages.html' %}
      #这里预留了子模板的内容
      {% block body %}{% endblock %}
    </div>
    {% include 'includes/_footer.html' %}
  </body>
</html>

其中的:

{% block body %}{% endblock %}

预留了子模板的位置 ,一般是具体的业务模块可以添加进去。
比如说:新增页面的代码如下:

{% extends 'layout.html' %}

{% block body %}
  <h1>添加h1>
  <form method="POST" action="">
    xxx
  form>
{% endblock %}

首先要继承layout.html
block body和endblock 之间的代码就是填充的代码。
可以看出继承常常用于上下部分不做修改的网页,比如说很多网页,只有中间部分是业务数据会变化,顶部、底部的内容都不会有太多变化。

包含

将一个模板加载到另一个模板里面。比如说页面的页头、页尾。
语法:

{% include ‘xxx.html’ %}

示例:
页面的页脚,每个页面都需要,代码类似如下:

<footer class="page-footer font-small blue" style="margin-top: 50px">
  
  <div class="footer-copyright text-center py-3">
      Copyright ©2007-2019 <a href="http://www.xxx.com">xxx科技有限公司a>
      All Rights Reserved xxx
  div>
  
footer>

这样的一个代码,不需要每个页面都写,我们定义成单独的文件:_footer.html文件,并把他放到includes目录
在其它的页面中引入这个文件即可:

{% include 'includes/_footer.html' %}

这样,页脚发生了改变,只需要改一个文件即可。
JSP中也有一样的语法。

总结:

  1. 宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
  2. 继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
  3. 宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
  4. 包含(include)是直接将目标模板文件整个渲染出来。

你可能感兴趣的:(flask,python,后端)