【Flask 系统教程 4】Jinjia2模版和语法

Jinjia2 模板

模板的介绍

Jinja2 是一种现代的、设计优雅的模板引擎,它是 Python 的一部分,由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码,以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰,易于学习和使用。

模板的使用

from flask import Flask, render_templateapp = Flask(__name__, template_folder="custom_templates")  @app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=True)

template_folder指定模板文件夹 默认是同级目录的 templates

  • 在以上案例下的文件架构如下
project_folder/
│
├── flask_app.py
│
└── custom_templates/│└── index.html

模板传递参数

当我们需要通过传递参数来修改模板中的内容时,就可以通过模板传参来实现

# app.py
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 定义要传递给模板的参数user = {'username': 'John', 'age': 30}fruits = ['Apple', 'Banana', 'Orange', 'Mango']return render_template('index.html', user=user, fruits=fruits)if __name__ == '__main__':app.run(debug=True)
<!--index.html-->
<!DOCTYPE html>
<html>
<head><title>Flask Template Example with Parameters</title>
</head>
<body><h1>Hello, {{ user.username }}!</h1><p>You are {{ user.age }} years old.</p><h2>Favorite Fruits:</h2><ul>{% for fruit in fruits %}<li>{{ fruit }}</li>{% endfor %}</ul>
</body>
</html>
  • 显示效果
    在这里插入图片描述

使用字典传参

对模板传参也支持使用字典的办法

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 定义要传递给模板的参数data = {'user': {'username': 'John', 'age': 30},'fruits': ['Apple', 'Banana', 'Orange', 'Mango']}return render_template('index.html', **data) # 这里使用**进行解包,这是Python3的特性if __name__ == '__main__':app.run(debug=True)

使用**解包传参,避免多参数的传参不便

模板中使用url_for函数

# app.py
from flask import Flask, render_template, url_forapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html')@app.route('/hello')
def hello():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)
<!--index.html-->
<!DOCTYPE html>
<html>
<head><title>Flask Template Example with url_for()</title>
</head>
<body><h1>Hello, Flask!</h1><p>This is a template example.</p><p><a href="{{ url_for('hello') }}">Say Hello</a></p>
</body>
</html>

模板继承

继承允许你创建一个基础模板,并在其他模板中扩展它。

<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}{% endblock %}</title>
</head>
<body>{% block content %}{% endblock %}
</body>
</html>

在父模板中定义 block代表可变对象,语法 {% block block_name %} {% endblock %}

<!-- index.html -->
{% extends "base.html" %}{% block title %}Home{% endblock %}{% block content %}<h1>Hello, {{ name }}!</h1>
{% endblock %}

使用 extends 继承模板,使用 {% block block_name %}...{% endblock %}即可实现更改内容

include模板导入

在 Jinja2 模板中, include 指令允许你将一个模板导入到另一个模板中。这样可以使模板更具有模块化和可重用性,使代码更易于维护和管理。通过 include 指令,你可以将一个模板的内容嵌入到另一个模板中的任意位置。

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=True)
  • 定义 index.html作为主页
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>include</title>
</head>
<body>
<div class="container">{% include 'header.html' %}<h4>主题内容</h4>{% include 'footer.html' %}
</div>
</body>
</html>
  • 定义 header.html用来显示头部
<!-- header.html -->
<header><h1>Header</h1><nav><ul><li><a href="/">Home</a></li><li><a href="/about">About</a></li><li><a href="/contact">Contact</a></li></ul></nav>
</header>
  • 定义 footer.html用来显示脚部
<!-- footer.html -->
<footer><p>&copy; 2024 Flask Template Example. All rights reserved.</p>
</footer>
  • 效果
    在这里插入图片描述

使用静态资源

在 Web 开发中,静态资源(如样式表、JavaScript 文件、图像等)是构建用户界面和功能的重要组成部分。在 Flask 应用中,你可以使用静态资源来美化页面样式、增强交互性,并为用户提供更丰富的体验。下面是如何在 Flask 中使用静态资源的简单介绍:

组织静态资源文件夹

首先,你需要在 Flask 项目中创建一个文件夹来存放静态资源文件,通常命名为 static。在这个文件夹中,你可以按照你的项目结构组织样式表、JavaScript 文件、图像等静态文件。

your_flask_app/
│
├── static/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── img/
│       └── logo.png
│
├── templates/
│   └── index.html
│
└── app.py

使用静态资源

一旦你有了静态资源文件夹,你可以在模板中通过使用 url_for 函数来引用这些静态资源。例如,在模板中引用样式表文件 style.css

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>My Flask App</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><h1>Welcome to My Flask App</h1><img src="{{ url_for('static', filename='img/logo.png') }}" alt="Logo"><script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>

在这个示例中,url_for('static', filename='path/to/resource') 函数用于生成静态资源的 URL。在调用时,第一个参数 'static' 是 Flask 中默认用于静态资源的端点,而第二个参数 'filename' 是静态资源的路径。

设置静态文件夹地址

from flask import Flask, render_templateapp = Flask(__name__, static_folder="static2")  # 设置静态文件夹地址为 static2
# 第二种方式 app.static_folder = 'static2'@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=True)

Jinjia2 语法

Jinja2 是一种现代的、设计优雅的模板引擎,它为开发者提供了一种简单而强大的方式来创建动态内容。Jinja2 的语法清晰简洁,易于学习和使用。在这里,我将详细介绍 Jinja2 的主要语法元素:

定义变量

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask Template Example</title>
</head>
<body>{% set title = "Title" %}{% with subtitle="subtitle" %}{% set combined_title = title + " " + subtitle %}<h1>{{ combined_title }}</h1>{% with paragraph="This is the paragraph content of my website." %}<p>{{ paragraph }}</p>{% endwith %}{% endwith %}<!--  此处出了with的范围则不可使用其中变量subtitle等  -->
</body>
</html>

with只在范围内可用, set则是全局, with set可以结合使用


插入变量

在 Jinja2 中,你可以使用双大括号 {{ ... }} 来插入变量。这些变量将在渲染模板时替换为实际的值。

<p>Hello, {{ name }}!</p>

流程控制

Jinja2 支持常见的控制结构,如条件语句和循环。控制结构使用 {% ... %} 包裹。

条件语句

# app.py
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 假设这是从后端传递给前端的数据user = {'username': 'Alice', 'age': 30}return render_template('index.html', user=user)if __name__ == '__main__':app.run(debug=True)
<!--index.html-->
<!DOCTYPE html>
<html>
<head><title>选择结构示例</title>
</head>
<body><h1>欢迎访问我的网站!</h1><p>用户信息:</p><ul><li>用户名:{{ user.username }}</li><li>年龄:{{ user.age }}</li></ul>{% if user.age < 18 %}<p>您未满18岁,属于未成年人。</p>{% elif user.age >= 18 and user.age < 60 %}<p>您已满18岁,属于成年人。</p>{% else %}<p>您已年满60岁,属于老年人。</p>{% endif %}
</body>
</html>
  • 效果
    在这里插入图片描述

循环

from flask import Flask, render_templateapp = Flask(__name__)# 假设这是你的数据
items = {"Apple": "Red","Banana": "Yellow","Orange": "Orange","Grapes": "Purple"
}@app.route('/')
def index():return render_template('index.html', items=items)if __name__ == '__main__':app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask Jinja2 Example</title>
</head>
<body><h1>Fruit Colors</h1><ul>{% for fruit, color in items.items() %}<li>{{ fruit }}: {{ color }}</li>{% endfor %}</ul>
</body>
</html>
  • 效果
    在这里插入图片描述

注释

你可以在模板中使用 {#...#}添加注释,这些注释不会在最终渲染的输出中显示。

{# This is a comment #}

过滤器

过滤器允许你在输出中应用转换。它们以管道符 | 的形式使用。

官方使用文档

<p>{{ sentence|capitalize }}</p>
过滤器描述示例用法
capitalize将变量的首字母转换为大写。{{ variable_name|capitalize }}
lower将变量转换为小写。{{ variable_name|lower }}
upper将变量转换为大写。{{ variable_name|upper }}
title将每个单词的首字母转换为大写。{{ variable_name|title }}
trim移除变量的首尾空格。{{ variable_name|trim }}
escape将 HTML 转义为安全的字符串。{{ variable_name|escape }}
safe标记变量为安全,告诉模板引擎不要转义该变量。{{ variable_name|safe }}
length返回变量的长度。{{ variable_name|length }}
default如果变量为 False、None 或空,使用默认值。 {{variable_name|default('default_value',boolean=True)}}
简单办法 {{ variable_name or "default_value" }}
urlencode对 URL 进行编码。{{ variable_name|urlencode }}
join使用指定字符将列表中的元素连接起来。{{ list_variable|join(', ') }}
slice从列表中取出一部分元素。{{ list_variable|slice(start, stop) }}
sort对列表进行排序。{{ list_variable|sort }}
reverse将列表倒序。{{ list_variable|reverse }}
dictsort对字典按键或值进行排序。{{ dict_variable|dictsort(attribute='key') }}
abs返回变量的绝对值。{{ variable_name|abs }}
round四舍五入到指定的小数位数。{{ variable_name|round(precision=2) }}
striptags删除字符串中所有的
HTML标签,如果出
现多个空格,将替换
成一个空格
{{ variable_name|striptags }}
replace字符串替换 {{ text |replace('old', 'new') }}

自定义过滤器

# app.py
from flask import Flask, render_templateapp = Flask(__name__)# @app.template_filter("reverse") # 注册自定义过滤器
def reverse_filter(s):  # 自定义过滤器函数return s[::-1]app.jinja_env.filters['reverse'] = reverse_filter  # 注册自定义过滤器的第二种方法# 路由
@app.route('/')
def index():# 在模板中使用自定义过滤器message = "Hello, World!"return render_template('index.html', message=message)if __name__ == '__main__':app.run(debug=True)

使用装饰器或者 app.jinja_env.filters都可以设置过滤器

<!--index.html-->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Custom Filter Example</title>
</head>
<body>
<p>origin message: {{ message }}</p>
<p>Reversed message: {{ message | reverse }}</p>
</body>
</html>

定义宏

宏类似于函数,允许你定义可重用的代码块。

  • 宏没有返回值

Python文件中定义宏

from flask import Flask, render_templateapp = Flask(__name__)# 定义一个简单的宏,用于在模板中显示消息
@app.template_global()
def display_message(message):return f"Message: {message}"@app.route('/')
def index():return render_template('index.html', message="Hello, world!")if __name__ == '__main__':app.run(debug=True)

py文件中直接定义了宏方法,可在 html文件中直接使用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask Template Example</title>
</head>
<body><!-- 使用宏显示消息 -->{{ display_message(message) }}
</body>
</html>

html文件中定义宏

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask Template Example</title>
</head>
<body><!-- 定义宏 -->{% macro display_message(message) %}<p>Message: {{ message }}</p>{% endmacro %}<!-- 使用宏 -->{{ display_message("Hello, world!") }}
</body>
</html>
  • 效果
    在这里插入图片描述

宏文件引用

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html', message="Hello, world!")if __name__ == '__main__':app.run(debug=True)
<!-- 引入宏文件并传递变量 -->
{% import 'macros/macros.html' as macros with context %}
<!--引入宏而不传递变量-->
{% import 'macros/macros.html' as macros %}<!-- 另一种引入方式 -->
{% from 'macros/macros.html' import display %}<!-- 使用宏并传参 -->
{{ macros.display_message(message) }}
<!-- 使用宏 -->
{{ display() }}
  • 在引入宏的时候,可以使用 with context来共享变量,意思是此时的宏中能直接使用当前环境下有的变量。
  • 注意文件架构
project_folder/
│
├── flask_app.py
│
└── macros/│└── macros.html
<!-- macros.html -->
{% macro display_message(content) %}
<p>Content: {{ content }}</p>
{% endmacro %}{% macro display(content) %}
<p>Content: {{ message }}</p>
{% endmacro %}

变量过滤器

Jinja2 提供了一些内置的变量过滤器,用于对变量进行处理,例如格式化日期、字符串截断等。

{{ user.created_at|date("Y-m-d") }}

转义

在插入变量时,默认情况下 Jinja2 会自动转义 HTML 字符,以防止 XSS 攻击。但是,你也可以使用 safe 过滤器来禁用转义。

{{ unsafe_html|safe }}

过滤器链

你可以将多个过滤器串联在一起,以便在一个变量上应用多个转换。

{{ sentence|capitalize|truncate(50) }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/319672.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

【多模态大模型】AI对视频内容解析问答

文章目录 1. 项目背景2. 直接对视频进行解析进行AI问答&#xff1a;MiniGPT4-Video2.1 MiniGPT4-Video效果 3. 对视频抽帧为图片再进行AI问答3.1 视频抽帧3.2 图片AI问答3.2.1 阿里通义千问大模型 Qwen-vl-plus3.2.2 Moonshot 1. 项目背景 最近在做一个项目,需要使用AI技术对视…

Git常用(持续更新)

常用场景&#xff1a; 初始化&#xff1a; git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交&#xff1a; gi…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能&#xff1a; 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听&#xff0c;达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml&#xff0c;两者仅…

500行代码实现贪吃蛇(1)

文章目录 目录1. Win32 API 介绍1.1 Win32 API1.2 控制台程序&#xff08;Console&#xff09;1.3 控制台屏幕上的坐标COORD1.4 [GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5 [GetConsoleCursorInfo](https://learn.microsoft.com/zh-c…

2024年 Java 面试八股文——SpringBoot篇

目录 1. 什么是 Spring Boot&#xff1f; 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点&#xff1f; 5. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f; 6. Spring Boot 支持哪些日志框架&#…

Flutter笔记:Widgets Easier组件库(4)使用按钮组

Flutter笔记 Widgets Easier组件库&#xff08;4&#xff09;&#xff1a;使用按钮组 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…

【小浩算法 BST与其验证】

BST与其验证 前言我的思路思路一 中序遍历判断数组无重复递增思路二 递归边界最大值最小值的传递 我的代码测试用例1测试用例2 前言 BST是二叉树一个经典应用&#xff0c;我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树&…

机器学习-K近邻算法(KNN)

目录 什么是KNN算法 图解KNN基本算法 &#xff08;1&#xff09;k近邻算法中k的选取 &#xff08;2&#xff09;距离函数 &#xff08;3&#xff09;归一化处理 &#xff08;4&#xff09;概率kNN KNN算法的优缺点 优势 缺点 KNN算法总结 什么是KNN算法 k近邻算法&…

农作物害虫检测数据集VOC+YOLO格式18975张97类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;18975 标注数量(xml文件个数)&#xff1a;18975 标注数量(txt文件个数)&#xff1a;18975 标…

周三多《管理学原理》第3版/考研真题/章节练习题

普通高等教育“十一五”国家级规划教材《管理学原理》&#xff08;第3版&#xff0c;周三多、陈传明、龙静编著&#xff0c;南京大学出版社&#xff09;是我国高校广泛采用的管理学权威教材之一&#xff0c;也被众多高校&#xff08;包括科研机构&#xff09;指定为考研考博专业…

电脑技巧:推荐一款非常好用的媒体播放器PotPlayer

目录 一、 软件简介 二、功能介绍 2.1 格式兼容性强 2.2 高清播放与硬件加速 2.3 自定义皮肤与界面布局 2.4 多音轨切换与音效增强 2.5 字幕支持与编辑 2.6 视频截图与录像 2.7 网络流媒体播放 三、软件特色 四、使用技巧 五、总结 一、 软件简介 PotPlayer播放器 …

排序-八大排序FollowUp

FollowUp 1.插入排序 (1).直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

能源监控新方案:IEC104转MQTT网关在新能源发电中的应用

需求背景 近些年&#xff0c;我国新能源产业快速发展&#xff0c;光伏、风电等新能源项目高速增长&#xff0c;新能源发电已经成为国家能源结构的重要组成部分。 打造数字化、智能化、信息化的电力物联网系统&#xff0c;实现光伏风电等新能源发电站的远程监控、远程维护是新能…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

数据库开发关键之与DQL查询语句有关的两个案例

案例 案例1 条件分页查询 查看项目经理提供给我们的需求文档 模糊匹配的含义是 只要包含"张"就可以 use dduo;-- 按照需求完成员工管理的条件分页查询 根据输入条件 查询第一页的数据 每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a; 张 -- 年龄&…

【Java】基本程序设计结构(一)

前言&#xff1a;现在&#xff0c;假定已经成功安装了JDK&#xff0c;并且能够运行上篇示例程序。本篇将开始介绍Java程序中的基本设计结构&#xff0c;其中包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&…

n-Track Studio Suite for Mac激活版:打造您的专属音频工作室

n-Track Studio Suite for Mac是一款功能强大的数字音频工作站软件&#xff0c;让您在家中就能享受到专业录音棚的待遇。无论是录制人声、乐器还是MIDI序列&#xff0c;都能轻松应对。 n-Track Studio Suite for Mac激活版下载 这款软件拥有实时音高校准、时间拉伸和自动补足功…

HT32F52352 -- 解锁电调、电机速度控制

一、问题背景 1.1 硬件&#xff1a; 电池组&#xff0c;电子调速器&#xff08;好盈电调 /ESC&#xff09;&#xff0c;接收机&#xff08;HT32F52352&#xff09;&#xff0c;风扇。 1.2 软件 keil5 二、问题分析 通过1.1图中可知&#xff0c;我们只需要使用 HT32F52352 模拟…