模版

在生产环节下,我们要把后端程序(其实就是python)计算出来的数据和html页面结合起来做,这个时候模版就派上大用处了。

Flask下的模版---Jinja2

Jinja是日本寺庙的意思,并且寺庙的英文temple和template发音相似。JinaJa是Flask默认的仿DJango模版的一个模版引擎,由Flask作者开发。它速度快,被广泛使用,并且提供了可选的沙箱模版来保证执行环境的安全。它有如下优点:

  • 让HTML设计者和后端Python开发工作分离
  • 减少使用python的复杂度,页面逻辑应该独立于业务逻辑,这样才能开发出易于维护的程序。
  • 模版非常灵活、快速和安全,对设计者和开发者会更友好
  • 提供了控制语句、继承等高级功能,减少开发的复杂度。

默认安装Flask 的时候也会把Jinja2给安装上。如果没有安装可以单独安装下。

[root@localhost FlaskPratcie]# pip list |grep Jinja2   # 检查是否安装
[root@localhost FlaskPratcie]# pip install Jinja2   # 没有安装就给安装下

模版基本语法

我们看看最简单模版用法,这个jinja2语法也是适用于Django.

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><ul id="navigation'">{% for item in items %}<li><a href="{ item.href}"> {{ item.caption }}</a></li>{% endfor %}</ul><h1>{{ title | trim }}</h1>
</body>
</html>

语法解释:

  • {# ... #} 模版注释,他不会出现在渲染的页面里
  • {% ... %} 用于执行诸如for循环或者赋值的语句
  • {{ ... }} 用于把表达式的结果输出到模版上
  • for 循环必须像shell脚步一样,有结束标签,这里的就是{% for x in y %} .... {% endfor %}
  • 获取变量的值,我们有两种方式获取:
  1. {{ item.href }}
  2. {{ item['href'] }}
  • {{ title | trim }} trim是一个过滤器,在模版中通过管道符号(|)把变量和过滤器分开。我们也可以通过多个过滤器,如{{ title|trim|striptags }} 等。striptags也是一个过滤器,Jinja2内部提供了非常多的过滤器,点我查看其它过滤器

模版继承

合理使用模版继承,让模版重复使用,能够提高工作效率和代码质量。

母版
<!DOCTYPE html>
<html lang="en">
<head>{% block head %}<meta charset="UTF-8"><title>Title</title>{% endblock %}
</head>
<body><div>{% block content %}<ul id="navigation'">heheh</ul>{% endblock %}</div><div>{% block footer %}{% endblock %}</div>
</body>
</html>
  • {% block xxx%} ..... {% endblock %} 是一个代码块,可以在子模版里面重写这个代码块里面的内容,就等于python里面的子类继承父类后,可以重写一个和父类某个方法同名的方法来覆盖掉父类的某一个方法。
子模版

我们再看看子模版的内容:

{% extends 'simple.html' %}
{% block title %} index {% endblock %}
{% block head %}{{ super() }}<style type="text/css">.import {color: #000;}</style>
{% endblock %}

语法解释:

  • {% extends 'xxx' %} 表示继承这个母版,xxx是这个母版的文件名
  • super() 方法表示先使用母版里面的base.html的head块的内容,在这基础之上添加css样式
  • 如果你想用多次使用一个块,可以使用特殊“self” 变量并调用与块同名的函数,如下所示
{% extends 'simple.html' %}
{% block title %} index {% endblock %}
<h1>{{ self.title() }}</h1>    # 再次使用title这个块

宏类似于常规编程语言中的函数,它用于把日常行为抽象成可重复用的函数

from jinja2 import Template
print Template('''
{% macro hello(name)%}HEllo {{ name }}
{% endmacro %}
<p> {{ hello('ljf') }}</p>
''').render()
  • macro 这个等同于python里面的def,shell里面的function ,js里面的function一样,定义一个方法罢了

赋值

通过set为变量赋值。

from jinja2 import Template
print Template('''{% set a = 1 %}{% set b,c = range(2) %}<p> {{a }} {{ b }} {{ c }} </p>
''').render()

include

include 语句包含一个模版,渲染的时候会在include语句对应位置添加被包含的模块内容。

{% include 'header.html' %}html_body
{% include 'footer.html' %}

include同时还支持“ignore missing”,如果模版不存在,Jinja会忽略这条语句:

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

import

Jinja 支持不同的模版中导入宏并使用,与Python中import语句类似。有两种方式来导入模版,可以把整个模版导入到一个变量(import xx)或者从其中导入特定的宏(from xxx import xxx。
我们现在写一个宏模版,文件名为hong1.html:

{% macro hello(name) %}hello {{ name }}
{% endmacro %}{% macro strftime(time,fmt='%Y-%m-%d %H:%M:%S') %}{{ time.strftime(fmt) }}
{% endmacro %}

我们在写一个文件,这个文件名为hello_macro.html,我们这个hello_macro.html里面导入hong1.html,注意,两个文件在同一个目录下面。代码如下:

{% import 'hong1.html' as macro %}
{% from 'hong1.html' import hello as _hello,strftime %}
</p>{{ macro.hello('Leo') }}</p>
</p>{{ strftime(time) }}</p>

写完之后,我们在写一个py文件,内容如下:

from jinja2 import FileSystemLoader,Environment
from datetime import datetimeloader = FileSystemLoader('/root/PycharmProjects/FlaskPratcie/templates/chapter3/section1/') # 这个是导入hello_macro.html所在的父目录即可
template = Environment(loader=loader).get_template('hello_macro.html')
print(template.render(time=datetime.now()))

写完后执行py文件,打印的信息如下:


</p>hello Leo
</p>
</p>2017-04-19 23:34:28
</p>

打印出来的结果如果你的和我一样,说明宏已经能够正确导入了。

转载于:https://www.cnblogs.com/liaojiafa/p/6736554.html

5 JInja2模版(适用于Django和Flask)相关推荐

  1. Python web后端开发框架 Django 、Flask、Tornado

    由于Python的简洁 易读 强大 高效  现在Python应用在文件处理.网络编程.数据库编程.游戏.Web开发.数据分析.机器学习等各个领域. 就Web开发而言,为了提高开发效率,应运而生了很多框 ...

  2. python flask与django的区别_真正搞明白Python中Django和Flask框架的区别

    Django和Flask的区别 1.形象类比 如果Django类似于精装修的房子,自带豪华家具.非常齐全功能强大的家电,什么都有了,拎包入住即可,十分方便. 而Flask类似于毛坯房,自己想把房子装修 ...

  3. python flask和django_真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  4. python的django_真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  5. Django和Flask区别

    Flask - Flask确实很"轻",不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过. - Flask自由.灵活 ...

  6. 关于Django、Flask的一些面试知识点

    Django 1.Django. Flask.Tornado框架的比较? Django: 对于Django,大而全的框架它的内部组件比较多,内部提供:ORM.Admin.中间件.Form.ModelF ...

  7. ansible基础-Jinja2模版 | 过滤器

    Jinja2模版介绍 注:本文demo使用ansible2.7稳定版 在ansible基础-变量的「8.2 模版使用变量」章节中关于模版与变量也有所提及,有兴趣的同学可以去回顾一下. ansible通 ...

  8. django restframework 下载文件_【技术选型】Django还是Flask?这是个问题!

    Django和Flask,是Python语言在WEB开发领域中占据了半壁江山的两个框架.在我们实际开发过程中,如何从这两者之间二选一呢? 01 半壁江山的两个WEB框架 在2019年Python官方年 ...

  9. [Link]选择一个 Python Web 框架:Django vs Flask vs Pyramid

    选择一个 Python Web 框架:Django vs Flask vs Pyramid

最新文章

  1. libxml/xmlversion.h: No such file or directory
  2. MapReduce英语面试
  3. 高校邦python程序设计基础篇_高校邦Python程序设计基础【实境编程】章节答案
  4. PostgreSQL 9.6.0 手册
  5. git 安装包_Git、TortoiseGit的安装、使用说明
  6. 包含以下字段的 struct 怎么解决_S7-300/400进阶笔记4-2:STEP7的“结构”STRUCT数据类型的用法...
  7. 在html中写js提示错误,页面HTML标签优化
  8. 信息学奥赛一本通 1189:Pell数列 | 1202:Pell数列 | OpenJudge NOI 2.3 1788:Pell数列 | 2.3 1788:Pell数列
  9. virtualBox虚拟机安装UBuntu系统问题及处理
  10. mac下编译hadoop-3.0.3
  11. Docker学习总结(40)——Docker常见应用场景再总结
  12. Oracle误操作--被提交后的数据回退(闪回)
  13. bzoj 1414: [ZJOI2009]对称的正方形
  14. 2020-10-13
  15. 高手进阶,终极内存技术指南——完整/进阶版 I(转)
  16. 江苏省泰州市谷歌高清卫星地图下载
  17. BCD码和ASCII码的相互转换
  18. 2023-03-06
  19. iOS设备录制屏幕视频
  20. OA项目(MVC项目)

热门文章

  1. 驾驭组织结构——生意格局和配置优势
  2. 【计蒜客模拟赛系列】-计蒜客2021年8月普及组模拟赛
  3. XTU 2021计网期中测试-冰冰的逆序数
  4. springboot基础篇(快速入门 + 完整项目案例)
  5. python求相关系数矩阵,协方差矩阵
  6. python设置excel自动换行_python操作excel
  7. ADC 数据采集发送到 pc
  8. spss和mysql哪个好学_MYSQL 入门全套
  9. 汽车电子(三)--- 车机TBOX 介绍
  10. mysql的int的最大数_mysql int范围与最大值分析