模版

在生产环节下,我们要把后端程序(其实就是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. pandas(series,dataframe,index) method test

    python. pandas(series,dataframe,index,reindex,csv file read and write) method test import pandas as ...

  2. 微服务之springCloud-docker-feign(四)

    简介 上一节,我们讨论了怎么通过,restTemlate调用cloud的生产者,实现起来还是比较复杂的,尤其是在消费复杂的Restful服务的时候,还需要进行一系列的转换,编解码等,使用Feign就完 ...

  3. Android View体系(八)从源代码解析View的layout和draw流程

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  4. InstallShield安装jdk并设置环境变量

    1. 检查是否安装jdk function OnBegin() begin Disable (BACKBUTTON); if(!MAINTENANCE)then SdLicense2 ("L ...

  5. webbrowser取页面验证码

    碰到一个无比坑爹,外加蛋疼乳酸的问题.从昨天晚上发现bug,到今天下午解决问题,搞了大半天的时间.光是找问题就花了半天,解决问题的方法简单,但是方案的形成也是无比纠结的过程. 背景:webbrowse ...

  6. 【嵌入式】——makefiles

    汇编通用makefile: 命令行编辑: 编译 arm-linux-as -march=armv5te -o led.o led.s -march 指定的指令集的版本 指定架构 连接 arm-linu ...

  7. Spring Cloud Config 配置中心 生产环境下相关问题

    参照以前写的博客进行搭建配置中心集群 1.如果要使用 服务器端自动刷新,所有客户端同步功能.要先安装RabbitMQ 2.如果要使用自动加解密功能,要先安装JAVA JCE扩展.

  8. 关于Unity中的光照(五)

    Mobile Diffuse Unity自带的一种shader,用的比较多,性能还可以.我们默认创建的unit shader基本和它一致,但是没有参与光照计算,看起来和Mobile Diffuse有区 ...

  9. Ogre RTSS组件解析

    我们为什么要用RTSS. Ogre如计算物体位置,纹理,光照都有固定API如(glMatrixFrustumEXT, glLoadmatrix, glTexture, glLight ),使用这些AP ...

  10. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...