12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代

news2025/2/28 6:26:43

本篇博客我们将前端模板的通用部分进行抽离,便于整理管理,使用的是 jinja2 中模板继承相关技术。

文章目录

    • Flask 模板引擎
    • 块(Block)
    • 更细的块拆解
    • 完善 general 目录和 school 目录 HTML 文件
    • 宏(Macro)

Flask 模板引擎

flask 为了实现模板代码的宠用,jiaja2 提供了块(Block)和宏(Macro)来提高代码的继承和复用性。

  • 块(Block):用于精简代码,可以通过继承 (extend)复用代码;
  • 宏(Macro):使用宏提高模板复用性,减少复杂度。

让我们先从块说起。

块(Block)

使用块功能,基本逻辑是在模板文件中先声明一个 {% block block_name %}{% endblock %} 的占位语句块,然后在继承的文件中,使用相同的语句块,此时子模板就会替换父模板中相应的语句块。

使用的时候需要注意两个要点。

  1. 模板不支持多继承,子模板中定义的块,不能同时替换两个父模板中的块;
  2. 模板中不能定义同名块。

正式编码的时候,建议在 endblock 关键字后跟快名,可以增加代码可读性。

下面编写一个基础模板文件,命名为 base.html,在 app/templates 目录中进行创建,代码如下。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    {% if title%}
    <title>{{title}}|爬虫训练场,让天下没有失效的爬虫</title>
    {% else %}
    <title>爬虫训练场,让天下没有失效的爬虫</title>
    {%endif%}
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" />
    <link rel="stylesheet" href="{{url_for('static',filename='css/base.css')}}" />
  </head>
  <body>
    {%block content%}{%endblock content%}
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
  </body>
</html>

在该文件中,你会发现仅建立了一个 HTML 结构,重点包含 htmlheadbody 标签以及 CSS 和 JS 文件。

其中添加了一个块,即 {%block content%}{%endblock content%},用于在后续子模板中提供替换位置。

下面就可以让其它文件继承 base.html 模板,首先修改的是 index.html 文件,继承关键字使用 extends,代码如下。

{% extends "base.html" %}

接下来修改 app/templates/index.html 文件,示例代码如下所示。

{% extends "base.html" %} {% block content %} 下图所示的核心代码 {% endblock %}

由于重复代码较多,这里仅展示核心代码和缩进截图,如下所示。

12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代

index.html 文件,从基础模板 base.html 中继承页面布局,所以可以删除原 index.html 文件中 head 部分代码。

更细的块拆解

前文仅对首页 index.html 文件进行了模板继承,实践中可以将模板拆解的更加细致,在 app/templates 目录中建立一个新文件夹,起名为 common,然后再其中建立 header.htmlfooter.htmlnav.html 三个文件。

下面对 index.html 文件再次进行拆解,首先 header.html 部分拆解出头部 head 部分,然后在 base.html 中使用下述代码进行导入。

{%include 'common/header.html' %}

接下来拆解 nav.html,将页面导航标签进行拆解,最后是底部版权部分,迁移到 footer.html 文件中。

经过一番调整,templates/index.html 文件已经修改为如下内容。

{% extends "base.html" %} {% block content %} {% include 'common/nav.html'%}
代码卡片内容 {% include 'common/footer.html'%} {% endblock %}

完善 general 目录和 school 目录 HTML 文件

在前文我们已经提炼出模板文件,接下来就可以对其它 HTML 代码文件进行一番修改。

首先是 general 目录下的文件,修改为如下内容。

table.htmlimgs.htmlnews.html 修改之后的代码如下所示。

{% extends "base.html" %} {% block content %} {% include 'common/nav.html'%}
<div class="container mt-5">……</div>
{% include 'common/footer.html'%} {% endblock %}

除此之外,我们将百度统计代码也进行一下迁移,在 common 目录中建立 tj.html,然后将统计代码移植到这里,接下来在 header.html 文件进行导入即可。

如果被继承父模板的块中存在数据,希望在此基础上继续添加,可以使用 {{super()}},然后在下面继续追加代码。

宏(Macro)

下面补充 Flask 模板引擎中宏的相关概念,先了解一下宏类似函数,在 templates 目录中建立一个 _form.html 文件,然后输入如下代码。

定义一个不带参数的宏

{% macro input() %}
<input type="text" name="username" value="" />
{% endmacro %}

使用如下代码调用宏。

{{ input() }}

定义带参数的宏

{% macro input2(name, type='text', value='',placeholder='') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" placeholder="{{ placeholder }}"/>
{%- endmacro %} {{ input2('username',placeholder="占位符") }}

看完上述代码,相信你已经能体会到 Flask 宏的概念了,如果希望在其它文件中使用宏,需要进行导入,语法结构和 Python import 基本一致,示例如下。

  • 直接使用 import……as……
  • 使用 from……import……
  • 使用 from……import……as……

例如我们在测试文件 bt.html 文件导入刚刚创建的宏,代码如下。

{% from "_form.html" import input %} {{input()}}

也可以使用下述代码。

{% import "_form.html" as f %} {{f.input()}}

在导入宏的时候,可以增加关键字 with context,此时可以把当前模板中的一些上下文变量传递给宏所在的模板文件。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 809 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

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

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

相关文章

章节六:RASA NLU组件介绍--特征生成器

目录一、前言二、特征生成器MitieFeaturizerSpacyFeaturizerConveRTFeaturizerLanguageModelFeaturizerRegexFeaturizerCountVectorsFeaturizerLexicalSyntacticFeaturizer一、前言 RASA在处理对话时&#xff0c;整体流程是pipeline结构&#xff0c;自然语言理解&#xff08;N…

SpringBoot操作Redis

目录 1.IDE创建一个maven项目 2、 添加redis启动器 3.修改配置文件application.properties 4.在测试类中测试 SpringBoot操作Hash&#xff08;哈希&#xff09; SpringBoot操作List集合类型 SpringBoot操作Set集合类型 SpringBoot操作ZSet集合类型 1.IDE创建一个maven项…

dubbo(尚硅谷)学习笔记2

我们现在来做dubbo和springboot整合&#xff1a; 我们先来创建一个springboot项目&#xff1a; 然后把serviceimpl层拷贝过来。 因为我们这个也需要用到公用接口和实体类&#xff0c;所以还是需要导入一下这个依赖&#xff1a; 同样的我们也需要创建一个服务的消费者&#xf…

设计模式之美总结(行为型篇)

title: 设计模式之美总结&#xff08;行为型篇&#xff09; date: 2022-12-26 17:25:29 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. 观察者/发布订阅模式&#xff08;Observer Design Pattern/Publish-Subscribe Design Pattern…

Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例

目录 前言 什么是帧&#xff1f; 什么是Aseprite&#xff1f; 运行环境 正文 示例&#xff1a;绘制人物 制作多帧动画 微调 导出精灵表 总结 作品欣赏 附一个下载链接&#xff1a; 前言 什么是帧&#xff1f; 我们看到的动画都是由一张张图片连续播放而成的&#…

scipy

scipy.interpolate插值方法 import numpy as np def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2grid_x, grid_y np.mgrid[0:1:100j, 0:1:200j]rng np.random.default_rng() points rng.random((1000, 2)) values func(points[:,0], points[:…

高颜值蓝牙耳机有哪些?音质好颜值高的蓝牙耳机推荐

喜欢安静的人们&#xff0c;相信都会有一副蓝牙耳机吧&#xff0c;作为我们生活当中必不可少的数码产品&#xff0c;除了手机以外&#xff0c;蓝牙耳机几乎也是使用率很高的&#xff0c;它通过蓝牙连接&#xff0c;非常方便&#xff0c;下面是小编精心挑选的四款蓝牙耳机。 一…

告别“限速”,个人网盘进入云时代

配图来自Canva可画 在数字经济广泛渗透的条件下&#xff0c;个人网盘市场也得到了长足发展。而在5G和AI的加持下&#xff0c;个人网盘不断进行技术融合和迭代&#xff0c;云盘已然成为互联网用户以及智能设备存储的基本服务&#xff0c;而其应用场景也顺理成章地开始向各个细分…

window11 node.js 安装与下载

最近电脑莫名其妙的被一些恶意流氓软件捆绑了&#xff0c;今天我直接给恢复出厂设置了。顺便记录一下软件的安装步骤。 1. 先去官网下载 官网地址 ① 进入到官网后如下图所示 ②根据自己电脑选择合适的版本下载&#xff08;我是wiindows 64位 &#xff09; ③ 双击安装包点击…

道路交通警示牌数据集以及训练好的YOLO模型权重文件

道路交通警示牌yolo模型1.交通标志数据集的介绍2.训练出权重文件1.交通标志数据集的介绍 交通标志&#xff08;国外的交通标志&#xff09;数据集是经过标注过的数据集&#xff0c;包括77个类别&#xff1b;标注类别如下&#xff1a; ‘200m’, ‘50-100m’, ‘Ahead-Left’, …

如何写好一份数据分析报告?

数据分析报表怎么做&#xff1f;这是一个很笼统的问题&#xff0c;所以这篇尝试从数据分析报表的3个方面来说下&#xff0c;准备了3天&#xff0c;内容较长&#xff0c;心急的小伙伴先看索引&#xff1a; 数据分析报表的原则数据分析报表的数据来源数据分析报表的可视化展示 0…

【按钮的两种状态 Objective-C语言】

一、继续上一篇文章的按钮案例 1.先说思路: 1)先把最上面的图片按钮实现了 我们拽1个按钮,给它一个背景图,加一个文字“点我啊” 当你鼠标按下去的时候,换成另1个背景图 当你鼠标按下去的时候,按钮的背景图变了,并且上面的文字也变了,变成“摸我干啥” 当你鼠标抬起…

Doris-集成其他系统(四)

目录0、准备1、Spark 读写 Doris1.1 准备 Spark 环境1.2 使用 Spark Doris Connector1.2.1 SQL 方式读写数据1.2.2 DataFrame 方式读写数据&#xff08;batch&#xff09;1.2.3 RDD 方式读取数据1.2.4 配置和字段类型映射1.3 使用 JDBC 的方式&#xff08;不推荐&#xff09;2、…

京东零售大数据云原生架构实践

通常谈到大数据&#xff0c;想到的是大数据平台、Hadoop生态或者数据湖技术&#xff0c;关注于大数据存储、大数据计算方向上的技术发展与应用&#xff1b;谈到云原生&#xff0c;想到的是微服务架构、容器化或者SRE&#xff08;Site Reliability Engineer&#xff09;运维范畴…

圣诞节快乐,程序员们!

一、前言 为了参加圣诞创意大赛&#xff0c;拖着阳过的病体&#xff0c;在咳嗽的间隔时间变长之后&#xff0c;发个帖子沾点节日气氛。前段时间参加了大模型训练营&#xff0c;趁着热度&#xff0c;刷一下AIGC的氛围。 二、创意名 因为生病了&#xff0c;所以就懒&#xff0…

【Pygamre实战】2023人气超高的模拟经营类游戏:梦想小镇代码版火爆全场,免费体验分享下载哦~

前言 梦想还是要有的&#xff0c;万一实现了呢&#xff1f;&#xff01;今天小编就来用代码实现自己专属的城市——特大都市&#xff1a; 梦想小镇启航。顾名思义&#xff0c;梦想小镇是梦想花开之地。自己当市长不香嘛&#xff01; 所有文章完整的素材源码都在&#x1f447;…

Unity3d C#实现类似于王者荣耀技能读条和CD冷却的功能(含源码)

效果 效果如图&#xff0c;主要是释放技能后&#xff0c;有一定的技能的持续时间&#xff08;也可以设置为0&#xff09;&#xff0c;然后技能释放完成后&#xff0c;技能进入了冷却时间的倒计时&#xff0c;技能冷却完成后就可以再次释放。 实现 UI搭建 UI的搭建较为简单就…

react基本使用

react基本使用1.基础知识1.1 React 介绍1.2 React特点声明式UI组件化学习一次&#xff0c;随处使用2.基本使用2.1 React 脚手架&#xff08;CLI&#xff09;使用 React 脚手架创建项目项目目录结构说明和调整2.2 使用React 的基本步骤2.2.1 导入react和react-dom2.2.2 创建reac…

2023风丘内推计划——“你的同事 你来挑”

招 聘 简 章 &#xff08;一&#xff09;企业文化 愿 景&#xff1a;让科技更简单 使 命&#xff1a;为客户创造更多价值&#xff1b;为员工创造更多机会&#xff1b;为社会贡献更多美好&#xff01; 价值观&#xff1a;诚信敬业、持续创新、团队合作、追求卓越、勇担…

Redis高可用之集群架构(第三部分)

引言 集群的实际环境模拟可以参考我之前的文章 单机模拟集群&#xff08;三主两从&#xff09; 一、集群的工作原理 集群中的节点只能使用0号数据库&#xff0c;而单机数据库没有这个限制。集群中的节点本质上就是一个运行在集群模式下的Redis服务器&#xff0c;Redis服务器在…