1.为什么需要模板引擎(template engine)?

在上面的例子中,我们视图函数向客户端返回一行HTML代码。当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户界面的分离。为了实现动态的生成HTML数据,我们需要借助模板引擎。

Flask默认使用的模板引擎是Jinja2,它是一个功能齐全的Python模板引擎。

2.模板基本用法

2.1 创建模板

首先我们创建一些数据用于测试显示效果:

user = {'username': 'Grey Li','bio': 'A boy who loves movies and music.',}
movies = [{'name': 'My Neighbor Totoro', 'year': '1988'},{'name': 'Three Colours trilogy', 'year': '1993'},{'name': 'Forrest Gump', 'year': '1994'},{'name': 'Perfect Blue', 'year': '1997'},{'name': 'The Matrix', 'year': '1999'},{'name': 'Memento', 'year': '2000'},{'name': 'The Bucket list', 'year': '2007'},{'name': 'Black Swan', 'year': '2010'},{'name': 'Gone Girl', 'year': '2014'},{'name': 'CoCo', 'year': '2017'},]
复制代码

创建一个watchlist.html作为模板文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>{{ user.username }}'s Watchlist</title>
</head>
<body><a href="{{ url_for('index') }}">&larr; Return</a><h2>{{ user.username }}</h2>{% if user.bio %}<i>{{ user.bio }}</i>{% else %}<i>This user has not provided a bio.</i>{% endif %}{# Below is the movie list (this is comment) #}<h5>{{ user.username }}'s Watchlist ({{ movies|length }}):</h5><ul>{% for movie in movies %}<li>{{ movie.name }} - {{ movie.year }}</li>{% endfor %}</ul>
</body>
</html>
复制代码

在上面的代码中,我们可以看到Jinja2常见的三种定界符:

(1) 语句

比如if判断、for循环等:

{% ... %}
复制代码

(2) 表达式

比如字符串、变量、函数调用等:

{{ ... }}
复制代码

(3) 注释

{# ... #}
复制代码

2.2 渲染模板

渲染模板,就是执行模板中的代码,并传入所有在模板中使用的变量。

from flask import Flask, render_template
...
@app.route('/watchlist')
def watchlist():return render_template('watchlist.html'.user=user,movies=movies)
复制代码

3.模板辅助工具

3.1 上下文

模板上下文包含了很多变量,其中包括我们调用render_template()函数时手动传入的变量以及Flask默认传入的变量。

除了在渲染时传入变量,我们也可以在模板中定义变量:

{% set navigation = [('/','Home') , ('/about','About')] %}{% set navigation %}<li><a href="/">Home</a></li><li><a href="/about">About</a></li>
{% endset %}
复制代码
3.1.1 内置上下文变量

标准模板全局变量

变量 说明
config 当前的配置对象
request 当前的请求对象,在已激活的请求环境下可用
session 当前的会话对象。在已激活的请求环境下可用
g 与请求绑定的全局变量,在已激活的请求环境下可用
3.1.2 自定义上下文

若多个模板都使用同一变量,那么我们可以设置一个模板全局变量。

Flask提供了一个app.context_processor装饰器,用来注册模板上下文处理函数。

@app.content_processor
def inject_foo():foo='I am foo.'return dict(foo=foo) #等价于 return {'foo':foo}def inject_foo():foo='I am foo.'return dict(foo=foo) #等价于 return {'foo':foo}
app.content_processor(inject_foo)使用lambda
app.content_processor(lambda: dict(foo='I am foo.'))
复制代码

当我们使用render_template()函数渲染任意一个模板时,所有使用@app.content_processor装饰器注册的模板上下文处理函数(包括Flask内置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板中。

3.2 全局对象

3.2.1 内置全局函数

Jinja2内置模板全局函数

函数 说明
range() 和Python中的range()用法相同
lipsum(n=5,html=True,min=20,max=100) 生成随机文本,可以在测试时用来填充页面。默认生成5段HTML文本,每段包含20-100个单词
dict(**items) 和Python中的dict()用法相同

Flask内置模板全局函数

函数 说明
url_for() 用于生成URL的函数
get_flashed_messages() 用于获取flash消息的函数
3.2.2 自定义全局函数
@app.template_globak()
def bar():return 'I am bar.'
复制代码

3.3过滤器

过滤器是一些用来修改和过滤变量值的特殊函数

{{ name|title }} #对name使用title过滤器{% filter upper %}This text becomes uppercase.
{% endfilter %}
复制代码
3.3.1 内置过滤器
3.3.2 自定义过滤器
from flask import Markup
@app.template_filter()
def musical(s):return s+ Markup('♫')
复制代码

3.4 测试器

测试器是一些用来测试变量或表达式,返回布尔值的特殊函数

{% if age is number %}{{ age*365 }}
{% else %}无效的数字。
{% endif %}
复制代码
3.4.1 内置测试器
3.4.2 自定义测试器
@app.template_test()
def baz(n):if n == 'baz':return Truereturn False
复制代码

3.5 模板环境对象

在Jinja2中,渲染行为由Jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。所以我们可以通过它来添加自定义全局对象、自定义过滤器和自定义测试器。

3.5.1 添加自定义全局对象
def bar():return 'I am bar.'
foo = 'I am foo'
app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo
复制代码
3.5.2 添加自定义过滤器
def smiling(s):return s+ ':)'
app.jinja_env.filters['smiling']=smiling
复制代码
3.5.3 添加自定义测试器
def baz(n):if n == 'baz':return Truereturn Fasle
jinja_env.tests['baz']=baz复制代码

转载于:https://juejin.im/post/5ccfe8d4e51d456e831f69d4

Flask入门学习---初步了解模板相关推荐

  1. Flask入门学习教程

    Flask学习 文章目录 Flask学习 1.简介 2.安装 3.最小的应用 4.路由 5.变量规则 6.URL构建 7.HTTP方法 8.文件存放 9.渲染模板 10.Request对象 11.Co ...

  2. Scrapy入门学习初步总览

    OK,因为数据分析的缘故需要采集一些数据,所以学了一段时间的爬虫,但都是利用urllib,requests,Beautifulsoup采取一些小规模的数据,感觉并不顺手,所以从今天开始进入scrapy ...

  3. Flask入门学习---Hello,Flask!

    实例程序在helloflask/demos/hello目录下 1.最小的Flask程序 在hello目录下的app.py脚本中包含了一个最小的Flask程序. from flask import Fl ...

  4. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  5. Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...

  6. Flask入门之Jinjia模板的一些语法

    原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...

  7. 学python有哪些用途-初入门学习python有哪些用途?

    python是人工智能的重要编程语言,无论发展前景还是就业方向,不可限量.更重要的是python还是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.那么初入门学习python有哪些用途呢 ...

  8. java -jar 默认参数_JAVA入门学习指南,建议收藏

    如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 . 让我们出发吧!ps:本文有点长,耐心阅读 . 〇,编程环境 ...

  9. Docker入门学习教程

    Docker入门学习 文章目录 Docker入门学习 1.简介 2 基本概念 2.1 镜像(Image) 2.2 容器(Container) 2.3 仓库(Repository) 3.Windows ...

最新文章

  1. BEBLID:增强的高效局部图像特征描述符
  2. tensorflow生产环境部署
  3. QSS为Qt程序添加不一样的样式
  4. html div比例,我的前端组件 ---- 16:9固定宽高比例的div
  5. Python中的字典排序
  6. KMyMoney:全体理财好管家
  7. 北京某打工子弟学校之三
  8. 我常用的Latex中文报告模板(一)
  9. 利用指针数组计算2个3行4列矩阵的和_[剑指 Offer] 04. 二维数组中的查找
  10. window服务程序编写及发布
  11. sublime text3 python找不到文件路径_如何在sublime3 项目设置中设置 python 解释器的路径?...
  12. Java- String类概述
  13. 手机app系统软件开发报价单及方案:费用明细
  14. DOS入门教程。DOS的特点,DOS命令格式
  15. Android WebView白屏解决方案
  16. 2020届高考冲刺提分技巧;圆锥曲线系统秒杀技巧
  17. Android 实现远程控制(类似QQ的远程协助)
  18. oracle11204补丁包,Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)
  19. win10 进不了修复服务器失败怎么办,win10自动修复失败开不了机怎么办?win10自动修复失败无限循环解决方法大全...
  20. 改用Hamibot-艳云脚本云控系统

热门文章

  1. java计算机毕业设计ssm农产品追溯系统设计与实现_e59uz(附源码、数据库)
  2. APP冷启动和热启动秒开及启动性能检测
  3. FS5080E泛海微5V USB 输入双节锂电池串联应用升压充电IC管理芯片
  4. 脑电信号在情感计算中应用
  5. 电脑自动开关机软件测试,电脑自动关机bat命令 - 仅仅you的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  6. 爱她,就要让她幸福!
  7. Delphi调用外部程序函数详解
  8. 图灵计算机与网络论文,图灵:计算机器与智能 经典AI论文系列
  9. 离散数学:连通分支数
  10. php imagettftext 中文,php的GD库imagettftext函数解决中文乱码问题,_PHP教程