0%

Python Web - Flask笔记3

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中。如果放到其他地方,那么就不会被渲染。