Flask开发(七)Jinja2模板 宏的定义及使用

内容纲要

本篇导读:

  • 宏的定义
  • 宏的导入
  • include的使用

Jinja2中的宏功能有些类似于传统编程语言中的函数,他跟Python中的函数类似,可以传递参数,但是不能有返回值,可以将一些常用的代码片段放到宏中,然后把一些不固定的值抽取出来作为一个变量。

宏的定义

宏(MACRO),有声明和调用两个部分。让我们声明一个宏:

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

上面代码定义了一个宏,定义宏要加macro,红顶已结束要加endmcro标志,宏的名称就是input,他有三个参数,后两个参数有默认值,我们可以使用表达式来调用这个宏:

{{ input('username') }}
{{ input('passwd',type='password') }}

下面一个示例使用宏实现了一个简单的登录页面,将index.html代码修改如下:

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

执行网页后,生成的对应代码如下:

<p>用户名:<input type="text" name="username" value=" "></p>
<p>密码:<input type="password" name="passwd" value=" "></p>
<p>登录:<input type="submit" name="submit" value="登录"></p>

app.py中的代码如下:

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

运行程序,使用浏览器访问http://127.0.0.1:5000/,结果如下:

宏的导入

一个宏可以被不同的模板使用,所以我们建议将其声明在一个单独的模板文件中。需要使用时导入即可,而导入的方法类似于Python中的import。下面我们把刚才的宏定义部分单独放在一个文件中。

在templates文件夹中创建文件form.html。

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

将index.html中的代码修改如下:

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

app.py文件中的代码不变,运行效果和上面一样。

include的使用

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

在templates中创建header.html、footer.html。

index.html中的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .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>

app.py文件内容如下:

from flask import Flask,render_template

app = Flask(__name__)


@app.route('/')
def hello_world():
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

运行效果如下:

阅读剩余
THE END