Flask入门学习---初步了解模板
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') }}">← 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入门学习---初步了解模板相关推荐
- Flask入门学习教程
Flask学习 文章目录 Flask学习 1.简介 2.安装 3.最小的应用 4.路由 5.变量规则 6.URL构建 7.HTTP方法 8.文件存放 9.渲染模板 10.Request对象 11.Co ...
- Scrapy入门学习初步总览
OK,因为数据分析的缘故需要采集一些数据,所以学了一段时间的爬虫,但都是利用urllib,requests,Beautifulsoup采取一些小规模的数据,感觉并不顺手,所以从今天开始进入scrapy ...
- Flask入门学习---Hello,Flask!
实例程序在helloflask/demos/hello目录下 1.最小的Flask程序 在hello目录下的app.py脚本中包含了一个最小的Flask程序. from flask import Fl ...
- Flask入门系列(转载)
一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...
- Flask框架学习整理——从零开始入门Flask
文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...
- Flask入门之Jinjia模板的一些语法
原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...
- 学python有哪些用途-初入门学习python有哪些用途?
python是人工智能的重要编程语言,无论发展前景还是就业方向,不可限量.更重要的是python还是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.那么初入门学习python有哪些用途呢 ...
- java -jar 默认参数_JAVA入门学习指南,建议收藏
如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 . 让我们出发吧!ps:本文有点长,耐心阅读 . 〇,编程环境 ...
- Docker入门学习教程
Docker入门学习 文章目录 Docker入门学习 1.简介 2 基本概念 2.1 镜像(Image) 2.2 容器(Container) 2.3 仓库(Repository) 3.Windows ...
最新文章
- BEBLID:增强的高效局部图像特征描述符
- tensorflow生产环境部署
- QSS为Qt程序添加不一样的样式
- html div比例,我的前端组件 ---- 16:9固定宽高比例的div
- Python中的字典排序
- KMyMoney:全体理财好管家
- 北京某打工子弟学校之三
- 我常用的Latex中文报告模板(一)
- 利用指针数组计算2个3行4列矩阵的和_[剑指 Offer] 04. 二维数组中的查找
- window服务程序编写及发布
- sublime text3 python找不到文件路径_如何在sublime3 项目设置中设置 python 解释器的路径?...
- Java- String类概述
- 手机app系统软件开发报价单及方案:费用明细
- DOS入门教程。DOS的特点,DOS命令格式
- Android WebView白屏解决方案
- 2020届高考冲刺提分技巧;圆锥曲线系统秒杀技巧
- Android 实现远程控制(类似QQ的远程协助)
- oracle11204补丁包,Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)
- win10 进不了修复服务器失败怎么办,win10自动修复失败开不了机怎么办?win10自动修复失败无限循环解决方法大全...
- 改用Hamibot-艳云脚本云控系统
热门文章
- java计算机毕业设计ssm农产品追溯系统设计与实现_e59uz(附源码、数据库)
- APP冷启动和热启动秒开及启动性能检测
- FS5080E泛海微5V USB 输入双节锂电池串联应用升压充电IC管理芯片
- 脑电信号在情感计算中应用
- 电脑自动开关机软件测试,电脑自动关机bat命令 - 仅仅you的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 爱她,就要让她幸福!
- Delphi调用外部程序函数详解
- 图灵计算机与网络论文,图灵:计算机器与智能 经典AI论文系列
- 离散数学:连通分支数
- php imagettftext 中文,php的GD库imagettftext函数解决中文乱码问题,_PHP教程