模板
在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量动态生成。当HTML代码保存到单独的文件中时,我们没法在使用字符串格式化或者拼接字符串的方式来在HTML代码中插入变量,这时我们需要使用模板引擎。

在模板中添加python语句和表达式,我们需要使用特定的定界符把他们标示出来,有三种定界符;

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

在视图函数中渲染模板时,我们并不直接使用jinja2提供的函数,而是使用flask提供的渲染函数render_template()
  1. from flask import Flask, render_template
  2. ...
  3. @app.route('/watchlist')
  4. def watchlist():
  5. return render_template('watchlist.html', user=user, movies=movies)

在render_template()函数,flask还提供了一个render_template_string() 函数用来渲染模板字符串

  1. from flask import render_template
  2. @app.route('/')
  3. def index():
  4. return render_template('index.html')

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

  1. {%set navigation = [('/','home'),('/about','About')]%}

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

  1. {% set navigation %}
  2. <li><a href="/">home</a>
  3. <li><a href="/about">About</a>
  4. {% endset %}

自定义上下文
如果多个模板都需要使用同一变量,,设置一个模板的全局变量,flask提供了一个app.context_processor装饰器,可以用来注册模板上下文处理函数,模板上下文处理函数需要返回一个包含变量键值对的字典

  1. @app.context_processor
  2. def inject_foo():
  3. foo = 'I am foo.'
  4. return dict(foo=foo)
  5. app.context_processor(inject_foo)
  6. app.context_processor(lambda: dict(foo= 'I am foo'))

除了使用app.context_processor注册模板上下文处理函数来传入函数。还可以使用app.template_global装饰器直接将函数注册为模板全局函数

  1. @app.template_global()
  2. def bar():
  3. return 'I am bar'

过滤器
是一些用来可以过滤变量值和修改的函数, 过滤器和变量用一个竖线(管道符)隔开,需要参数的过滤器可以像函数一样使用括号传递

  1. ## 对name变量使用title过滤器
  2. {{name | title }}
  3. 这会将name变量的值标题化,相当于python里调用name.title()

另一种用法是将过滤器作用于一部分模板数据,使用filter标签和endfilter标签声明开始和结束。

  1. {% filter upper %}
  2. This text becomes uppercase.
  3. {% endfilter %}
  4. # 内置过滤器
  5. default()
  6. escape(s)
  7. first(seq)
  8. last(seq)
  9. 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