Jinja2特有的,像Django则没有这个。

先新建一个项目macroDemo

然后在templates文件夹中新建index.html文件,并在代码中返回渲染后的文件:

然后回到index.html,现在假设我们要写一个登录的表单:

代码:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td><input type="text" placeholder="请输入账号"></td>
           </tr>
           <tr>
               <td>密码</td>
               <td><input type="password" placeholder="请输入密码"></td>
           </tr>
           <tr>
               <td></td>
               <td><input type="submit" value="提交"></td>
           </tr>
       </tbody>
   </table>
</body>
</html>

执行app.py文件,看到:

看一下刚才写的index.html文件,每个标签都传了如typeplaceholder等属性,那么我们可不可以把相同的内容提取出来呢?答案当然是可以,这时候就要用到宏的概念。

  • 定义宏

{% macro 名称() %}
   代码块
{% endmacro %}
  • 调用

{{ 宏名称() }}
  • 代码

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
   {% macro input() %}
       <input type="text">
   {% endmacro %}
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td>{{ input() }}</td>
           </tr>
           <tr>
               <td>密码</td>
               <td>{{ input() }}</td>
           </tr>
           <tr>
               <td></td>
               <td>{{ input() }}</td>
           </tr>
       </tbody>
   </table>
</body>
</html>

保存一下,刷新页面看到:

也就是说代码已经生效了。其实可以把宏的名称()看成一个函数。
但是现在input标签中还有typeplaceholder等属性,这个时候就需要给input()传参数了:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
   {% macro input(type, name, placeholder, value) %}
       <input type="{{ type }}", name="{{ name }}", placeholder="{{ placeholder }}", value="{{ value }}">
   {% endmacro %}
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td>{{ input("text", "", "请输入账号", "") }}</td>
           </tr>
           <tr>
               <td>密码</td>
               <td>{{ input("text", "", "请输入密码", "") }}</td>
           </tr>
           <tr>
               <td></td>
               <td>{{ input("submit", "", "", "提交") }}</td>
           </tr>
       </tbody>
   </table>
</body>
</html>

保存,然后看到页面:

当然,下面在传值的时候也可以用关键字参数进行传递,比如

{{ input(type="submit", name="", placeholder="", value="提交") }}

效果是一样的。

如果属性有默认值,那么也可以添加默认值:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
   {% macro input(type='text', name='', placeholder='', value='') %}
       <input type="{{ type }}", name="{{ name }}", placeholder="{{ placeholder }}", value="{{ value }}">
   {% endmacro %}
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td>{{ input(placeholder="请输入账号") }}</td>
           </tr>
           <tr>
               <td>密码</td>
               <td>{{ input(placeholder="请输入密码") }}</td>
           </tr>
           <tr>
               <td></td>
               <td>{{ input(type="submit", value="提交") }}</td>
           </tr>
       </tbody>
   </table>
</body>
</html>

需要注意的是如果给了默认值,那么传参的时候就必须用关键字参数进行传值了。

也可以将宏封装成一个包的形式,在需要使用的时候通过导入进行调用:

我们在template文件夹下新建文件夹macros专门存放宏文件,并在该文件夹中新建forms.html文件。将宏的定义从index.html文件中剪切出来,放到forms.html文件中:

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

然后在index.html中只需要导入宏文件即可。导入方法:{% import 'macros/forms.html' as forms %}
注意,这里后面必须要as,也就是必须给导入的文件起个名字。

代码:

{% import 'macros/forms.html' as forms %}
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td>{{ forms.input(placeholder="请输入账号") }}</td>
           </tr>
           <tr>
               <td>密码</td>
               <td>{{ forms.input(placeholder="请输入密码") }}</td>
           </tr>
           <tr>
               <td></td>
               <td>{{ forms.input(type="submit", value="提交") }}</td>
           </tr>
       </tbody>
   </table>
</body>
</html>

保存以后回到页面,可以看到效果不变。

现在forms.html文件中只有一个宏定义,如果是多个的时候,比如把froms.html改为:

{% macro input(type='text', name='', placeholder='', value='') %}
   <input type="{{ type }}", name="{{ name }}", placeholder="{{ placeholder }}", value="{{ value }}">
{% endmacro %} {% macro textarea(name="", cols="", rows="") %}
       <textarea name="{{ name }}", cols="{{ cols }}", rows="{{ rows }}"></textarea>
{% endmacro %}

这时候在index.html导入就要用:
{% from 'macros/forms.html' import input %}
或者
{% from 'macros/forms.html' import input as input_field%}

代码:

{% from 'macros/forms.html' import input %}

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>宏</title>
</head>
<body>
   <table>
       <tbody>
           <tr>
               <td>账号</td>
               <td>{{ input(placeholder="请输入账号") }}</td>
           </tr>
           <tr>
               <td>密码</td>
               <td>{{ input(placeholder="请输入密码") }}</td>
           </tr>
           <tr>
               <td></td>
               <td>{{ input(type="submit", value="提交") }}</td>
           </tr>
       </tbody>
   </table>
</body>
</html>

执行以后页面显示效果不变。如果现在要把两个宏都导入,那就只需要:

{% from 'macros/forms.html' import input, textarea %}
或者
{% from 'macros/forms.html' import input as input_field, textarea%}

如果用下面这种方式,就要把input as input_field看做一个整体。

 

获取最新内容请关注公众号:自动化测试实战

flask第30篇——宏macro和import标签的更多相关文章

  1. Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】

    宏 对宏(macro)的理解: 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用 需要在多处重 ...

  2. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  3. flask 第四篇 模板语言jinja2

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  4. Flask jinja2 全局函数,宏

    内置全局函数 dict()函数,方便生成字典型变量 {% set user = dict(name='Mike',age=15) %} <p>{{ user | tojson | safe ...

  5. Flask之模板之宏、继承、包含

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

  6. [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]

    [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...

  7. C语言的宏macro的使用

    C's Macro Introduction 1.The Connect Macros: ## 这是一个预处理连接符,这个操作符主要用来将两个符号连接成为一个完整的宏符号.通过下面的代码,可以看到其具 ...

  8. Templates中的macro和include标签

    1.macro标签 1.作用:相当于在模板中声名函数 2.使用方法: 语法:{% macro 名称(参数列表) %} xxx {% endmacro %} 创建 macro.html 模板文件   - ...

  9. FreeMarker中<#include>和<#import>标签的区别

    在使用freemarker作为前端页面模板的应用中,会有很多的freemarker模板页面,这些ftl会在不同的页面中重复使用,一是为了简化布局的管理,二是可以重复使用一些代码. 在freemarke ...

随机推荐

  1. 笔试题目练习-python

    以下内容包含笔试练习库的题目和代码,题目来自牛客网,仅供参考. # coding = utf-8 import sys def test1(): """ 题目描述:计算字 ...

  2. php程序突然不能用file_get_contents()访问远程网址了?

    php程序用file_get_contents("http://www.***.com"),一直以来好好的,突然间就不能链接远程网址了,在shell下可以ping通远程网址,可是用 ...

  3. codeforces 536a//Tavas and Karafs// Codeforces Round #299(Div. 1)

    题意:一个等差数列,首项为a,公差为b,无限长.操作cz是区间里选择最多m个不同的非0元素减1,最多操作t次,现给出区间左端ll,在t次操作能使区间全为0的情况下,问右端最大为多少. 这么一个简单题吞 ...

  4. python-day30--粘包

    一. 什么是粘包 1.须知:只有TCP有粘包现象,UDP永远不会粘包 2.所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的. 二.两种情况下会发生粘包. 1. ...

  5. Eureka服务注册过程详解之IpAddress(详解eureka.instance.prefer-ip-address = true 与 eureka.instance.prefer-ip-address)

    分析,eureka.instance.prefer-ip-address 本节解释为什么配置eureka.instance.prefer-ip-address = true时,注册到Eureka Se ...

  6. html5- 摘自网友dudu

    HTML5中新增了<canvas>画布标签,通过它,可以使用JavaScript在网页中绘制图像.<canvas>标签在网页中得到的是一个矩形空白区域,可以通过width和he ...

  7. 在Ubuntu系统下设置永久性Swap交换空间(转帖)

    http://blog.sina.com.cn/s/blog_6e4388910100tsk7.html swap 一般都在一个专有的swap区里,这可能是因为在安装的时候系统会提示你创建一个swap ...

  8. python中异常处理--raise的使用

    https://www.cnblogs.com/zhangyin6985/p/7229553.html 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了rai ...

  9. forget word out a~2

        1● an 不,非,无   2● amphi     两个,两种     3● ad 做,加强:  

  10. 快速切题 cf118A

    这教导人们一定要看题,要看题,元音包含了‘y’,完毕,要看题啊 #include <cstring> #include <cstdio> #include <cctype ...