flask第34篇——测试器、模板继承

测试器

测试器即对文件内变量名、变量类型等文件进行判断

  • 语法
{% if 判断条件 %}
    ...代码块...
{% elif 判断条件 %}
    ...代码块...
{% else %}
    ...代码块...
{% endif %}
  • 实例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% set name='孟船长' %}
    {% if names %}
        <p>有name:{{ names }}</p>
    {% elif name %}
        <p>有name:{{ name }}</p>
    {% else %}
        <p>没有name;else</p>
    {% endif %}
</body>
</html>

执行代码,可以看到页面打印:

也就是说代码走了elif

上面代码也可这样写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% set name='孟船长' %}
    {% if names is undefined %}
        <p>有name:{{ names }}</p>
    {% elif name is defined %}
        <p>有name:{{ name }}</p>
    {% else %}
        <p>没有name;else</p>
    {% endif %}
</body>
</html>

此外,测试器还有很多,大家可在官网查看:

http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-tests

模板继承

与方法继承相似

  • 语法
{% extends '继承文件路径及后缀' %}
  • 继承的好处
    • 可以复用父类代码,节省开发时间
    • 可以根据需求进行重写,比较灵活
    • 如果想让子模板实现一些自定义内容,只需要使用block标签
  • 实例

新建如下页面:

命名为base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板继承</title>
    <style>
        * {
            list-style: none;
            text-decoration: none;
        }

        .header {
            height: 60px;
            background: #3a3a3a;
            color: #fff;
            margin-bottom: 20px;
        }

        .header .nav-group {
            margin-left: 10px;
        }

        .header .nav-group li {
            float: left;
            line-height: 60px;
            margin: 0px 20px;
        }

        .nav-group li a {
            color: #fff;
        }

        .footer {
            height: 100px;
            background: #3a3a3a;
        }

        .footer p {
            color: #fff;
            margin-left: 30px;
            padding-top: 20px;
        }

        .container{
            overflow: hidden;
        }

        .left-container{
            width: 800px;
            height: 300px;
            background: cadetblue;
            float: left;
        }

        .right-container{
            width: 600px;
            height: 500px;
            background: antiquewhite;
            float: right;
        }
    </style>
</head>
<body>
    <div class="header">
        <ul class="nav-group">
            <li><a href="#">新闻</a></li>
            <li><a href="#">音乐</a></li>
            <li><a href="#">贴吧</a></li>
            <li><a href="#">视频</a></li>
        </ul>
    </div>
    <div class="container">
        <div class="left-container">
            左面的盒子
        </div>
        <div class="right-container">
            右面的盒子
        </div>
    </div>
    <div class="footer">
        <p>页面底部</p>
    </div>
</body>
</html>

现在我们想增加两个页面,分别为detail.htmlfront_page.html,如果把代码原封不动的复制过去也可以,但是一旦页面有改动,那这三个文件你就得分别取改代码,所以这里就用继承就会方便很多了:

detail.html

{% extends 'base.html' %}

front_page.html同上,这样就通过继承复制出了两个相同的页面了。在app.py文件分别新增方法即可:

@app.route('/detail/')
def detail():
    return flask.render_template('detail.html')

@app.route('/frontpage/')
def frontPage():
    return flask.render_template('front_page.html')

现在如果在detail.html页面要增加新内容怎么办呢?就是之前提过的,block标签上场了。

  • 语法 {% block 变量名 %}{% endblock %}
  • 实例

将之前部分代码改为:

<div class="container">
    <div class="left-container">
        {% block left %}左面的盒子{% endblock %}
    </div>
    <div class="right-container">
        {% block right %}右面的盒子{% endblock %}
    </div>
</div>

然后在detail.html中修改代码为:

{% extends 'base.html' %}

{% block left %}
    <div>
        <table border="2px" bordercolor='red'>
            <thead>
                <tr>
                    <td>编号</td>
                    <td>课程</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>Flask</td>
                </tr>
            </tbody>
        </table>
    </div>
{% endblock %}

detail.html中的block添加代码后,就相当于把里面的代码添加到了base.html文件的block里面。

保存,detail.html页面变为:

以上内容即为模板继承。但是大家也发现左面盒子里面的内容全部被重写了,这时候只需要继承父类即可:

{{ super() }}

detail.html中增加上面代码即可:

{% extends 'base.html' %}

{% block left %}
    {{ super() }}
    <div>
        <table border="2px" bordercolor='red'>
            <thead>
                <tr>
                    <td>编号</td>
                    <td>课程</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>Flask</td>
                </tr>
            </tbody>
        </table>
    </div>
{% endblock %}

现在如果说右侧也要有一个相同的table该怎么办呢?当然不需要再重复代

码,只需要在对应的block中调用上一个block的名字{{ self.block名字 }}

即可。

  • 实例

detail.html

{# 模板继承 #}
{% extends 'base.html' %}
{# 利用block修改模板内容 #}
{% block left %}
    {{ super() }}
    <div>
        <table border="2px" bordercolor='red'>
            <thead>
                <tr>
                    <td>编号</td>
                    <td>课程</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>Flask</td>
                </tr>
            </tbody>
        </table>
    </div>
{% endblock %}

{% block right %}
    {{ super() }}
    {{ self.left() }}
{% endblock %}

执行后右侧盒子就会和左侧一样了。

原文发布于微信公众号 - 自动化测试实战(gh_839e78b6ba28)

原文发表时间:2018-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

Scala-2.13.0 安装及配置

Scala 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在J...

23610
来自专栏极客猴

Python 三种遍历目录的方法,轻松帮你找出隐藏文件

无论在 Windows 系统中还是 Linux 系统中,都存在着隐藏文件以及隐藏文件夹。隐藏文件夹一般是系统关键性目录,例如 Windows 系统中的 C 盘中...

4802
来自专栏Android干货

Python IO编程

循环读取文件内容,一般读取文件内容一次读取完,内存是不够的,就要实现一次次少量数据读取

1092
来自专栏行者常至

(Servlet)常见错误及解决方式

·404数字 指的是:服务器执行完客户端的请求后,返回给客户端一个执行结果的状态编码。

804
来自专栏电光石火

运行jar包找不到主类

在正确编译好java程序之后,打包,然后在命令行输入java -jar ,却弹出找不到或无法加载主类。 一检查,我的path环境变量都是对的呀?jav...

4649
来自专栏三木的博客

Linux shell 程序设计2——bash的内置命令

常用的内置命令忽略,来看看shell编程中其他一些重要的内置命令: 1、help:显示所有内置命令列表,或显示一个具体命令的用法。 -s: 表示列出命令的语法...

2136
来自专栏微服务那些事儿

SpringCloud与elastic-job集成(一)

在项目初期,基于quartz我们做了一个原始的job调度服务,用以执行我们的定时任务,但是随着业务的扩充,对性能及稳定性有了更高的要求.

2.3K9
来自专栏磨磨谈

rbd的image对象数与能写入文件数的关系

对于这个问题,我原来的理解也是:对象默认设置的大小是4M一个,存储下去的数据,如果小于4M,就会占用一个小于4M的对象,如果超过4M,那么存储的数据就会进行拆分...

1112
来自专栏北京马哥教育

linux实用技巧:你该使用ctags查找源码了

linux实用技巧:你该使用ctags查找源码了 ---- 1.ctags简介: “哦,这个多的文件,我该如何去查看XX函数的实现!”相信...

3006
来自专栏JavaQ

高并发编程-happens-before

happens-before是Java内存模型中定义的两个操作之间的偏序关系,即如果操作A在操作B之前先发生,那么操作A产生的操作结果,操作B可以观察到,或者说...

822

扫码关注云+社区

领取腾讯云代金券