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

Flask 第八课 -- 模板渲染

目录

一. 前言

二. 基本概念

三. 创建模板

四. 模板继承

五. 控制结构

六. 过滤器

七. 宏和模板包含

八. 安全性

九. 模板上下文


一. 前言

模板是包含占位符的 HTML 文件。

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

以下是关于 Flask 模板渲染的详细说明,包括如何创建和使用模板、模板继承、控制结构等。

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

二. 基本概念

模板是包含占位符的 HTML 文件。

Flask 使用 Jinja2 模板引擎来渲染这些模板,将 Python 数据插入到 HTML 中,从而生成最终的网页。

三. 创建模板

模板文件通常放在项目的 templates 文件夹中。

Flask 会自动从这个文件夹中查找模板文件。

创建模板文件:在项目目录下创建 templates 文件夹,并在其中创建一个 HTML 文件,如 index.html。

templates/index.html 文件代码:

<!DOCTYPE html>
<html>
<head><title>Welcome</title>
</head>
<body><h1>{{ title }}</h1><p>Hello, {{ name }}!</p>
</body>
</html>

{{ title }} 和 {{ name }} 是模板占位符,将在渲染时被替换成实际的值。

在视图函数中渲染模板:

app.py 文件代码:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def home():return render_template('index.html', title='Welcome Page', name='John Doe')if __name__ == '__main__':app.run(debug=True)

render_template('index.html', title='Welcome Page', name='John Doe'):渲染 index.html 模板,并将 title 和 name 变量传递给模板。

四. 模板继承

模板继承允许你创建一个基础模板,然后在其他模板中继承和扩展这个基础模板,避免重复的 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 %}:重写基础模板中的块内容。

五. 控制结构

Jinja2 提供了多种控制结构,用于在模板中实现条件逻辑和循环。

条件语句:

{% if user %}<p>Welcome, {{ user }}!</p>
{% else %}<p>Please log in.</p>
{% endif %}

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

循环语句:

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

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

六. 过滤器

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

<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。

八. 安全性

自动转义:Jinja2 默认会对模板中的变量进行自动转义,防止 XSS 攻击。

<p>{{ user_input }}</p>

{{ user_input }}:用户输入的内容会被自动转义,以避免恶意脚本的注入。

九. 模板上下文

视图函数中传递的变量成为模板的上下文,这些变量可以在模板中直接使用。

@app.route('/profile/<username>')
def profile(username):user = {'name': username, 'age': 25}return render_template('profile.html', user=user)

templates/profile.html 文件代码:

<h1>{{ user.name }}</h1>
<p>Age: {{ user.age }}</p>

{{ user.name }} 和 {{ user.age }}:在模板中访问 user 变量的属性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ArrayList 源码解析
  • Python快速入门 —— 第三节:类与对象
  • 手机玩机常识____展讯芯片刷机平台ResearchDownload的一些基本常识与问题解决
  • 【网络安全的神秘世界】渗透测试基础
  • 3. Python计算水仙花数
  • 2848. 与车相交的点(24.9.19)
  • TCP和MQTT通信协议
  • 音视频开发常见的开源项目汇总
  • C语言自定义类型结构体(24)
  • 免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来!
  • LabVIEW中AVI帧转图像数据
  • 从ANN到SNN的转换:实现、原理及两种归一化方法【MINIST、实战】
  • 【JVM】类加载
  • 上海亚商投顾:沪指探底回升 华为产业链午后爆发
  • Js中的pick函数
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • create-react-app项目添加less配置
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS实现简单的MVC模式开发小游戏
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • nodejs实现webservice问题总结
  • Spring核心 Bean的高级装配
  • vue数据传递--我有特殊的实现技巧
  • Vue--数据传输
  • 对JS继承的一点思考
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Golang中select的用法
  • 如何设计一个比特币钱包服务
  • 使用 @font-face
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习JavaScript数据结构与算法 — 树
  • 《码出高效》学习笔记与书中错误记录
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #微信小程序:微信小程序常见的配置传值
  • (20050108)又读《平凡的世界》
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (五)网络优化与超参数选择--九五小庞
  • (转)Sql Server 保留几位小数的两种做法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 发送邮件
  • .NET技术成长路线架构图
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • ?
  • @RequestMapping-占位符映射
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [ 数据结构 - C++]红黑树RBTree
  • []sim300 GPRS数据收发程序