模板
在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量动态生成。当HTML代码保存到单独的文件中时,我们没法在使用字符串格式化或者拼接字符串的方式来在HTML代码中插入变量,这时我们需要使用模板引擎。
在模板中添加python语句和表达式,我们需要使用特定的定界符把他们标示出来,有三种定界符;
- 语句
- if判断,for循环 {%……%}
- 表达式 ,比如字符串、变量、函数调用等 {{ … }}
- 注释 {# …… #}
在视图函数中渲染模板时,我们并不直接使用jinja2提供的函数,而是使用flask提供的渲染函数render_template()
from flask import Flask, render_template
...
@app.route('/watchlist')
def watchlist():
return render_template('watchlist.html', user=user, movies=movies)
在render_template()函数,flask还提供了一个render_template_string() 函数用来渲染模板字符串
from flask import render_template
@app.route('/')
def index():
return render_template('index.html')
除了渲染时传入变量,在模板中定义变量,使用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)
app.context_processor(inject_foo)
app.context_processor(lambda: dict(foo= 'I am foo'))
除了使用app.context_processor注册模板上下文处理函数来传入函数。还可以使用app.template_global装饰器直接将函数注册为模板全局函数
@app.template_global()
def bar():
return 'I am bar'
过滤器
是一些用来可以过滤变量值和修改的函数, 过滤器和变量用一个竖线(管道符)隔开,需要参数的过滤器可以像函数一样使用括号传递
## 对name变量使用title过滤器
{{name | title }}
这会将name变量的值标题化,相当于python里调用name.title()
另一种用法是将过滤器作用于一部分模板数据,使用filter标签和endfilter标签声明开始和结束。
{% filter upper %}
This text becomes uppercase.
{% endfilter %}
# 内置过滤器
default()
escape(s)
first(seq)
last(seq)
length(object)
可以使用app.add_template_filter()方法注册自定义过滤器,传入函数对象和可选的自定义名称,比如app.add_template_filter()
测试器
用来测试变量或者表达式
返回布尔值的特殊函数
number测试器用来判断一个变量或者表达式是否为数字,使用is连接变量和测试器
第四章:表单
扩展Flask-WTF集成了WTForms,使用它可以在Flask中更方便地使
用WTForms。Flask-WTF将表单数据解析、CSRF保护、文件上传等功能
与Flask集成,另外还附加了reCAPTCHA支持。
pipenv install flask-wtf