flask web学习之模板(一)

文章目录

      • 一、模板基本用法
        • [1.1 定界符](#1.1 定界符)
        • [1.2 模板语法](#1.2 模板语法)
        • [1.3 渲染模板](#1.3 渲染模板)
      • 二、模板辅助工具
        • [2.1 上下文](#2.1 上下文)
        • [2.2 全局对象](#2.2 全局对象)
        • [2.3 过滤器](#2.3 过滤器)
        • [2.4 测试器](#2.4 测试器)
        • [2.5 模板环境对象](#2.5 模板环境对象)

在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成。当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的方式在HTML代码中插入变量,这时我们需要模板引擎,我们可以在HTML文件中使用特殊的语法来标记变量,这类包含固定内容和动态部分的可重用文件称为模板。模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传入的数据将变量替换为实际值,输出最终的HTML页面,这个过程就叫做渲染。flask默认使用的模板引擎是Jinja2,他是一个功能齐全的Python模板引擎。

一、模板基本用法

1.1 定界符
  • 语句:比如if判断、for循环等。{%.....%}
  • 表达式:比如字符串,变量等。{``{....}}
  • 注释:{#....#}
1.2 模板语法

Jinja2提供了多种控制结构来控制模板的输出,其中for和if是最常用的两种。

  • if 控制结构

    {% if user.bio %}

    hahha

    {% else %}

    wuwuwu

    {% endif %}
  • for 控制结构

    {% for item in items %}

  • {{item.e}}
  • {% endfor %}

常用的循环变量

变量名 说明
loop.index 当前迭代数(从1开始)
loop.index() 当前迭代数(从0开始)
loop.revindex 当前反向迭代数(从1开始)
loop.revindex() 当前反向迭代数(从0开始)
loop.first 如果是第一次迭代,则为 True,否则为 False。
loop.last 如果是最后一次迭代,则为 True,否则为 False。
loop.length 被迭代的对象的长度
1.3 渲染模板
  • render_template()函数

    from flask import Flask, render_template

    app = Flask(name)

    @app.route('/')
    def index():
    data = {
    'title': 'Welcome to My Website',
    'content': 'This is some content for the page.'
    }
    return render_template('index.html', **data)

  • render_template_string()函数

    from flask import Flask, render_template_string

    app = Flask(name)

    @app.route('/')
    def index():
    data = {
    'title': 'Welcome to My Website',
    'content': 'This is some content for the page.'
    }
    template_string = """

    {{ title }}


    {{ content }}


    """
    return render_template_string(template_string, **data)

二、模板辅助工具

2.1 上下文

在模板上下文里包含很多变量,其中包括手动传和自动传的变量,除了这些之外,我们可以通过set标签在模板里创建变量。

复制代码
{% set variable_name = expression %}

也可以将一系列模版定义为变量,使用set和endset定义开始和结束。

复制代码
{% set template_header %}
    <h1>Welcome to My Website</h1>
{% endset %}

{% set template_content %}
    <p>This is some content for the page.</p>
{% endset %}

<div>
    {{ template_header }}
</div>

<div>
    {{ template_content }}
</div>
  • 内置上下文变量

标准模板全局变量

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

注册模板上下文处理函数

复制代码
# flask提供了app.context_processor装饰器,可以用来注册模板上下文处理函数,它可以帮我们完成统一传入变量的工作。
@app.context_processor
def inject_foo():
	foo = "I am folo."
	return dict(foo=foo)

当我们调用render_template()函数渲染任意一个模板时,所有使用app.context_processor装饰器注册的模板上下文处理函数都会被执行,这些函数的返回值会被添加到模板中,因此我们可以直接在模板中使用foo变量。

2.2 全局对象
  • 内置全局函数
全局函数 说明
url_for(endpoint, **values) 生成指定端点(endpoint)对应的 URL url_for('index', page=2)
static(filename) 生成静态文件的 URL static('styles.css')
get_flashed_messages(with_categories=False, category_filter=\[\]) 用于获取闪现消息,如果没有指定参数,它将返回所有闪现消息的列表。可以通过 with_categories=True 来返回带有分类信息的闪现消息,或者通过 category_filter 来仅返回特定分类的闪现消息
range() 与python range函数用法一致
limsum(n=5, html=True, min=20, max=100) 生成随机文本
  • 自定义全局函数

    定义一个自定义的全局函数

    @app.template_global()
    def double(x):
    return x * 2

2.3 过滤器

过滤器用于对变量进行处理和转换,从而实现一些常见的格式化操作。

  • 内置过滤器
过滤器 说明
safe 将文本标记为安全,告诉模板引擎不要对其进行转义。例如:`{``{ my_html_text
default 如果变量不存在或为空,则使用给定的默认值。
striptags 移除字符串中的 HTML 或 XML 标签。
trim 去除字符串两侧的空白字符。
title 将字符串中每个单词的首字母转换为大写。
capitalize 将字符串中的第一个字符转换为大写,其他字符转换为小写。
lower 将字符串转换为小写。
upper 将字符串转换为大写。
  • 自定义过滤器

    @app.template_filter()
    def musical(s):
    return s*10

    模板使用

    {{name | musical}}

2.4 测试器

测试器用于对变量进行逻辑判断和类型检查,从而实现一些常见的条件判断操作。

  • 内置测试器
测试器 说明
odd 判断一个数值是否为奇数。
even 判断一个数值是否为偶数。
defined 判断一个变量是否已定义。
none 判断一个变量是否为 None。
divisibleby 判断一个数值是否可以被给定的数整除。
string 判断一个变量是否为字符串类型。
  • 自定义测试器

    定义一个自定义测试器

    def is_even(value):
    return value % 2 == 0

    将自定义测试器注册到模板环境中

    app.template_test(is_even)

    模板使用

    {% if number is even %}

2.5 模板环境对象

在jinja2中,渲染行为都由jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。

  • app.jinja_env.globals: 这是一个字典,包含全局变量,在所有模板中都可用。你可以将自定义的全局变量添加到这个字典中,以便在模板中使用。

  • app.jinja_env.filters: 这是一个字典,包含过滤器函数。过滤器函数可以在模板中用于对变量进行处理和转换,例如格式化日期、截取字符串等。你可以将自定义的过滤器函数添加到这个字典中。

  • app.jinja_env.tests: 这是一个字典,包含测试函数。测试函数用于在模板中进行条件判断,例如检查变量是否为真、是否为列表等。你可以将自定义的测试函数添加到这个字典中。

  • app.jinja_env.globals.update(): 这是一个方法,用于批量添加全局变量。你可以传入一个字典作为参数,其中包含要添加的全局变量及其值。

  • app.jinja_env.get_template(template_name): 这是一个方法,用于获取指定名称的模板。你可以使用这个方法加载模板,并对其进行渲染。

  • app.jinja_env.from_string(template_string): 这是一个方法,用于根据给定的模板字符串创建一个模板对象。你可以使用这个方法动态创建模板,而无需从文件中加载。

通过操作模板环境对象,你可以定制模板的行为、添加自定义函数和过滤器、设置全局变量等。这使得你可以更灵活地控制模板的渲染过程,并实现一些高级功能。

相关推荐
weixin_BYSJ19871 天前
springboot医疗信息管理系统---附源码17465
java·javascript·spring boot·python·django·flask·php
运维行者_2 天前
网络监控与ITSM集成:从告警到工单,实现运维自动化闭环
开发语言·网络·分布式·后端·架构·flask·php
way_hj2 天前
Flask笔记(2)快速web项目
笔记·flask·vue·web
海盗12342 天前
微软技术日报——2026-08-07
python·microsoft·flask
weixin_BYSJ19872 天前
【java项目分享】springboot阅读推荐平台10600
java·javascript·spring boot·python·django·flask·php
Vec‑Jie3 天前
MerchantOps-KBQA 实践(十四):本地运行、性能限制与可验证的交付边界
人工智能·后端·python·flask
mqiqe4 天前
LLM Gateway:企业级大模型应用的“统一控制平面”
平面·flask·gateway
aGdF8E3gQ5 天前
【Application Insights】采样率对Function App日志收集的影响和解决方法
python·flask·wpf
编码者卢布5 天前
【Azure APIM】通过 API Management 公开API为 MCP Server 的试验 (二)
microsoft·flask·azure
编码者卢布6 天前
【Azure APIM】通过 API Management 公开现有 MCP Server 的试验 (一)
microsoft·flask·azure