Flask入门学习---初步了解模板

栏目: Python · 发布时间: 6年前

内容简介:在上面的例子中,我们视图函数向客户端返回一行HTML代码。当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户界面的分离。为了实现动态的生成HTML数据,我们需要借助模板引擎。Flask默认使用的模板引擎是Jinja2,它是一个功能齐全的Python模板引擎。首先我们创建一些数据用于测试显示效果:

在上面的例子中,我们视图函数向客户端返回一行HTML代码。当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户界面的分离。为了实现动态的生成HTML数据,我们需要借助模板引擎。

Flask默认使用的模板引擎是Jinja2,它是一个功能齐全的 Python 模板引擎。

2.模板基本用法

2.1 创建模板

首先我们创建一些数据用于测试显示效果:

user = {
        'username': 'Grey Li',
        'bio': 'A boy who loves movies and music.',
    }
movies = [
        {'name': 'My Neighbor Totoro', 'year': '1988'},
        {'name': 'Three Colours trilogy', 'year': '1993'},
        {'name': 'Forrest Gump', 'year': '1994'},
        {'name': 'Perfect Blue', 'year': '1997'},
        {'name': 'The Matrix', 'year': '1999'},
        {'name': 'Memento', 'year': '2000'},
        {'name': 'The Bucket list', 'year': '2007'},
        {'name': 'Black Swan', 'year': '2010'},
        {'name': 'Gone Girl', 'year': '2014'},
        {'name': 'CoCo', 'year': '2017'},
    ]
复制代码

创建一个watchlist.html作为模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>{{ user.username }}'s Watchlist</title>
</head>
<body>
    <a href="{{ url_for('index') }}">← Return</a>
    <h2>{{ user.username }}</h2>
    {% if user.bio %}
        <i>{{ user.bio }}</i>
    {% else %}
        <i>This user has not provided a bio.</i>
    {% endif %}
    {# Below is the movie list (this is comment) #}
    <h5>{{ user.username }}'s Watchlist ({{ movies|length }}):</h5>
    <ul>
        {% for movie in movies %}
        <li>{{ movie.name }} - {{ movie.year }}</li>
        {% endfor %}
    </ul>
</body>
</html>
复制代码

在上面的代码中,我们可以看到Jinja2常见的三种定界符:

(1) 语句

比如if判断、for循环等:

{% ... %}
复制代码

(2) 表达式

比如字符串、变量、函数调用等:

{{ ... }}
复制代码

(3) 注释

{# ... #}
复制代码

2.2 渲染模板

渲染模板,就是执行模板中的代码,并传入所有在模板中使用的变量。

from flask import Flask, render_template
...
@app.route('/watchlist')
def watchlist():
    return render_template('watchlist.html'.user=user,movies=movies)
复制代码

3.模板辅助工具

3.1 上下文

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

除了在渲染时传入变量,我们也可以在模板中定义变量:

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

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

3.1.1 内置上下文变量

标准模板全局变量

变量 说明
config 当前的配置对象
request 当前的请求对象,在已激活的请求环境下可用
session 当前的会话对象。在已激活的请求环境下可用
g 与请求绑定的全局变量,在已激活的请求环境下可用

3.1.2 自定义上下文

若多个模板都使用同一变量,那么我们可以设置一个模板全局变量。

Flask提供了一个app.context_processor装饰器,用来注册模板上下文处理函数。

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

使用lambda
app.content_processor(lambda: dict(foo='I am foo.'))
复制代码

当我们使用render_template()函数渲染任意一个模板时,所有使用@app.content_processor装饰器注册的模板上下文处理函数(包括Flask内置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板中。

3.2 全局对象

3.2.1 内置全局函数

Jinja2内置模板全局函数

函数 说明
range() 和Python中的range()用法相同
lipsum(n=5,html=True,min=20,max=100) 生成随机文本,可以在测试时用来填充页面。默认生成5段HTML文本,每段包含20-100个单词
dict(**items) 和Python中的dict()用法相同

Flask内置模板全局函数

函数 说明
url_for() 用于生成URL的函数
get_flashed_messages() 用于获取flash消息的函数

3.2.2 自定义全局函数

@app.template_globak()
def bar():
    return 'I am bar.'
复制代码

3.3过滤器

过滤器是一些用来修改和过滤变量值的特殊函数

{{ name|title }} #对name使用title过滤器

{% filter upper %}
    This text becomes uppercase.
{% endfilter %}
复制代码

3.3.1 内置过滤器

3.3.2 自定义过滤器

from flask import Markup
@app.template_filter()
def musical(s):
    return s+ Markup(' ')
复制代码

3.4 测试器

测试器是一些用来测试变量或表达式,返回布尔值的特殊函数

{% if age is number %}
    {{ age*365 }}
{% else %}
    无效的数字。
{% endif %}
复制代码

3.4.1 内置测试器

3.4.2 自定义测试器

@app.template_test()
def baz(n):
    if n == 'baz':
        return True
    return False
复制代码

3.5 模板环境对象

在Jinja2中,渲染行为由Jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。所以我们可以通过它来添加自定义全局对象、自定义过滤器和自定义测试器。

3.5.1 添加自定义全局对象

def bar():
    return 'I am bar.'
foo = 'I am foo'
app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo
复制代码

3.5.2 添加自定义过滤器

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

3.5.3 添加自定义测试器

def baz(n):
    if n == 'baz':
        return True
    return Fasle
jinja_env.tests['baz']=baz复制代码

以上所述就是小编给大家介绍的《Flask入门学习---初步了解模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

500 Lines or Less

500 Lines or Less

Amy Brown、Michael DiBernardo / 2016-6-28 / USD 35.00

This book provides you with the chance to study how 26 experienced programmers think when they are building something new. The programs you will read about in this book were all written from scratch t......一起来看看 《500 Lines or Less》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具