当前位置: 首页 > news >正文

flask web学习之模板(一)

文章目录

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

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

一、模板基本用法

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

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

  • if 控制结构
{% if user.bio %}
<h1>hahha</h1>
{% else %}
<h1>wuwuwu</h1>
{% endif %}
  • for 控制结构
{% for item in items %}
<li>{{item.e}}</li>
{% 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_templateapp = 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_stringapp = Flask(__name__)@app.route('/')
def index():data = {'title': 'Welcome to My Website','content': 'This is some content for the page.'}template_string = """<h1>{{ title }}</h1><p>{{ content }}</p>"""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|safe }}
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): 这是一个方法,用于根据给定的模板字符串创建一个模板对象。你可以使用这个方法动态创建模板,而无需从文件中加载。

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

相关文章:

flask web学习之模板(一)

文章目录 一、模板基本用法1.1 定界符1.2 模板语法1.3 渲染模板 二、模板辅助工具2.1 上下文2.2 全局对象2.3 过滤器2.4 测试器2.5 模板环境对象 在动态web程序中&#xff0c;视图函数返回的HTML数据往往需要根据相应的变量&#xff08;比如查询参数&#xff09;动态生成。当HT…...

RedisInsight - Redis官方可视化工具

一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#…...

Matlab定义函数计算斐波那契数列

以下是使用 MATLAB 定义函数计算并输出斐波那契数列前 200 个数的示例代码&#xff1a; function result fibonacci(n)if n < 1 || n > 200result NaN;elseif n 1 || n 2result 1;elseresult fibonacci(n-1) fibonacci(n-2);end endn 200; result fibonacci(n)…...

计算机网络面试题总结

总结自Network | JavaGuide(Java面试 学习指南) 什么是OSI7层模型&#xff1f; 什么是TCP/IP 四层模型&#xff1f; 为什么网络要分层&#xff1f; 应用层有哪些常见的协议&#xff1f; 传输层有哪些常见的协议&#xff1f; 网络层有哪些常见的协议&#xff1f; 从输入…...

视频转为序列图的软件,让视频批量转为序列图

你是否曾经遇到过这样的困境&#xff1a;需要将一段视频转为一系列的图片&#xff0c;但却没有合适的工具来完成&#xff1f;或许你曾经手动截图&#xff0c;或者用其他方式&#xff0c;但结果往往不尽如人意&#xff0c;图片质量差、色彩失真、画面不清晰。现在&#xff0c;让…...

目标检测中的常见指标

概念引入&#xff1a; TP&#xff1a;True Positive IoU > 阈值 检测框数量 FP: False Positive IoU < 阈值 检测框数量 FN: False Negative 漏检框数量 Precision:查准率 Recall:查全率&#xff08;召回率&#xff09; AP&am…...

QT上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的控件当中&#xff0c;除了label、edit、radio、combobox和button之外&#xff0c;另外一个用的比较多的控件就是grid&#xff0c;也可称之为…...

小程序实现绘制图片 保存到手机

HTML <template><view><canvas canvas-id"myCanvas" :style"{height:380px,width:wWidthpx,background:#FFFFFF}"></canvas><view class"textCenter"><button click"saveCanvas">保存图片</b…...

Elasticsearch基本操作之索引操作

本文说下Elasticsearch基本操作之索引操作 文章目录 概述创建索引创建索引示例重复创建索引示例 查看索引查看所有索引查看单个索引 删除索引删除索引 概述 由于是使用命令来操作Elasticsearch&#xff0c;可以使用kibana&#xff0c;postman和apifox等工具 我使用了apifox来执…...

调用Java线程相关的API为什么能够控制操作系统线程?

今天我们解决Java线程的这五个问题&#xff1a; Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说&#xff0c;深入理解…...

【办公技巧】excel中设置选项按钮的方法

大家是否会遇到需要勾中选项的情况&#xff0c;我们可以在电子表格中制作出可以勾选、选中的选项按钮&#xff0c;今天我们一起学习一下设置方法。 首先&#xff0c;我们需要先在excel工具栏中添加一个功能模块&#xff1a;开发工具 依次点击excel中的文件 – 选项 – 自定义…...

如何编写高效的正则表达式?

正则表达式&#xff08;Regular Expression&#xff0c;简称regex&#xff09;是一种强大的文本处理技术&#xff0c;广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践&#xff0c;帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…...

vue3中使用pinia,更改state中数据,试图不更新问题

直接上代码 使用computed&#xff0c;可以实现。...

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…...

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本&#xff0c;项目安装eslint配置2.3 安装完成后&#xff0c;后面启动项目还缺少一些依赖&#xff0c;提前按需安装好 三&#xff0c;修改eslintrc.…...

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…...

Linux 常用基础命令(2024年最新篇)新手小白必看 初识Linux

CSDN 成就一亿技术人&#xff01; 2024年 借助这篇文章 重新整理Linux 基础常用命令 CSDN 成就一亿技术人&#xff01; 上命令 一 &#xff0c;Linux语法格式 学习命令要掌握命令的格式 command [options] [arguments] 命令 选项 参数 二&#xff0c;Linux基础…...

Golang中for和for range语句的使用技巧、对比及常见的避坑

前言 基础语法不再赘述&#xff0c;写这个原因是之前的某次面试被问道了&#xff0c;我知道会导致问题但具体答下来不是很通顺。再回想自己开发过程中&#xff0c;很多地方都是使用到了for/for range&#xff0c;但是却从没注意过一些细节&#xff0c;因此专门学习一下进行记录…...

Nestjs 微服务实战 - 动态微服务创建链接

所有的微服务都需要做服务治理 服务治理包括&#xff08;配置中心、服务发现、注册服务等等&#xff09;&#xff0c;常见的包括 Java 的 Nacos&#xff0c;这里不关注与服务治理&#xff0c;只说明&#xff0c;如何用 nest 网关&#xff0c;并且在网关层动态实现微服务注入 …...

K8S部署pod状态CreateContainerConfigError问题解决

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...