Jinja2 模版
Jinja2允许你在模版中使用大部分Python对象,比如字符串、列表、字典、元组、整型、浮点型、布尔值;也支持基本运算符号(+、—、*、/等)、比较运算符(==、!=)、逻辑符号(and、or、not和括号)以及in、is、None和布尔值(True、False)
-
语句定义
{% ... %} #例如if语句、for语句 -
表达式
{% ... %} #例如字符串、变量、函数调用 -
注释
{% ... %}
语句总是成对出现,在语句的末尾必须要有语句结束标志。例如if语句
{% if author.loves %}
<i>{{ author.loves }}</i>
{% else %}
<i>The interesting of author is miss!</i>
{% endif %}
for语句
{% for book in books %}
<i>{{ book.name }}</i>
{% endfor %}
模版渲染
可以使用Flask提供的渲染函数render_template()
from flask import Flask, render_template
@app.route('/booklist')
def booklist():
author = { 'name':'doudou',
'loves':'movies、reading、travel'}
books = [{'name':'遥远的救世主', 'years':1980},
{'name':'天幕红尘', 'years':1988}]
return render_template('booklist.html', author=author, books=books)
根据被传入的虚拟参数,render_template()渲染后返回的HTML数据如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>doudou's book list</title>
</head>
<body>
<a href="/">← Return</a>
<h2>doudou</h2>
<i>movies、reading、travel</i>
<h5>doudou's booklist (10):</h5>
<ul>
<li>遥远的救世主 - 1980</li>
<li>天幕红尘 - 1988</li>
</body>
</html>
模版变量
一、自定义上下文
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变量。
二、 自定义全局函数
除了使用app.context_processor注册模板上下文处理函数来传入函数,我们也可以使用app.template_global装饰器直接将函数注册为模板全局函数