Jinja2

两个概念:

  • Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
  • 模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。

渲染模版函数

  • Flask提供的 render_template 函数封装了该模板引擎
  • render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

使用

  • {{}} 来表示变量名,这种 {{}} 语法叫做变量代码块
<h1>{{ post.title }}</h1>

Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素:

{{your_dict['key']}}
{{your_list[0]}}

模板变量

  • 代码中传入字符串,列表,字典到模板中
@app.route('/')
def index():# 往模板中传入的数据my_str = 'Hello word'my_int = 10my_array = [3, 4, 2, 1, 7, 9]my_dict = {'name': 'xiaoming','age': 18}return render_template('temp_demo1.html',my_str=my_str,my_int=my_int,my_array=my_array,my_dict=my_dict)
  • 模板中代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}</body>
</html>

过滤器

过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。

使用方式:

  • 过滤器的使用方式为:变量名 | 过滤器。
{{variable | filter_name(*args)}}
  • 如果没有任何参数传给过滤器,则可以把括号省略掉
{{variable | filter_name}}

链式调用

在 jinja2 中,过滤器是可以支持链式调用的,示例如下:

{{ "hello world" | reverse | upper }}

过滤器列表操作

  • first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
  • last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
  • length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>

自定义过滤器

过滤器的本质是函数。当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:

  • 一种是通过Flask应用对象的 add_template_filter 方法
  • 通过装饰器来实现自定义过滤器

重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

需求:添加列表反转的过滤器

方式一

通过调用应用程序实例的 add_template_filter 方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称:

def do_listreverse(li):# 通过原列表创建一个新列表temp_li = list(li)# 将新列表进行返转temp_li.reverse()return temp_liapp.add_template_filter(do_listreverse,'lireverse')

方式二

用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。

@app.template_filter('lireverse')
def do_listreverse(li):# 通过原列表创建一个新列表temp_li = list(li)# 将新列表进行返转temp_li.reverse()return temp_li

模板继承

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

  • 继承关键字
{% extends '父模板名' %}
  • 标签定义的内容
{% block 块变量名称 %} {% endblock %}
  • 相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
  • 子模板使用 extends 指令声明这个模板继承自哪个模板
  • 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()

父模板

  • base.html
{% block top %}顶部菜单
{% endblock top %}{% block content %}
{% endblock content %}{% block bottom %}底部
{% endblock bottom %}

子模板

  • extends指令声明这个模板继承自哪
{% extends 'base.html' %}
{% block content %}需要填充的内容
{% endblock content %}
  • 模板继承使用时注意点:

    • 不支持多继承
    • 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
    • 不能在一个模板文件中定义多个相同名字的block标签。
    • 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。

Jinja2模板与模板继承相关推荐

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

    宏的概念 类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余. Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免 ...

  2. Flask模板语法与继承

    一,Flask模板介绍 1. 什么是flask模板: --理解渲染机制: 没有模板渲染函数的话怎么在浏览器中显示html文件呢? (1)从磁盘中读取html字符串 (2)将满足特定规则的内容进行替换 ...

  3. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  4. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  5. go html template 数据怎么加减乘除_Go 视图模板篇(五):模板布局和继承

    模板布局与继承 在 Go 模板中,可以结合 define 指令和 template 指令实现模板布局功能. 首先编写一段服务端示例代码: package main import ( "htm ...

  6. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  7. 2021-07-31-DJ-009 Django模板页面的继承与定制,一个Base.html,仿制漂亮的效果

    文章目录 一.导入Bootstrap和JQuery库 二.做一个Base页面 三.通过基础页面基础上渲染自己的页面 一.导入Bootstrap和JQuery库 静态文件的配置在上一篇已经讲过了,这里从 ...

  8. 【C++模板编程入门】模板介绍、模板定义、函数模板、类模板、模板的继承

    1.模块的引入 1.1.示例代码 #include <iostream> #include <string>using namespace std;//用template声明T ...

  9. NodeJS_08_art-template子模板与模板继承_MongoBooster_express-session_三大类中间件_全局错误处理

    NodeJS七天课程学习笔记_第8天 Blog综合案例 Blog 综合案例 (包含注册.登录.修改密码.注销.发布.分页列表.评论.个人中心.上传头像等) 课程内容概要: 1. 介绍art-templ ...

最新文章

  1. 实在不好意思,最近写个项目,一直没时间来灌水
  2. 最大字段和各种不同算法实现(参考编程珠玑)
  3. 【毕业求职季】-听说你想去大厂看学姐,带你看看网易java面经
  4. 基于 OpenFire 的TVBox管理平台开发笔记
  5. 【ArcGIS风暴】水文分析模块实验:山脊线和山谷线提取
  6. hadoop集群swap_hadoop集群调优-OS和文件系统部分
  7. RabbitMQ详解(一)
  8. Java 并发编程之 FutureTask
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的今日头条新闻网站
  10. ubuntu ftp server-转
  11. Go:表驱动单元测试
  12. Oracle中用于发送邮件的存储过程
  13. [渝粤教育] 中国地质大学 事故应急救援 复习题 (2)
  14. BASE16、BASE32、BASE64编码特征及正则匹配
  15. python迅雷下载任务出错_迅雷下载任务出错的原因和解决方法 来研究下吧
  16. angular中自定义组件实现双向绑定
  17. 双离合档把上按钮作用_双离合怎么换挡图解,7速双离合档位示意图
  18. Teredo tunneling pseudo-interface前面有个黄色感叹号
  19. [体渲染]渲染一个球体
  20. 中医学专业学c语言吗,考研专业课中医学题型分析

热门文章

  1. 如何保持安全在线的五大技巧
  2. 数据库索引优化原理,索引的工作机制
  3. 基础学习笔记之opencv(14):随机数发生器绘制文字
  4. 【Shell 编程基础第一部分】Shell脚本HelloShell及简单的Shell基础
  5. 指针的理解 -- java程序员学C语言日记二
  6. Linux命令之crontab命令
  7. Jeecg-Boot使用war包在Tomcat中部署之参考教程
  8. 容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解
  9. 解决ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost
  10. 整理了Linux常用命令变量