flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含

宏的概念

类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。

Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复。

简单定义宏的方法以及调用

1.定义一个 input()的宏

{% macro input() %}

{% endmacro %}

2.在模板中调用input()宏

{{ input() }}

这样的宏没有参数的传入,下面再来看看如何设置带参数的宏。

定义带参数的宏以及调用

1.定义带参数的宏

{% macro input(name,value='',type='text',size=20) %}

{% endmacro %}

2.调用宏,并传递参数

{{ input(value='name',type='password',size=40)}}

编写上面两个宏的完整示例

1.编写macro_ex.html模板文件

Title

无参数的宏

{% macro input1() %}

{% endmacro %}

{{ input1() }}

设置带参数的宏

{% macro input2(name,value='',type='text',size=20) %}

{% endmacro %}

{{ input2(value='name',type='password',size=40) }}

2.编写一个视图函数

from flask import Flask, render_template

app = Flask(__name__)

app.config["SECRET_KEY"] = "xhosd6f982yfhowefy29f"

@app.route("/macro_ex", methods=["GET", "POST"])

def macro_ex():

return render_template("macro_ex.html")

if __name__ == '__main__':

app.run(debug=True)

3.访问视图查看效果访问 http://127.0.0.1:5000/macro_ex

0010bdf8d4730dae1f1fa1610b909fe9.png

可以看到只需要调用模板的宏就可以直接创建一个input,如果宏的html比较复杂,那么就可以更加方便,减少html的编写。

下面还有更加方便的做法。

在python中的公共类方法可以写到一个公共工具类中,后续方便其他地方调用。而模板宏也可以有同样的做法。

可以将模板宏都写到一个html文件中,然后通过模板继承的方式提供调用,下面来看看怎么操作。

把宏单独抽取出来,封装成html文件,其它模板中导入使用

创建文件名可以自定义macro.html

{% macro login_form() %}

{% endmacro %}

在其它模板文件中先导入,再调用

{% import 'macro.html' as macro_import %}

{{ macro_import.login_form() }}

完整示例如下:1.创建macro.html文件

27fb8035ef708e2b1b49402998a4fd38.png

2.编写另一个html文件macro_ex.html,用来导入模板宏以及调用

11aacaa32c4d934e99a64071572e43dc.png

可以看到有了宏的使用,已经很方便避免重复编写的html内容。下面再来介绍Django模板也有的继承功能。

模板继承

模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

{% block top %}{% endblock %}标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。

子模板使用extends指令声明这个模板继承自哪?父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()。

父模板:base.html

{% block top %}

顶部菜单

{% endblock top %}

{% block content %}

{% endblock content %}

{% block bottom %}

底部

{% endblock bottom %}

子模板:children.html

{% extends 'base.html' %}

{% block content %}

需要填充的内容

{% endblock content %}

模板继承使用时注意点:

不支持多继承。

为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。

不能在一个模板文件中定义多个相同名字的block标签。

当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。

包含(Include)

Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含(Include)。它的功能是将另一个模板整个加载到当前模板中,并直接渲染。

include的使用示例:

{% include 'index.html' %}

{% include 'index.html' %}

包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上ignore missing关键字。如果包含的模板文件不存在,会忽略这条include语句。

注意:include可以多次使用,也就是可以多次加载模板内容到当前模板中。

include的使用加上关键字ignore missing

设置include一个不存在的模板,如下:

{% include 'hello.html' %}

上面说到,如果包含的模板文件不存在,则会抛出异常TemplateNotFound,如下:

b8a2bd4538f2a1ccbd0d086fe9b10a87.png

如果想要避免报错,可以增加关键字ignore missing,如下:

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

再次访问页面则不会报错了,直接显示空白而已,如下:

f669b7e4dc53334e018c36b8cfbaa1fe.png

总结:宏、继承、包含

宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。

继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。

宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。

包含(include)是直接将目标模板文件整个渲染出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值