1 模板包含include

主体结构(导入整个模板,直接渲染不可修改)

{% include('模板名称') %}

{% include('目录/模板名称') %}

功能: 其功能就是将另一个模板加载到当前模板中,并直接渲染在当前位置上,而且是一次渲染整个模块内容

#导入头部header.html
{% include 'header.html' %}
主体内容
#导入底部footer.html
{% include 'footer.html' %} #忽略模板文件不存在时的错误
{% include 'footer.html' ignore missing %} #也可以组成模板列表,会按照顺序依次加载
{% include ['footer.html','bottom.html','end.html'] ignore missing %}

注意:当include模板文件不存在时,程序会抛出异常,加上ignore missing关键字可以忽略不存在时的异常.

2 宏(macro)

**概念 **: Jinja2中宏的功能类似python中函数定义,分为声明与调用两个部分

(1) 宏的定义

主体结构

{% macro 宏的名称([参数...s]) %}

​ 宏的主体

{% endmacro %}

宏的调用

{{ 宏的名称[参数列表] }}

(2) 宏的实例1

templates/common/formmacro.html

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

先导入后调用

{% import 'common/formmacro.html' as formmacro %}
<form action=''>
<p>用户名:{{ formmacro.input(name='uername') }}</p>
<p>密码:{{ formmacro.input('password','userpass') }}</p>
<p>性别:
{{ formmacro.input('radio','sex',1) }} 男
{{ formmacro.input('radio','sex',0) }} 女
</p>
<p>{{ formmacro.input('submit',value='submit') }}</p>
</form>

(3) 宏的实例2

#定义一个users宏,输出user.name  caller(user.gender)传递参数
{% macro list_users(users) -%}
<table>
{%- for user in users %}
<tr><td>{{ user.name |e }}</td>{{ caller(user.gender) }}</tr>
{%- endfor %}
</table>
{%- endmacro %} #调用宏,{{ caller(user.gender) }}”部分被调用者”{% call(gender) %}”语句块内部的内容替代
{% call(gender) list_users(users) %}
<td>
{% if gender == 'M' %}
<img src="{{ url_for('static', filename='img/male.png') }}" width="20px">
{% else %}
<img src="{{ url_for('static', filename='img/female.png') }}" width="20px">
{% endif %}
</td>
<td><input name="delete" type="button" value="Delete"></td>
{% endcall %}

(4)import 导入:(针对导入宏或者自定义的宏)

import ....as....

{% import 'common/formmacro.html' as formmacro %}
如果index.html和formmacro同级 可以直接导入
{% import 'formmacro.html' as formmacro %}

from ... import as

{% from 'common/formmacro.html' import input %}   #从包导入宏
{% from 'common/formmacro.html' import input as form %} #从包导入宏并重命名

注意:

  1. 不能在宏定义的上方去调用
  2. 宏如果存在形参 如果不传实参 则行参的值为空 也不会报错
  3. 在给形参默认值的时候 必须遵循默认值的规则 幽默认值的放在后面 和 python的函数一样

(5) 宏的内部变量

varargs : 这是一个列表。如果调用宏时传入的参数多于宏声明时的参数,多出来的没指定参数名的参数就会保存在这个列表中。

kwargs : 这是一个字典。如果调用宏时传入的参数多于宏声明时的参数,多出来的指定了参数名的参数就会保存在这个字典中。

{% macro input(name, type='text', value='') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value|e }}">
<br /> {{ varargs }}
<br /> {{ kwargs }}
{% endmacro %}
<p>{{ input('submit', 'submit', 'Submit', 'more arg1', 'more arg2', ext='more arg3') }}</p>

3 块(block)

主体结构:一般结合继承使用,用于填充block块

{% extend ‘parent.html’ %}

{% block block_name %}
{% endblock 块名%}

注意:

  1. 模板不支持多继承,也就是子模板中定义的块,不可能同时被两个父模板替换。
  2. 模板中不能定义多个同名的块,子模板和父模板都不行,这样无法知道要替换哪一个部分的内容。

(1) 保留父模板中的内容采用 super( )方法

  • #父模板中设置好块
    <head>
    {% block head %}
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
    <title>{% block title %}{% endblock %}</title>
    {% endblock head%}
    </head>
    <body>
    <div class="page">
    {% block content %}
    {% endblock %}
    </div>
    </body>
  • {% block title %}首页{% endblock %}
    {% block head %}
    {{ super() }} #继承父类保持父类不变
    <style type="text/css">
    h1 { color: #336699; }
    </style>
    {% endblock %}
  • 注: 父模板与子模板中都有head块,运行时,父模板中的块先被加载,而后是子模板的块head

(2) 块内语句的作用域

默认情况下,块内语句是无法访问块作用域外的变量

#父模板中
{% for item in range(5) %}
<li>{% block list %}{% endblock %}</li>
{% endfor %} #子模板继承
{% block list %}
<p>{{ item }}</p>
{% endblock %} #此时子模板是无法获取到父模板中 list块中的内容,即打印为空

如果你想在块内访问这个块外的变量,你就需要在块声明时添加scoped关键字

#父模板中添加 scoped 关键字
{% for item in range(5) %}
<li>{% block list scoped %}{% endblock %}</li>
{% endfor %} #子模板继承
{% block list %}
<p>{{ item }}</p>
{% endblock %} #此时item能获取到 0,1,2,3,4

4 模板的继承

主体架构

{% extends '继承的模板名称' %}

{% block 替换的名称 %}

{% endblock %}

自定义一个基类模板base.html

<!DOCTYPE html>
<html lang="en">
{% block head %}
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title> #title块
{% block meta %}{% endblock %}
<style>
{% block style %} #css样式块
*{color:red;}
{% endblock %}
</style>
{% block link %}{% endblock %} #外联样式块
</head>
{% endblock %}
<body>
{% include 'common/header.html' %} #页面导入
{% block content %} {% endblock %}
{% include 'common/footer.html' %} #页面导入
</body>
</html>

使用index.html继承父类

{% extends 'common/base.html' %}   #继承父类模板
{% block title %}首页{% endblock %}
{% block style %}
{# 调用基础模板内的样式 如果不调用则全部被覆盖 #}
{{ super() }}
p{font-size:20px;}
{% endblock %}
{% block content %}
我是中间的内容部分
{% endblock %}

注意:

  1. 在替换的外部的填写的内容 不会被显示出来
  2. 如果在替换某一个block的时候 替换以后所有的样式消失 则去查看是否有调用super()

Flask入门之模板导入与块宏(六)的更多相关文章

  1. Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】

    宏 对宏(macro)的理解: 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用 需要在多处重 ...

  2. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  3. Flask入门之Bootstrap介绍使用和Flask-Nav快速导航栏

    一.Bootstrap Bootstrap,来自 Twitter,是目前最受欢迎的前端框架. Python中,同样可以使用Bootstrap. 1. 导入Bootstrap库 from flask_b ...

  4. 超实用的Flask入门基础教程,新手必备!

    Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...

  5. Flask入门和快速上手

    目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...

  6. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  7. Flask 入门一( flask 框架和 flask-script 库)

    Flask 入门一( flask 框架 和 flask-script 库) 一.Flask框架: 1.简介 Flask是一个非常小的Python Web框架,被称为微型框架:只提供了一个稳健的核心,其 ...

  8. 初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session

    一.web框架的对比 首先我们先来看下比较火的web框架 1.Django: 优点:大而全,所有组件都是组织内部开发高度定制化,教科书级别的框架 缺点:大到浪费资源,请求的时候需要的资源较高 2.Fl ...

  9. 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

随机推荐

  1. HDU - 3038 带权并查集

    这道题我拖了有8个月... 今天放假拉出来研究一下带权的正确性,还有半开半闭的处理还有ab指向的一系列细节问题 #include<iostream> #include<algorit ...

  2. Java static{}语句块详解

    [转自] http://blog.csdn.net/lubiaopan/article/details/4802430 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一 ...

  3. RESTful和SOAP的区别

    参考:[接口开发]浅谈 SOAP Webserver 与 Restful Webserver 区别 目录 一.Web Service 二.SOAP 三.REST 四.RPC 客户端和服务器端的通讯方式 ...

  4. PIXI AnimatedSprite 及打字爆炸动画(5)

    效果 : 消除字母 当前位置出现爆炸效果 这里使用到了AnimatedSprite 动画  Members An AnimatedSprite is a simple way to display a ...

  5. linux系统优化基础

    linux系统优化基础 tags: linux 优化 kingle---### 1, 查看centos版本:cat etc/redhat-release 看看centos架构信息:uname -m 查 ...

  6. (转) CentOS 7添加开机启动服务/脚本

    CentOS 7添加开机启动服务/脚本 原文:http://blog.csdn.net/wang123459/article/details/79063703 一.添加开机自启服务 在CentOS 7 ...

  7. 微信小程序转百度小程序修改

    百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...

  8. C# 深入理解String

    关于C#中的类型 在C#中类型分为值类型和引用类型,引用类型和值类型都继承自System.Object类,几乎所有的引用类型都直接从System.Object继承,而值类型具体一点则继承System. ...

  9. socket 客户端和服务端通信

    客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址, ...

  10. 从零实现一个简易jQuery框架之一—jQuery框架概述

    我们知道,不管学习任何一门框架,了解其设计的理念.目的.总体的结构及核心特性对我们使用和后续的深入理解框架都是有很大的帮助的.因此在这里先梳理一下本人对jQuery框架的一些理解. 设计目的(为什么要 ...