模版

在生产环节下,我们要把后端程序(其实就是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 datetime loader = 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>

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

5 JInja2模版(适用于Django和Flask)的更多相关文章

  1. Flask的Jinja2模版过滤器

    Jinja2模版过滤器 过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度.过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功 ...

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

    Pyramid, Django, 和 Flask都是优秀的框架,为项目选择其中的哪一个都是伤脑筋的事.我们将会用三种框架实现相同功能的应用来更容易的对比三者.也可以直接跳到框架实战(Framework ...

  3. 测试开发中Django和Flask框架

    Python测试开发中Django和Flask框架 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后 ...

  4. 实验7、Django VS Flask VS Node:如何选择

    实验介绍 1. 实验内容 在本教程中,我们将详细介绍Django和Flask之间的比较.Flask和Django是基于Python的Web开发框架.许多正在朝着轻型微框架发展.这些框架敏捷,灵活,小巧 ...

  5. Jinja2模版语言自定义filter的使用

    Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...

  6. django和flask的区别

    转载至https://blog.csdn.net/tulan_xiaoxin/article/details/79132214 (1)Flask Flask确实很“轻”,不愧是Micro Framew ...

  7. Django和Flask的区别以及运行流程

    Django: Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理.但是缺点也 ...

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

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

  9. Django和Flask对于URL尾斜杠(back slash)的处理

    最近在看Flask,其中提到了对于URL尾斜杠的处理.感觉算是一个需要注意的地方吧,就和Django的处理方式来进行一个简单的对比. 首先说下什么是尾斜杠. http://www.baidu.com/ ...

随机推荐

  1. InstallShield Build错误:Internal build error 6041

    点击左侧菜单: Media-Release-选择release版本(例如Release1)-Build标签-   keey unused directories 改为no(默认为yes)

  2. git——从远程库克隆

    从远程库克隆 阅读: 248434 上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建 ...

  3. 代理ARP

    代理ARP是ARP协议的一个变种. 对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的 ARP 请求会使用自己的 MAC 地址与目标计算机的 IP地址对源计算机进行应答.代 ...

  4. HTML5游戏引擎排行榜

    个好的游戏引擎,能够大大简化游戏的开发实现,html5gameengine.com网站对国内外所有HTML5游戏引擎进行了排名,排名不仅给出了价格.流行度.分数以及最新发布时间,通过点击引擎名称可以了 ...

  5. hdfs清空回收站

    1. 直接删除目录(不放入回收站) hdfs dfs -rm -skipTrash /usr/tmp/log/ 2. 清空回收站 hdfs dfs -expunge

  6. Linux系统上传下载命令rz和sz

    Linux系统简单易用的上传下载命令rz和sz (2017年7月10日更新) 发布地址(http://oldboy.blog.51cto.com/2561410/588592) (一)安装方法汇总 1 ...

  7. oozie 客户端常用命令

    1.提交作业,作业进入PREP状态 oozie job -oozie http://localhost:11000/oozie -config job.properties -submit job: ...

  8. [数学-构造矩阵]NEFU 1113

    依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ...

  9. gitlab 地址https://www.gitlab.com.cn/installation/#centos-7

    https://www.gitlab.com.cn/installation/#centos-7 1.安装并配置必要的依赖关系 在CentOS 7(和RedHat / Oracle / Scienti ...

  10. WaitForSingleObject函数的使用

    等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.  WaitForSingleObject 函数 DWORD WaitForSingleObject( HANDLE hOb ...