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程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成。当HT…...
RedisInsight - Redis官方可视化工具
一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持&#…...
Matlab定义函数计算斐波那契数列
以下是使用 MATLAB 定义函数计算并输出斐波那契数列前 200 个数的示例代码: 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层模型? 什么是TCP/IP 四层模型? 为什么网络要分层? 应用层有哪些常见的协议? 传输层有哪些常见的协议? 网络层有哪些常见的协议? 从输入…...
视频转为序列图的软件,让视频批量转为序列图
你是否曾经遇到过这样的困境:需要将一段视频转为一系列的图片,但却没有合适的工具来完成?或许你曾经手动截图,或者用其他方式,但结果往往不尽如人意,图片质量差、色彩失真、画面不清晰。现在,让…...
目标检测中的常见指标
概念引入: TP:True Positive IoU > 阈值 检测框数量 FP: False Positive IoU < 阈值 检测框数量 FN: False Negative 漏检框数量 Precision:查准率 Recall:查全率(召回率) AP&am…...
QT上位机开发(会员充值软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所有的控件当中,除了label、edit、radio、combobox和button之外,另外一个用的比较多的控件就是grid,也可称之为…...
小程序实现绘制图片 保存到手机
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,可以使用kibana,postman和apifox等工具 我使用了apifox来执…...
调用Java线程相关的API为什么能够控制操作系统线程?
今天我们解决Java线程的这五个问题: Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说,深入理解…...
【办公技巧】excel中设置选项按钮的方法
大家是否会遇到需要勾中选项的情况,我们可以在电子表格中制作出可以勾选、选中的选项按钮,今天我们一起学习一下设置方法。 首先,我们需要先在excel工具栏中添加一个功能模块:开发工具 依次点击excel中的文件 – 选项 – 自定义…...
如何编写高效的正则表达式?
正则表达式(Regular Expression,简称regex)是一种强大的文本处理技术,广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践,帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…...
vue3中使用pinia,更改state中数据,试图不更新问题
直接上代码 使用computed,可以实现。...
【前端设计】文字聚光灯
欢迎来到前端设计专栏,本专栏收藏了一些好看且实用的前端作品,使用简单的html、css语法打造创意有趣的作品,为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…...
从零开始搭建企业级前端项目模板(vue3+vite+ts)
文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本,项目安装eslint配置2.3 安装完成后,后面启动项目还缺少一些依赖,提前按需安装好 三,修改eslintrc.…...
ElasticSearch的DSL查询语法解析
Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询:会对用户输入内容分词,常用于搜索框搜索 ,语法: 3.2 multi match…...
Linux 常用基础命令(2024年最新篇)新手小白必看 初识Linux
CSDN 成就一亿技术人! 2024年 借助这篇文章 重新整理Linux 基础常用命令 CSDN 成就一亿技术人! 上命令 一 ,Linux语法格式 学习命令要掌握命令的格式 command [options] [arguments] 命令 选项 参数 二,Linux基础…...
Golang中for和for range语句的使用技巧、对比及常见的避坑
前言 基础语法不再赘述,写这个原因是之前的某次面试被问道了,我知道会导致问题但具体答下来不是很通顺。再回想自己开发过程中,很多地方都是使用到了for/for range,但是却从没注意过一些细节,因此专门学习一下进行记录…...
Nestjs 微服务实战 - 动态微服务创建链接
所有的微服务都需要做服务治理 服务治理包括(配置中心、服务发现、注册服务等等),常见的包括 Java 的 Nacos,这里不关注与服务治理,只说明,如何用 nest 网关,并且在网关层动态实现微服务注入 …...
K8S部署pod状态CreateContainerConfigError问题解决
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
