首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Web - Flask笔记3

Python Web - Flask笔记3

作者头像
YingJoy_
发布2018-08-02 15:51:48
7400
发布2018-08-02 15:51:48
举报
文章被收录于专栏:应兆康的专栏应兆康的专栏

19. Jinja2模板中的if语句

if条件判断语句必须放在{% if statement %}中间,并且还必须有结束的标签{% endif %}。和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and,or,not,()来进行逻辑合并操作。

{% if statement %}
{% elif statement %}
{% else %}
{% endif %}

20. Jinja2模板中的for循环语句

jinja2中的for循环,跟python中的for循环基本上是一模一样的。也是for...in...的形式。并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,jinja2中的for循环没有breakcontinue语句。

{% for statement %}
{% else %}
{% endfor %}

如果for语句里面不执行的时候,则运行else里面的语句

可以使用以下变量来获取当前遍历的状态:

变量

描述

loop.index

当前迭代的索引(从1开始)

loop.index0

当前迭代的索引(从0开始)

loop.reindex

反向 当前迭代的索引(从1开始)

loop.reindex0

反向 当前迭代的索引(从0开始)

loop.first

是否第一次迭代,返回True或False

loop.last

是否是最后一次迭代,返回True或False

loop.length

序列的长度

21. 案例 – Jinja2实现九九乘法表

<table border="1">
    <tbody>
        {% for i in range(1, 10) %}
            <tr>
                {% for j in range(1, 10) if j < i %}
                <td>{{ j }} * {{ i }} = {{ i*j }}</td>
                {% endfor %}
            </tr>
        {% endfor %}
    </tbody>
</table>

22. 宏的概念和基本使用方法

类似Python中的函数,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。 使用宏的时候,参数可以为默认值。相关示例代码如下:

  1. 定义宏: html {% macro input(name, value='', type='text') %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %}
  2. 使用宏: html <p>{{ input('username') }}</p> <p>{{ input('password', type='password') }}</p>

导入宏:

  1. import "宏文件的路径" as xxx
  2. from '宏文件的路径' import 宏的名字 [as xxx]
  3. 宏文件路径,不要以相对路径去寻找,都要以templates作为绝对路径去找。
  4. 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用with context。示例:from 'xxx.html' import input with context

单独使用import时必须使用as给宏文件重命名。

引入templates目录下的文件路径时,均是相对templates的绝对路径。

宏文件无法获取从视图函数中传递的变量,若需要获取这些变量,则导入的时候应该加上with context

from 'macros/macros.html' import input with context

23. include标签

相当于把另外一个模板文件的内容复制粘贴过来。

1.html

<p>1. Hello World!</p>

{% include '2.html' %}

2.html

<p>2. Hello World!</p>

结果:

1. Hello World!
2. Hello World!
  1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。
  2. include标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用with context
  3. include的路径,也是跟import一样,直接从templates根目录下去找,不要以相对路径去找。

24. setwith语句

set设置全局变量,include调用的模板中也可以使用

{% set 变量=xxx %}
调用: {{ 变量 }}

with设置局部变量,变量生存周期仅局限于with代码块

{% with %}
    {% set b= 5 %}
    {{ b }}
{% endwith %}

超过变量生存区域就无法调用,jinja2最终渲染空白

25. 加载静态文件

静态文件: css js 图片 视频 字体等等。

加载静态文件使用的是url_for函数。然后第一个参数需要为static,第二个参数需要为一个关键字参数filename='路径'。示例:

​```html
{{ url_for("static",filename='xxx') }}
​```

路径查找,要以当前项目的static目录作为根目录。

如果要更改路径,可以参考之前修改templates文件夹

26. 模板继承

为什么需要模版继承:

模版继承可以把一些公用的代码单独抽取出来放到一个父模板中。以后子模板直接继承就可以使用了。这样可以重复性的代码,并且以后修改起来也比较方便。

模版继承语法:

使用extends语句,来指明继承的父模板。父模板的路径,也是相对于templates文件夹下的绝对路径。示例代码如下: {% extends "base.html" %}

block语法:

一般在父模版中,定义一些公共的代码。子模板可能要根据具体的需求实现不同的代码。这时候父模版就应该有能力提供一个接口,让父模板来实现。从而实现具体业务需求的功能。 在父模板中:

{% block block的名字 %}
{% endblock %}

在子模板中:

{% block block的名字 %}
子模板中的代码
{% endblock %}

调用父模版代码block中的代码:

默认情况下,子模板如果实现了父模版定义的block。那么子模板block中的代码就会覆盖掉父模板中的代码。如果想要在子模板中仍然保持父模板中的代码,那么可以使用{{ super() }}来实现。示例如下: 父模板:

{% block body_block %}
        <p style="background: red;">这是父模板中的代码</p>
    {% endblock %}

子模板:

{% block body_block %}
    {{ super() }}
    <p style="background: green;">我是子模板中的代码</p>
{% endblock %}

可以使用{{ super() }}来继承父模板中的代码

调用另外一个block中的代码:

如果想要在另外一个模版中使用其他模版中的代码。那么可以通过{{ self.其他block名字() }}就可以了。示例代码如下:

{% block title %}
    课堂首页
{% endblock %}

{% block body_block %}
    {{ self.title() }}
    <p style="background: green;">我是子模板中的代码</p>
{% endblock %}

其他注意事项:

  1. 子模板中的代码,第一行,应该是extends
  2. 子模板中,如果要实现自己的代码,应该放到block中。如果放到其他地方,那么就不会被渲染。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 19. Jinja2模板中的if语句
  • 20. Jinja2模板中的for循环语句
  • 21. 案例 – Jinja2实现九九乘法表
  • 22. 宏的概念和基本使用方法
    • 导入宏:
    • 23. include标签
    • 24. set和with语句
    • 25. 加载静态文件
    • 26. 模板继承
      • 为什么需要模版继承:
        • 模版继承语法:
          • block语法:
            • 调用父模版代码block中的代码:
              • 调用另外一个block中的代码:
                • 其他注意事项:
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档