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

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

内容简介:在上面的例子中,我们视图函数向客户端返回一行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入门学习---初步了解模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

支付战争

支付战争

埃里克•杰克逊 / 徐彬、王晓、清华大学五道口金融学院未央研究 审译 / 中信出版社 / 2015-5-19 / 49.00

这是一个野心勃勃的创业计划,在线支付鼻祖PayPal试图创造一个“统治世界”的金融操作系统,并在全球成功推广一款颠覆式的互联网产品。 《支付战争》的作者是“PayPal黑帮”成员之一,他真实还原了这个伟大产品是如何诞生的,以及在后来的发展壮大之路上,如何应对融资紧张、突破增长瓶颈,在竞争者凶猛围剿与平台商霸王条款的夹击下,逆境求生,改变业务模式,最终完成IPO,并成功出售给竞争对手eBay的......一起来看看 《支付战争》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

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

URL 编码/解码