Flask(四) 模板渲染render_template

文章目录

  • 📦 过程详解(路由 <-> HTML 模板)
    • 🧠 数据是怎么传过去的?
    • 多变量示例
  • ✅ Jinja2 支持条件判断、循环、模板继承:
  • ✅ 安全性
    • 🔒 Flask 默认也会对变量进行 HTML 转义:
    • 📍 {{ chart | safe }}
      • 在 pyecharts 中怎么用?
  • 📦模板继承
    • 🧱 文件结构示例
      • base.html(母板模板)
      • index.html(子模板)
      • login.html(子模板)
  • 📦过滤器
  • 📦宏和模板包含
  • 📦 Flask-Login 登录系统
    • 1、安装 Flask-Login:
    • 2、初始化 LoginManager
    • 3、用户模型实现:
    • 4、登录与登出视图示例:
    • 5、当前登录的用户
      • 含义解释
    • 其他常用方法

Flask 使用 Jinja2 模板引擎来处理模板渲染。模板渲染允许你将动态内容插入到 HTML 页面中,使得应用能够生成动态的网页内容。

  • 创建模板:将 HTML 文件放在 templates 文件夹中,使用 Jinja2 占位符。
  • 渲染模板:使用 render_template 函数在视图函数中渲染模板。
  • 模板继承:创建基础模板,允许其他模板继承和扩展。
  • 控制结构:使用条件语句和循环在模板中控制逻辑。
  • 过滤器:使用过滤器格式化变量数据。
  • 宏和模板包含:创建和使用宏以及模板包含,提高模板的复用性。
  • 安全性:Jinja2 默认对模板变量进行自动转义以防止 XSS 攻击。
  • 模板上下文:将数据传递给模板,并在模板中使用这些数据。

📦 过程详解(路由 <-> HTML 模板)

浏览器请求:GET /hello↓
Flask 匹配 @app.route('/hello') → 调用 hello() 函数↓
hello() 中使用 render_template() 渲染 hello.html↓
将 name="张三" 传入模板引擎 Jinja2↓
Jinja2 渲染出 HTML: <h1>你好, 张三!</h1>↓
Flask 把 HTML 打包成 Response 对象返回浏览器↓
浏览器显示页面

🧠 数据是怎么传过去的?

render_template("模板名.html", 变量名1=1, 变量名2=2, ...)

模板中用 {{ 变量名 }} 就能访问到。

多变量示例

@app.route('/dashboard')
def dashboard():stats = {"pv": 1000, "uv": 300}return render_template('dashboard.html', stats=stats, username="admin")

templates/dashboard.html

<h2>欢迎, {{ username }}</h2>
<p>页面浏览量:{{ stats.pv }}</p>
<p>独立访客数:{{ stats.uv }}</p>

✅ Jinja2 支持条件判断、循环、模板继承:

{% if user %}<p>欢迎 {{ user }}!</p>
{% else %}<p>请先登录</p>
{% endif %}

{% if user %}:检查 user 变量是否存在,如果存在,则显示欢迎消息,否则显示登录提示。

循环语句:

<ul>
{% for item in items %}<li>{{ item }}</li>
{% endfor %}
</ul>

{% for item in items %}:遍历 items 列表,并为每个项生成一个 <li> 元素。

✅ 安全性

自动转义:Jinja2 默认会对模板中的变量进行自动转义,防止 XSS 攻击。
{{ user_input }}:用户输入的内容会被自动转义,以避免恶意脚本的注入。

🔒 Flask 默认也会对变量进行 HTML 转义:

比如

chart = "<script>alert('Hi')</script>"

在模版中写

{{ chart }}

浏览器会看到:

&lt;script&gt;alert('Hi')&lt;/script&gt;

因为 Flask 模板会自动进行 HTML 安全转义。

📍 {{ chart | safe }}

{{ chart | safe }} 是 Flask 模板中一个非常常见的写法,特别用于像 pyecharts、plotly 等图表库,把图表插入 HTML 页面的关键语句。
{{ chart | safe }} 意思是把 chart 的内容作为 HTML 原样输出(不再自动转义)

在 pyecharts 中怎么用?

pyecharts 生成的图表是一个 HTML

from pyecharts.charts import Bar
from pyecharts import options as optsbar = (Bar().add_xaxis(["A", "B", "C"]).add_yaxis("销量", [10, 20, 30])
)
chart = bar.render_embed()

在 Flask 中渲染:

return render_template("chart.html", chart=chart)

模板中这样写:

<div>{{ chart | safe }}
</div>

这样图表就会在页面中正常显示!

请不要对用户输入的数据使用 | safe,除非你已经对内容做过严格校验,否则可能产生 XSS 攻击漏洞。

📦模板继承

模板继承允许你创建一个基础模板,然后在其他模板中继承和扩展这个基础模板,避免重复的 HTML 代码。

创建基础模板:在 templates 文件夹中创建一个基础模板 base.html。

templates/base.html 示例:

<!DOCTYPE html>
<html>
<head><title>{% block title %}My Website{% endblock %}</title>
</head>
<body><header><h1>My Website</h1></header><main>{% block content %}{% endblock %}</main><footer><p>Footer content</p></footer>
</body>
</html>

{% block title %} {% endblock %} {% block content %} {% endblock %} 是定义的可替换区域。
创建子模板:在 templates 文件夹中创建一个子模板 index.html,继承 base.html。

templates/index.html 文件代码:

{% extends "base.html" %}{% block title %}Home Page{% endblock %}{% block content %}
<h2>Welcome to the Home Page!</h2>
<p>Content goes here.</p>
{% endblock %}

{% extends "base.html" %}:继承基础模板。

{% block title %} {% block content %}:重写基础模板中的块内容。

🧱 文件结构示例

templates/
├── base.html        ← 通用母版模板
├── index.html       ← 首页(继承 base)
└── login.html       ← 登录页(继承 base

base.html(母板模板)

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>{% block title %}默认标题{% endblock %}</title><link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body><header><h1>我的网站</h1><nav><a href="{{ url_for('index') }}">首页</a> |<a href="{{ url_for('login') }}">登录</a></nav></header><main>{% block content %}{% endblock %}</main><footer><p>版权所有 © 2025</p></footer>
</body>
</html>

index.html(子模板)

{% extends "base.html" %}{% block title %}首页{% endblock %}{% block content %}
<h2>欢迎访问首页</h2>
<p>这里是首页内容</p>
{% endblock %}

login.html(子模板)

{% extends "base.html" %}{% block title %}登录{% endblock %}{% block content %}
<h2>登录页面</h2>
<form method="post">用户名: <input name="username"><br>密码: <input name="password" type="password"><br><button type="submit">登录</button>
</form>
{% endblock %}

📦过滤器

过滤器用于在模板中格式化和处理变量数据。

<p>{{ name|capitalize }}</p>
<p>{{ price|round(2) }}</p>

{{ name|capitalize }}:将 name 变量的值首字母大写。
{{ price|round(2) }}:将 price 变量的值四舍五入到小数点后两位。

📦宏和模板包含

宏是可重用的模板片段。模板包含允许你在一个模板中插入另一个模板的内容。
创建宏

templates/macros.html 代码文件:
实例
{% macro render_item(item) %}<div><h3>{{ item.title }}</h3><p>{{ item.description }}</p></div>
{% endmacro %}

使用宏:

templates/index.html 文件代码:
实例

{% from "macros.html" import render_item %}<h1>Items</h1>
{% for item in items %}{{ render_item(item) }}
{% endfor %}

{% from "macros.html" import render_item %}:导入宏。
{{ render_item(item) }}:调用宏来渲染每个 item。

📦 Flask-Login 登录系统

1、安装 Flask-Login:

pip install flask-login

2、初始化 LoginManager

from flask_login import LoginManagerlogin_manager = LoginManager()
login_manager.init_app(app)@login_manager.user_loader
def load_user(user_id):return User.query.get(user_id)

3、用户模型实现:

from flask_login import UserMixinclass User(db.Model, UserMixin):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, nullable=False)# 其他字段...

UserMixin 提供 is_authenticated、is_active、get_id() 等属性
UserMixin 添加到你的用户模型中后,它会自动为你提供实现 Flask-Login 所要求的接口。

4、登录与登出视图示例:

from flask_login import login_user, logout_user@app.route('/login', methods=['GET', 'POST'])
def login():user = User.query.filter_by(username="admin").first()login_user(user)  # 登录return redirect(url_for('index'))@app.route('/logout')
def logout():logout_user()return redirect(url_for('index'))

5、当前登录的用户

from flask_login import current_user
<body>{% if current_user.is_authenticated %}<p>欢迎,{{ current_user.username }}!</p><a href="{{ url_for('logout') }}">登出</a>{% else %}<p>您尚未登录。</p><a href="{{ url_for('login') }}">登录</a>{% endif %}
</body>

含义解释

{% if current_user.is_authenticated %}:在使用 Flask-Login 时,current_user 是 Flask 提供的一个全局代理对象,代表当前登录的用户。
current_user.is_authenticated 是一个布尔值:

  • True:用户已登录
  • False:用户未登录(匿名)

其他常用方法

代码说明
current_user.is_authenticated判断当前用户是否登录
current_user.username访问当前登录用户属性
UserMixin提供用户模型默认认证属性

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

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

相关文章

[附源码+数据库+毕业论文+开题报告]基于Spring+MyBatis+MySQL+Maven+jsp实现的宠物领养管理系统,推荐!

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对宠物领养信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

【ArcGIS】水资源单项评价

【ArcGIS】水资源单项评价 一、水资源单项评价1、评价思路 二、操作步骤1、处理环境设置2、数据处理3、要素转栅格4、水资源评价 一、水资源单项评价 1、评价思路 &#xff08;1&#xff09;省级层面宜选用四级/五级水资源分区或县级行政区为评价单元&#xff0c;按照水资源总…

Windows环境下C语言汇编语言编辑器及环境安装

安装MinGw&#xff1a; 1.下载安装文件 MinGW - 适用于 Windows 的极简主义 GNU 下载 |SourceForge.net 点击下载 下载之后就是如下图的安装文件 2.安装 双击安装文件进行安装&#xff0c;点击Install下一步 选择安装位置&#xff0c;默认是安装在C盘&#xff0c;点击Change…

【数据分析】分段逻辑回归示例分析(模拟数据)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包步骤 1:模拟数据步骤 2:构建逻辑回归和分段模型步骤 3:计算预测值和置信区间步骤 4:提取 OR 和统计值步骤 5:绘图展示结步骤 6:输出图片原始代码总结系统信息参考介绍…

Webpack 构建过程详解

Webpack 是一个功能强大的模块打包工具,它能够将项目中的各种资源(如 JavaScript、CSS、图片等)打包成一个或多个文件,以便于在浏览器中运行。本文将以 Webpack 5 为例介绍它的构建过程: 1. 初始化阶段 在这个阶段,Webpack 从配置文件和命令行参数中读取并解析配置。然…

Flutter基础(UI监听)

文本按钮&#xff08;TextButton&#xff09; 文本按钮是没有边框的按钮&#xff0c;当点击时会有涟漪效果。 TextButton(onPressed: () {// 点击按钮后要执行的代码print(文本按钮被点击了);},child: Text(点击我), ) 手势检测器&#xff08;GestureDetector&#xff09; …

Linux 下的 regulator 子系统

1、简介 regulator 框架是 Linux 内核中用于管理电压和电流调节器&#xff08;如 LDO、DCDC 转换器等&#xff09;的一个子系统。它提供了一个抽象层&#xff0c;使得驱动程序和内核的其他部分可以以一致的方式与调节器进行交互&#xff0c;而无需了解底层硬件的细节。 主要功能…

12345政务热线系统:接诉即办,赋能智慧城市治理

一、12345热线&#xff1a;民情直通车&#xff0c;治理新引擎 “12345”政务热线是党委政府了解社情民意、解决群众合理诉求、倾听批评建议、改进工作作风的重要渠道。当前&#xff0c;全国各城市已基本建成12345政务服务热线体系&#xff0c;形成“接诉即办”的高效响应机制。…

【SpringBoot核心】Spring Boot + MyBatis 深度整合与最佳实践

目录 引言Spring Boot 基础回顾MyBatis 核心概念解析Spring Boot 整合 MyBatisMyBatis 高级特性Spring Boot + MyBatis 最佳实践性能优化与扩展实战案例:电商系统开发常见问题与解决方案总结与展望1. 引言 1.1 技术背景与现状 在现代企业级应用开发中,数据持久化是一个核心…

力扣第77题-组合-力扣第78题-子集

力扣链接:77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3…

嵌入式MTD设备与Flash管理解析

理解MTD是嵌入式系统中处理Flash存储的关键一步&#xff01;我来帮你梳理清楚&#xff1a; MTD 是什么&#xff1f; MTD 是 Memory Technology Device 的缩写&#xff0c;中文常译为内存技术设备。它是 Linux 内核及其衍生系统&#xff08;如嵌入式 Linux&#xff09;中用于管…

基于 GEE 利用 Sentinel-2 数据计算并下载植被指数数据

目录 1 植被指数 2 完整代码 3 运行结果 1 植被指数 植被指数全名NDVI归一化差值植被指数GNDVI绿色归一化差值植被指数EVI增强植被指数EVI2双波段增强植被指数DVI差值植被指数GDVI绿色差植被值指数RVI比值植被指数SAVI土壤调整植被指数OSAVI优化土壤调整植被指数MSAVI修改…

python基础23(2025.6.29)分布式爬虫(增量式爬虫去重)redis应用_(未完成!)

本次写一个爬取网易新闻的案例。因为redis能处理高并发&#xff0c;存储数据也可以&#xff0c;故不用mysql。而且新闻网站容易更新很多&#xff0c;而mysql只能持久化存储。 import scrapy import re import json import redis # 用它来去除重复, 记录访问过的urlclass Wang…

Springboot 集成 SpringState 状态机

Springboot 集成 SpringState 状态机 1.SpringState 简介2.状态机示例2.1 项目结构和依赖包2.2 定义事件类和状态类2.3 Spring 事件监听器2.4 状态机持久化类2.4.1 Redis 状态机持久化容器2.4.2 Redis 配置2.4.3 状态机监听器 2.5 装机器容器2.6 状态机事件发送器2.7 状态机配置…

实战四:基于PyTorch实现猫狗分类的web应用【2/3】

​一、需求描述 实战四分为三部分来实现&#xff0c;第二部分是基于PyTorch的猫狗图像可视化训练的教程&#xff0c;实现了一个完整的猫狗分类模型训练流程&#xff0c;使用预训练的ResNet50模型进行迁移学习&#xff0c;并通过SwanLab进行实验跟踪。 效果图 ​二、实现思路 …

对比几个测试云的一些速度

最近被hosting vps主机的速度给困扰了&#xff0c;干脆放下手中的活 测试下 test.php放在网站根目录即可 代码如下&#xff1a; <?php /*** 最终版服务器性能测试工具* 测试项目&#xff1a;CPU运算性能、内存读写速度、硬盘IO速度、网络下载速度*/// 配置参数&#xff…

UE5 Grid3D 学习笔记

一、Neighbor Grid 3D 的核心作用 NeighborGrid3D 是一种基于位置的哈希查找结构&#xff0c;将粒子按空间位置划分到网格单元&#xff08;Cell&#xff09;中&#xff0c;实现快速邻近查询&#xff1a; 空间划分&#xff1a;将模拟空间划分为多个三维网格单元&#xff08;Cel…

Spring AI ——在springboot应用中实现基本聊天功能

文章目录 前言测试环境项目构建依赖引入指定openai 相关配置基于 application.yml 配置 Open AI 属性application.yml编写测试类测试请求基于读取后配置请求编写测试接口测试效果展示流式输出前言 AI 技术越来越火爆,作为Java开发人员也不能拖了后腿。 前段时间使用LangChain…

条件概率:不确定性决策的基石

条件概率是概率论中的核心概念&#xff0c;用于描述在已知某一事件发生的条件下&#xff0c;另一事件发生的概率。它量化了事件之间的关联性&#xff0c;是贝叶斯推理、统计建模和机器学习的基础。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术…

搭建Flink分布式集群

1. 基础环境&#xff1a; 1.1 安装JDK 本次使用 jdk-11.0.26_linux-x64_bin.tar.gz 解压缩 tar -zxvf jdk-11.0.26_linux-x64_bin.tar.gz -C /usr/local/java/ 配置环境变量&#xff1a; vi /etc/profileJAVA_HOME/usr/local/java/jdk-11.0.26 CLASSPATH.:${JAVA_HOME}/li…