flask第30篇——宏macro和import标签

摘要:
宏是Jinja2特有的,像Django则没有这个。定义宏{%macro名称()%}代码块{%endmacro%}调用{{宏名称()}}代码宏{%macroinput%}{%endmacro%}账号{{input}}密码{{input}}{{input}}需要注意的是如果给了默认值,那么传参的时候就必须用关键字参数进行传值了。也可以将宏封装成一个包的形式,在需要使用的时候通过导入进行调用:我们在template文件夹下新建文件夹macros专门存放宏文件,并在该文件夹中新建forms.html文件。将宏的定义从index.html文件中剪切出来,放到forms.html文件中:{%macroinput(type=

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

先新建一个项目macroDemo

flask第30篇——宏macro和import标签第1张

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

flask第30篇——宏macro和import标签第2张

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

flask第30篇——宏macro和import标签第3张

代码:

<!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文件,看到:

flask第30篇——宏macro和import标签第4张

flask第30篇——宏macro和import标签第5张

看一下刚才写的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>

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

flask第30篇——宏macro和import标签第6张

也就是说代码已经生效了。其实可以把宏的名称()看成一个函数。
但是现在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>

保存,然后看到页面:

flask第30篇——宏macro和import标签第7张

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

{{ 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>

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

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

flask第30篇——宏macro和import标签第8张

我们在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标签》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android-监听网络状态动态sql语句 入参中存在 数组 或 List下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

avue elementui 常用操作

1.获取表格checkbox的行的数据,绑定事件selection-change,回调返回值为:devicesGridData,和下面代码对应 <el-table :data="devicesGridData" ref="multipleTable" @selection-change="handleSelectionChange" :row-...

在Ubuntu下部署Flask项目

FlaskDemo 命名为test.py # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "test" if __name__ == '__main__': app.debug = True...

HTML 表单常用的代码元素

表单: 将数据通过浏览器提交到服务器的媒介。<form action="" method="get/post" ></form> get 提交有长度限制 post 提交无长度限制 一般常用post  表单元素:12个 1.文本类1).<input type="text" value=""> - 文本框 在文本框中输入...

页面导出为PDF文件时为每页增加页眉

接上篇文章,https://www.cnblogs.com/boytnt/p/11711439.html,继续探索如何给每页加页眉,其实思想很简单,比如页眉上想添加logo,那就在jspdf创建每页时多加个图片上去就好了。 先上效果图,借华为LOGO一用: 再放代码,主体还是上篇文章的分页导出算法: 1 <!DOCTYPE html> 2...

SQL基础(五):SQL函数

一、SQL Aggregate 函数:   SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。 1、AVG() 函数   AVG() 函数返回数值列的平均值。   语法:SELECT AVG(column_name) FROM table_name //从 "access_log" 表的 "count" 列获取平均值: SELECT...

BaseController 的使用

为了提现代码的高可用性,我们可以常见的把dao层进行抽取,service ,但是很少看见有controller的抽取,其实dao层也是可以被抽取的。 首先我们定义一个BaseController接口 package com.zhan.common.controller.base; import com.zhan.common.domain.base....