Jinja2模版(Flask )

 

Jinja2 模版

Jinja2允许你在模版中使用大部分Python对象,比如字符串、列表、字典、元组、整型、浮点型、布尔值;也支持基本运算符号(+、—、*、/等)、比较运算符(==、!=)、逻辑符号(and、or、not和括号)以及in、is、None和布尔值(True、False)

  1. 语句定义
    {% ... %} #例如if语句、for语句

  2. 表达式
    {% ... %} #例如字符串、变量、函数调用

  3. 注释
    {% ... %}

语句总是成对出现,在语句的末尾必须要有语句结束标志。例如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="/">&larr; 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装饰器直接将函数注册为模板全局函数