flask学习笔记(九) --代码替换

考虑到模板代码的重用,Jinja2提供了块 (Block)和宏 (Macro)与包含(Include)的功能。下面对三种方法的使用进行介绍。


一、宏(Macro)

模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。使用宏的时候,参数可以为默认值。


既然是函数,就有声明与调用两个部分


1.首先宏的定义

html

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

代码中,宏名就是 input ,后面三个参数和指定的默认值。


2.使用宏

html

<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>

我们可以看到一个输入文本框和一个密码框。


3.宏的导入

一个宏可以被不同的模板使用,所以我们建议将其声明在一个单独的模板文件中。

1. `import "宏文件的路径" as xxx`。

2. `from '宏文件的路径' import 宏的名字 [as xxx]`。

3. 宏文件路径,不要以相对路径去寻找,都要以`templates`作为绝对路径去找。

4. 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用`with context`。示例:`from 'xxx.html' import input with context`。


二、块 (Block)

块功能有些类似于C语言中的宏,原理就是代码替换。在模板继承中,把一些公用的代码单独抽取出来放到一个父模板中。以后子模板直接继承就可以使用了。块 (Block)在模板继承中实现了语句块的替换,相当于父模板提供了一个接口,子模板根据接口实现具体细节部分。


1.在父模板中定义:

{% block block的名字 %}
{% endblock %}



2.通过 {% extends "base.html" %} 来声明继承

{% extends "base.html" %}

3.子模板继承:

{% block block的名字 %}
子模板中的代码
{% endblock %}

子模板中由”{% block block_name %}”和”{% endblock %}”所包括的语句块,将会替换父模板中同样由”{% block block_name %}”和”{% endblock %}”所包括的部分。


三、包含(Include)

其功能就是将另一个模板加载到当前模板中,并直接渲染在当前位置上。它同导入”import”不一样,”import”之后你还需要调用宏来渲染你的内容,”include”是直接将目标模板渲染出来。它同block块继承也不一样,它一次渲染整个模板文件内容,不分块。


方法{% include 'footer.html' %}

footer.html是你要包含的模板文件,等价于把文件里面的全部内容直接替换这个语句。


四、总结

  • 块功能有些类似于C语言中的宏,原理就是代码替换;

  • 宏的功能有些类似于函数,可以传入参数。

  • 包含就是简单的复制粘贴。

参考文章:http://www.bjhee.com/jinja2-block-macro.html

猜你喜欢

转载自blog.csdn.net/feit2417/article/details/80735373