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问题解决
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
PyTorch 简单易懂的实现 CosineSimilarity 和 PairwiseDistance - 距离度量的操作
目录 torch.nn子模块Distance Functions解析 nn.CosineSimilarity 功能 主要参数 输入和输出的形状 使用示例 nn.PairwiseDistance 功能 主要参数 输入和输出的形状 使用示例 总结 torch.nn子模块Distance Functions解析 nn.CosineSimilarity torc…...
app加载不到aar中的so库
如何将so文件打入到aar包中 1 在main下面新建jniLibs目录并将so放进去 2 在android{}中添加 sourceSets {main {jniLibs.srcDir file(jni/)}}app引用不到aar中的so文件(巨坑,不去查谁知道啊) 在aar 的manifeset application标签中中添加 android:extractNativeLi…...
vue-springboot基于java的实验室安全考试系统
本系统为用户而设计制作实验室安全考试系统,旨在实现实验室安全考试智能化、现代化管理。本实验室安全考试管理自动化系统的开发和研制的最终目的是将实验室安全考试的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的…...
mysql+关掉密码过期
mysql关掉密码过期 要在MySQL中关闭密码过期功能,可以按照以下步骤进行操作: 登录到MySQL服务器。 使用管理员账户(如root)连接到数据库。 mysql -uroot -ppassword 运行以下命令来查看当前的密码过期设置: SHOW…...
实际项目中的环形缓冲区
在实际项目中,环形缓冲区的设计要比之前讲到的原型稍微复杂一些,需要一些接口函数来实现数据结构封装。GitHub上有个大帅哥写了一个轻量的环形缓冲区库,可以学习参考,也可以直接集成到自己的项目中,功能已经非常完善。…...
输出回文数-第11届蓝桥杯选拔赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第23讲。 输出回文数&#…...
内存溢出会导致模块测试正常,植入系统失败
前些天,遇到了一个问题:需要在系统中添加一个小功能,单独测试,然后植入系统。 代码使用了从网上下载的函数,模块单独运行,没有问题,但是放在系统中运行就会出问题。 不得已的情况下,…...
【taro react】 ---- QRCode 二维码生成
1. 需求分析 需要将输入的值转换为图片资源;由于只是单纯的展示,所以不需要很多比如加 logo 等复杂功能;不需要后端生成,直接前端操作;使用的第三方库尽可能小,功能单一;最后选择使用 qrcode-generator 库,只有 40kb。2. 使用第三方库 qrcode-generator 3. 转换 base…...
rk3566 armbian修复usb2.0并挂载U盘
文章目录 usb接口修复一 执行命令二 修改rk3566-panther-x2.dts⽂件三 查看是否识别 U盘格式化、挂载一 U盘格式化1.1 查看U盘1.2 查看U盘文件系统类型1.3 格式化为ext4系统 二 挂载U盘2.1 手动挂载2.2 自动挂载(可选) usb接口修复 一 执行命令 将位于…...
猫头虎博主第9期赠书活动:《YOLO目标检测》计算机AI视觉实战YOLO人工智能目标检测与跟踪图像处理深度学习图像检测书籍
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…...
建设微信商城网站制作/典型的口碑营销案例
线性判别 文章目录线性判别1 线性判别与非线性判别2 样本集的线性可分性3 非线性判别问题转化成线性判别问题4 多分类线性判别4.1 绝对可分方式4.2 两两可分方式4.3 最大值可分方式5 线性判别函数的几何意义1 线性判别与非线性判别 我们知道,要实现模式识别&#x…...
网站制作是不是要一个后台/网站建设合同
账号管理 -新增与移除使用者: useradd, useradd 参考档, passwd, chage, usermod, userdel -用户功能:finger, chfn, chsh, id -新增与移除群组:groupadd, groupmod, groupdel, gpasswd 群组管理员 主机的细部权限规划:AC…...
门户网站制作全包/网络营销软文范例500字
1.检测是否安装httpd 软件包 rpm -q httpd httpd-2.4.6-67.el7.centos.x86_642.重启服务,并且设置开机自启动 # systemctl restart httpd[rootroom9pc01 ~]# systemctl enable httpd3.创建目录 # mkdir /var/www/html/rhel74.挂载yum镜像 mount /iso/rhel-server-7.…...
wordpress的域名不备案/百度收录软件
一、简介:BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代…...
wordpress 官方网站/服务营销策划方案
--select into 从一个表复制数据值内容到另外一个表里面,把数据插入到另外一个新表中/* 一般插入语句都是insert into 表 () values ()特殊需要就要用这种方法了insert into 表1 () select ....from 表2 复杂一点的,比如涉及到2个以上的表:insert into 表名1(字段1,字段2,字…...
中国建设银行投诉网站/品牌维护
目录前言场景防抖核心解释修复场景例子节流核心解释修复场景例子尾言前言 防抖和节流,这是前端防止用户频繁调用同一个接口的方法,比如短时间重复点击上传同一个文件,短时间重复点击提交同一个评论,异步的操作还没给你带来反馈&a…...