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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

Promise接口实现之jQuery 的deferred对象

本文作者:IMWeb json 原文出处:IMWeb社区 未经同意,禁止转载 Promise是什么? 我们知道JavaScript是单线程,如果遇到某...

18410
来自专栏Java学习网

JavaScript依赖注入的实现思路

JavaScript依赖注入的实现思路 如今各个框架都在模块化,连前端的javascript也不例外。每个模块负责一定的功能,模块与模块之间又有相互依赖,那么问...

2106
来自专栏LIN_ZONE

PHP 常用设计模式 (转载)

单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

1502
来自专栏用户2442861的专栏

【深入Java虚拟机】之四:类加载机制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17881581

591
来自专栏重庆的技术分享区

AngularJs指令解密

1637
来自专栏java思维导图

Java中高级面试题部分答案解析(2)

这里是一些题型解析,还是这些话:不一定全部正确,有一些是没有固定答案的,如果发现有错的或者更适合的答案欢迎留言矫正。

841
来自专栏GreenLeaves

C#核编之一个简单的C#程序

构建一个简单的C#应用程序需要注意一下几点: 1、C#要求所有的程序逻辑都包含在一个类型定义中   --->这里的类型指的是(类,接口,结构,枚举,委托中的一个...

19610
来自专栏CodingToDie

java 代理

java 代理 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额...

3514
来自专栏程序员互动联盟

【答疑释惑】java中的全局变量

首先,java中是没有全局变量这个概念的,java程序中不能像C++那样在类外定义全局变量,因为JAVA当初出现的初衷就是为了安全性和跨平台性,所以去掉了类似C...

39811
来自专栏李家的小酒馆

Shell入门知识

Shell 简介 Shell作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构...

2040

扫码关注云+社区

领取腾讯云代金券