Flask学习记录:模板

1.模板基本用法1.1模板语句和语法模板引擎jinjia2常见的3种界定符:语句比如if判断、for循环等:{% ... %}表达式比如字符串、变量、调用函数等:{{...}}注释:{# ... #}在jinjia2中,当要使用语句标识{%…%}时,在语句结束的地方,需要添加结束标签:{% if user.bio %} <i>{{user.b...
摘要由CSDN通过智能技术生成

1.模板基本用法

1.1模板语句和语法

模板引擎jinjia2常见的3种界定符:

  1. 语句
    比如if判断、for循环等:
{% ... %}
  1. 表达式
    比如字符串、变量、调用函数等:
{{...}}
  1. 注释:
{# ... #}

在jinjia2中,当要使用语句标识{%…%}时,在语句结束的地方,需要添加结束标签:

{% if user.bio %}
	<i>{{user.bio}}</i>
{% else %}
	<i>This user has not provided a bio.</>
{% endif %}
<ul>
	{% for movie in movies %}
		<li>{{movie.name}} - {{movie.year}}</li>
	{% endfor %}
</ul>
1.2渲染模板

渲染模板就是执行模板中的代码,并传入所有在模板中使用的变量,渲染后的结果就是要返回给客户端的HTML相应。

from flask import Flask,render_template

@app.route('watchlist')
def watchlist():
	return render_template('watchlist.html',user=user,movies=movies)

Flask会在程序根目录下的templates文件夹里寻找模板文件,所以上面传入的文件路径是相对于templates根目录的。

2.模板辅助工具

2.1 上下文

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

除了在渲染时传入变量,也可以在模板中定义变量,使用set标签

{% set navigation = [('\','Home'),('/about','About')] %}

也可以将一部分模板数据定义为变量,使用set和endset标签声明开始和结束:

{% set navigation %}
	<li><a href="/">Home</a>
	<li><a href="/about">About</a>
{% endset %}

Flask提供了一个app.context_processor装饰器,可以用来注册模板上下文处理函数,它可以帮我们完成统一传入变量的工作。模板上下文处理函数需要返回一个包含键值对的字典。

@app.context_processor
def inject_foo():
	foo = 'I am foo.'
	return dict(foo=foo)  #等同于return {'foo':foo}

当我们调用render_template()函数渲染任意一个模板时,所有使用app.context_processor装饰器注册的模板上下文处理函数(包括Flask内置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板中,因此我们可以在当前模板中直接使用 foo变量。

2.2 全局对象

全局对象是指在所有的模板中都可以直接使用的对象,包括在模板中导入模板。

上面使用了app.context_processor注册模板上下文处理函数来传入函数,这里使用app.template_global装饰器直接将函数注册为模板全局函数。

@app.template_global(name) #可以使用name属性指定一个自定义名称
def bar():
	return 'I am bar.'
2.3 过滤器

过滤器是一种可以用来修改和过滤变量值的特殊函数,过滤器和变量是用一个竖线隔开,需要参数的过滤器可以像函数一样使用括号传递。

{{name|title}}  #  对name变量的值标题化
{{movies|length}}  #  使用length获取movies列表的长度

另一种用法是将过滤器作用于一部分模板数据,使用filter标签和endfilter标签声明开始和结束。比如,下面使用upper过滤器将一段文字转换为大写:

{% filter upper %} 
	This text becomes uppercase.
{% endfilter %}

更多的内置过滤器
http:// jinja.pocoo.org/ docs/ 2.10/ templates/# builtin-filters

自定义过滤器

from flask import Markup
@app.template_filter(name)  #name为可选的自定义名称
def musical(s):
	return s + Markup(' &#9835;')  #在传入的字符后面加入一个音符图标(音符通过HTML实体&#9835;表示),并且使用Markup类将它标记为安全字符
2.4测试器

测试器是一些用来测试变量或者表达式,并且返回布尔值(True或False)的特殊函数。变量或表达式和测试器使用is连接。

{% if age is number %}   # number测试器用来判断一个变量或表达式是否是数字,
	{{age*365}}
{% else %}
	无效的数字。
{% endif %}

更多的内置测试器
http:// jinja.pocoo.org/ docs/ 2.10/ templates/# list-of-builtin-tests

自定义测试器

@app.template_test(name) #name为可选的自定义名称
def baz(n)
	if n=='baz':
		return True
	return False
2.5 模板环境对象

在Jinja2中,渲染行为由jinja2.Enviroment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Enviroment实例上。

(1)添加自定义全局对象
使用app.jinjia_env.globals可以添加任意的Python对象。

def bar(): 
	return 'I am bar.' 
foo = 'I am foo.' 
app.jinja_env.globals[' bar'] = bar  #添加全局对象
app.jinja_env.globals[' foo'] = foo  #添加全局变量

(2)添加自定义过滤器

def smiling( s): 
	return s + ' :)' 
app.jinja_env.filters[' smiling'] = smiling

(3)添加自定义测试器

def baz( n): 
	if n = = 'baz':
		return True 
	return False 
app.jinja_env.tests[' baz'] = baz
 

查看Enviroment类的所有属性及用法说明。
http:// jinja.pocoo.org/ docs/ latest/ api/# jinja2. Environment

3.模板结构组织

3.1局部模板

在Web程序中,我们通常会为每一类页面编写一个独立的模板。比如主页模板、用户资料页模板、设置页模板等。这些模板可以直接在视 图函数中渲染并作为HTML响应主体。除了这类模板,我们还会用到另一类非独立模板,这类模板通常被称为局部模板或次模板,因为它们仅包含部分代码,所以我们不会在视图函数中直接渲染它,而是插入到其他独立模板中。

当程序中的某个视图用来处理AJAX请求时,返回的数据不需要包含完整的HTML结构,这时就可以返回渲染后的局部模板。

使用include标签来插入一个局部模板,这会把局部模板的全部内容插在使用include标签的位置。比如,在其他模板中,我们可以在任意位置使用下面的代码插入_banner.html的内容:

{%  include '_banner.html' %}

为了和普通模板区分开,局部模板的命名通常以一个下划线开始。

3.2 宏

宏(macro)是Jinja2提供的一个非常有用的特性,它类似Python中的函数。使用宏可以把一部分模板代码封装到宏里,使用传递的参数 来构建内容,最后返回构建后的内容。在功能上,它和局部模板类似,都是为了方便代码块的重用。

使用marco标签和endmarco标签声明宏的开始和结束。

{% marco qux(amount=1) %}
	{% if amount==1 %}
		I am qux.
	{% elif amount>1 %}
		We are quxs.
	{% endif %}
{% endmarco %}

使用时,需要像从Python模块中导入函数一样使用import语句导入它,然后作为函数调用,传入必要的参数。

{% from 'macros.html' import qux %} 
... 
{{ qux( amount = 5) }}

参考书籍:《Flask Web开发实战 入门、进阶与原理解析》李辉 著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值