前面总拿小明和小红做例子,他俩都烦了,所以这次咱们开门见山,先思考一个问题:平时我们上淘宝、上知乎,网站是怎么验证身份的呢?

很多小伙伴肯定会大声说:用户名和密码啊!没错,那网页上是如何实现的呢?

很简单,用户输入用户名和密码后,将它们打包发送给服务器,服务器校验后即可登录。为了方便,我们可以用宏(Macro)

一、宏的定义

Jinja2中的宏功能有些类似于传统程序语言中的函数,跟python中的函数类似,可以传递参数,但不能有返回值,有声明和调用两部分。让我们先声明一个宏:

 <!--宏定义-->
{% macro input(name, type='text', value='') -%}<input type="{{type}}" name="{{name}}" value="{{value|e}}">
{%- endmacro %}

上面的代码定义了一个宏,宏定义要加macro,宏定义结束要加endmacro标志。宏的名称就是input,它有3个参数,分别是name、type和value,后两个参数有默认值。调用时用下面这个表达式:

 <p>用户名:{{ input('username') }}</p><p>密  码:{{ input('password', type='password') }}</p>

在工程中templates的文件夹下新建index.html文件,代码如下:

 <!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>宏的定义和使用</title>
</head>
<body>
<!--宏定义-->
{% macro input(name, type='text', value='') -%}<input type="{{type}}" name="{{name}}" value="{{value|e}}">
{%- endmacro %}
<!--宏的使用-->
<div style="color: #0000FF;"><p>用户名:{{ input('username') }}</p><p>密  码:{{ input('password', type='password') }}</p><p>登  录:{{ input('submit', type='submit', value='登录') }}</p>
</div>
</body>
</html>

Python文件中需要引入模板文件,如下:

 from flask import Flask,render_templateapp = Flask(__name__)
@app.route('/')
def macro():return render_template('index.html')if __name__ == "__main__":app.run(debug=True)

在命令行执行文件就可以看到登录界面了:

二、宏的导入

一个宏可以被不同的模板使用,所以可以将其声明在一个单独的模板文件中,需要使用时导入即可。

导入的方法类似于python中的import,在templates文件夹下修改index.html文件,并新建form.html文件存储宏。index.html文件代码如下:

 <!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>宏的定义和使用</title>
</head>
<body>
{% import 'form.html' as form %}
<div style="color: #0000FF;"><p>用户名:{{ form.input('username') }}</p><p>密  码:{{ form.input('password', type='password') }}</p><p>登  录:{{ form.input('submit', type='submit', value='登录') }}</p>
</div>
</body>
</html>

form.html代码如下:

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

上面的代码用于单独存放宏,使用{% import 'form.html' as form %}方法可以将其导入到index.html文件中。Python文件与前面相同,命令行运行后得到相同的结果:

三、include的使用

宏文件不仅可以被引用,还可以引用其他宏。Include语句可以把一个模板引入到另一个模板中,类似于把一个模板模板的代码复制到另外一个模板的指定位置。下面通过一个实例来说明。

在templates文件夹下修改index.html文件,并新建header.html文件和footer.html。index.html文件代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>Title</title><style>.header{width:100%;height:40px;margin:20px 20px;}.footer{width:100%;height:40px;margin:20px 20px;}.content{width:100%;height:40px;margin:20px 20px;}</style>
</head>
<body>
{% include "header.html" %}
<div class="content">这是网页内容!
</div>
{% include "footer.html" %}
</body>
</html>

header.html文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>Title</title>
</head>
<body>
<div class="header">这是网页头部!
</div>
</body>
</html>

footer.html文件内容如下:

 <!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>Title</title>
</head>
<body>
<div class="footer">这是网页尾部!
</div>
</body>
</html>

可以看出,include把一个模板的代码复制到另外一个模板的指定位置,{% include "header.html" %}和{% include "footer.html" %}把头文件和尾文件引入到index.html文件中。

以上就是关于宏功能的应用。此外,细心的小伙伴可能会发现,点击提交按钮并没有什么用,原因是我们只是进行了设计,并没有提交数据功能和验证功能,在今后的学习中将会讲到。

网页中相同的部分很多,反复写相同的代码不仅可能会出错,还浪费时间让程序员无比厌倦,为了让程序整洁一致,下一次我们将介绍模板的继承

python 宏定义_Flask干货:Jinja2模板中的宏定义和使用相关推荐

  1. Flask Jinja2 模板中的变量和过滤器

    Flask Jinja2 模板中的变量和过滤器 Flask 可以在视图函数中返回模板文件,模板引擎默认使用的是 Jinja2 . 通常,返回的 Jinja2 模板文件并不是一个静态的页面,而是同时有静 ...

  2. Flask mysql 模版传参_Flask渲染Jinja2模板和传参

    ### Flask渲染Jinja2模板和传参: 1. 如何渲染模板: * 模板放在`templates`文件夹下 * 从`flask`中导入`render_template`函数. * 在视图函数中, ...

  3. 单片机c语言怎么定义字符串,单片机C语言中变量的定义方法解析

    1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_acc ...

  4. 如何在Python中将数据插入到Word模板中生成一份Word文档

    在一些的项目开发中,会有一些生成Word文件的操作,比如将获取到的一些数据添加到Word模板当中的相应的位置生成一份Word文档. 由于最近的Python项目当中需要将一些从服务器查出的数据添加到Wo ...

  5. python mysqldb安装_Flask干货:访问数据库——Python数据库框架MySQLPython

    图 | 源网络文 | 5号程序员 上一次我们学会了数据库安装,但只是安装好没教大家怎么使用! 嘿,别担心,这不有我呢嘛. 今天就由我给大家介绍介绍框架MySQL-Python. 01 MySQL-Py ...

  6. python flask html模板,python flask web开发实战 Jinja2模板

    templates/index.html Hello World! templates/user.html Hello, {{ name }}! 渲染模板: from flask import Fla ...

  7. 如何在米拓的metinfo的模板中加入自己定义的样式

    在template目录下启用的模板目录里,比如metv7,找到需要添加代码的模板文件,模板文件中的<include file="head.php" />已经包含了met ...

  8. matlab定义字母常数,在matlab中,如何定义函数式子中的未知常数。

    新建一个.m文件,第一行输入下面的格式function [y,m] = abc(x)其中... 定义未知数:syms xx是变量 .syms是定义符号变量.补充:syms是... 这不是解方程,这是曲 ...

  9. Python之 jinja2模板浅析

    目录 前言 1. jinja2介绍 1.1 jinja2的优点 1.2 安装jinja2 2. jinja2语法 2.1 基本语法 2.2 jinja2变量 2.3 jinja2中的过滤器 3. ji ...

  10. Flask后端笔记(三)Jinja2模板、过滤器、表单、宏、模板继承、包含

    Flask后端笔记 Jinja2模板 基本流程 变量 过滤器 字符串过滤器 支持链式使用过滤器 列表过滤器 自定义过滤器 表单 不使用Flask-WTF扩展时,表单需要自己处理 使用Flask-WTF ...

最新文章

  1. 最长不下降子序列(推广问题)
  2. Python3学习笔记——类
  3. 基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数
  4. Debug Tensorflow: yolo模型检测框位置正确但类别不正确
  5. mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
  6. c++ 图的连通分量是什么_学习数据结构第五章:图(图的遍历操作)
  7. html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
  8. 检查两个列表在Java中是否相等
  9. VUE学习和开发中的注意点总结(一),便于回顾(不断完善补充。)
  10. 利用jquery.validate异步验证用户名是否存在
  11. nodejs中md5加密模块
  12. bugzilla发送邮件慢的问题
  13. plcst语言编程教程_st语言编程实例讲解
  14. 巴厘岛最全的美食攻略
  15. CERT_HAS_EXPIRED
  16. 企业微信第三方应用添加好友
  17. 做饭真的很简单!做饭扫盲贴!
  18. C语言基础--决策与判断
  19. 阿里技术专家花3年写的《MySQL笔记》解决了70%数据库面试难题,网友:非常棒!
  20. eve-ng模拟器安装在部署使用

热门文章

  1. django使用ajax传输数据
  2. Android StickHeaderRecyclerView - 让recyclerview头部固定
  3. Shell脚本 小程序演示
  4. JQuery中ajax用法
  5. 了解protected 以及公用、私有和受保护的继承
  6. android控件布局
  7. C#抓取网页数据、分析并且去除HTML标签(转载)
  8. spring源码 第二个后置处理器方法的使用-推断构造函数
  9. mysql大数据量的分页查询优化
  10. Guava学习笔记之Maps(1):Maps.uniqueIndex(Iterable, Function)