模版

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

Flask下的模版---Jinja2

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

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

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

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

模版基本语法

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul id="navigation'">
  9. {% for item in items %}
  10. <li><a href="{ item.href}"> {{ item.caption }}</a></li>
  11. {% endfor %}
  12. </ul>
  13. <h1>{{ title | trim }}</h1>
  14. </body>
  15. </html>

语法解释:

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

模版继承

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

母版
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. {% block head %}
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. {% endblock %}
  8. </head>
  9. <body>
  10. <div>
  11. {% block content %}
  12. <ul id="navigation'">
  13. heheh
  14. </ul>
  15. {% endblock %}
  16. </div>
  17. <div>
  18. {% block footer %}
  19. {% endblock %}
  20. </div>
  21. </body>
  22. </html>
  • {% block xxx%} ..... {% endblock %} 是一个代码块,可以在子模版里面重写这个代码块里面的内容,就等于python里面的子类继承父类后,可以重写一个和父类某个方法同名的方法来覆盖掉父类的某一个方法。
子模版

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

  1. {% extends 'simple.html' %}
  2. {% block title %} index {% endblock %}
  3. {% block head %}
  4. {{ super() }}
  5. <style type="text/css">
  6. .import {
  7. color: #000;}
  8. </style>
  9. {% endblock %}

语法解释:

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

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

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

赋值

通过set为变量赋值。

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

include

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

  1. {% include 'header.html' %}
  2. html_body
  3. {% include 'footer.html' %}

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

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

import

Jinja 支持不同的模版中导入宏并使用,与Python中import语句类似。有两种方式来导入模版,可以把整个模版导入到一个变量(import xx)或者从其中导入特定的宏(from xxx import xxx。

我们现在写一个宏模版,文件名为hong1.html:

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

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

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

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

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

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


  1. </p>
  2. hello Leo
  3. </p>
  4. </p>
  5. 2017-04-19 23:34:28
  6. </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. python - hadoop,mapreduce demo

    Hadoop,mapreduce 介绍 59888745@qq.com 大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽), 把用户的交易 ...

  2. Linux给tomcat指定jdk

    在安装jenkins的时候,发现必须是jdk1.8,所以就只能单独安装一个tomcat,在给tomcat配置jdk1.8了,以免破坏以前的项目 安装就不多说了.这里需要修改两个配置文件: 安装的tom ...

  3. jvm面试题

     1.虚拟机的类加载机制 1.1.什么是虚拟机的类加载机制 在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载 ...

  4. mongo源码学习(一)

    在git上把mongo的源码给拉下来了,然后目录大概是这样的: 这个mongo是用C++写的,编译并没有用Makefile而是用的scons工具,这个好像是python写的. mongo后台进程的入口 ...

  5. 关于C3P0容错和自动重连特性的研究

    转载: http://blog.csdn.net/cutesource/article/details/5422093 最近常有数据库和网络设备升级和搬迁等事情,而各个应用都是基于数据库连接池做的,大 ...

  6. docker安装及加速配置

    需要centos7版本,内核版本不低于3.10 [root@localhost ~]# uname -r3.10.0-514.el7.x86_64 第一步:更新当前软件:[root@localhost ...

  7. 一图让你看懂CSS盒子模型

  8. Check which .NET Framework version is installed

    his article will help you to know which .NET Framework version is installed from command line. Check ...

  9. "iostat" On Linux

    CPU是一台电脑的大脑.所有的处理命令都运行在上面.I/O(输入/输出)同样扮演了一个重要角色.硬盘用于提供数据给处理器并保存CPU处理过的数据.一种衡量处理器和I/O利用率的方法是使用iostat命 ...

  10. 【转】【Python】 python中的编码问题报错 'ascii' codec can't decode 及 URL地址获取中文

    1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是u ...