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

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代相关的知识,希望对你有一定的参考价值。

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

文章目录

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 %

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

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 年内保证更新

以上是关于12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代的主要内容,如果未能解决你的问题,请参考以下文章

二十一:jinja2之模板继承

jinja2 模板继承示例不起作用

小知识点爬虫训练场项目,Python Flask 模板更新,每次都要重新服务

jinja2-模版继承

Tornado框架配置使用Jinja2模板引擎

flask框架下的jinja2模板引擎