flask 模板语法

1、有关模板路径

(1) 在渲染模版的时候,默认会从项目根目录下的templates目录下查找模版。
(2) 如果不想把模版文件放在templates目录下,那么可以在Flask初始化的时候指定template_folder来指定模版的路径。

2、有关模板参数

(1) 在使用render_template渲染模版的时候,可以传递关键字参数。以后直接在模版中使用就可以了。
(2)如果你的参数过多,那么可以将所有的参数放到一个字典中,然后在传这个字典参数的时候,使用两个星号,将字典打散成关键参数。

3、url_for

模版中的url_for跟我们后台视图函数中的url_for使用起来基本是一模一样的。也是传递视图函数的名字,也可以传递参数。

使用的时候,需要在url_for左右两边加上一个{{ url_for('func') }}

4、过滤器

(1)什么是过滤器,语法是什么:
  • 有时候我们想要在模版中对一些变量进行处理,那么就必须需要类似于Python中的函数一样,可以将这个值传到函数中,然后做一些操作。在模版中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。
  • 基本语法:{{ variable|过滤器名字 }}。使用管道符号|进行组合。
(2)常用过滤器:
  • default过滤器:
    使用方式{{ value|default('默认值') }}。如果value这个key不存在,那么就会使用default过滤器提供的默认值。如果你想使用类似于python中判断一个值是否为False(例如:None、空字符串、空列表、空字典等),那么就必须要传递另外一个参数{{ value|default('默认值',boolean=True) }}
    可以使用or来替代default('默认值',boolean=True)。例如:{{ signature or '此人很懒,没有留下任何说明' }}
  • 自动转义过滤器
    1. safe过滤器:可以关闭一个字符串的自动转义。
    2. escape过滤器:对某一个字符串进行转义。
    3. autoescape标签,可以对他里面的代码块关闭或开启自动转义。
      {% autoescape off/on %}
          ...代码块
      {% endautoescape %}
      
(3)最常用过滤器:
  • first(value):返回一个序列的第一个元素。names|first。
    format(value,*arags,**kwargs):格式化字符串。例如以下代码: {{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!

  • last(value):返回一个序列的最后一个元素。示例:names|last。

  • length(value):返回一个序列或者字典的长度。示例:names|length。

  • join(value,d=u’’):将一个序列用d这个参数的值拼接成字符串。

  • safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。

  • int(value):将值转换为int类型。

  • float(value):将值转换为float类型。

  • lower(value):将字符串转换为小写。

  • upper(value):将字符串转换为小写。

  • replace(value,old,new): 替换将old替换为new的字符串。

  • truncate(value,length=255,killwords=False):截取length长度的字符串。

  • striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。

  • trim:截取字符串前面和后面的空白字符。

  • string(value):将变量转换成字符串。

  • wordcount(s):计算一个长字符串中单词的个数。

(4)自定义模版过滤器:

过滤器本质上就是一个函数。如果在模版中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,然后函数的返回值会作为这个过滤器的返回值。需要使用到一个装饰器:@app.template_filter('cut')

@app.template_filter('cut')
def cut(value):
    value = value.replace("hello",'')
    return value
<p>{{ article|cut }}</p>

5、if条件判断语句

if条件判断语句使用格式为{% if statement %},并且还必须有结束的标签{% endif %}

python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and,or,not,()来进行逻辑合并操作。

6、 for循环语句

jinja2中的for循环,跟python中的for循环基本上是一模一样的。也是for...in...的形式。

并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,jinja2中的for循环没有breakcontinue语句。

7、宏:

模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。

使用宏的时候,参数可以为默认值。相关示例代码如下:

  • 定义宏
    {% macro input(name, value='', type='text') %}
    <input type="{{ type }}" name="{{ name }}" value="{{
    value }}">
    {% endmacro %}
    
  • 使用宏
    <p>{{ input('username') }}</p>
    <p>{{ input('password', type='password') }}</p>
    
  • 导入宏
    • import "宏文件的路径" as xxx

    • from '宏文件的路径' import 宏的名字 [as xxx]

    • 宏文件路径,不要以相对路径去寻找,都要以templates作为绝对路径去找。

    • 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用with context。示例:from 'xxx.html' import input with context

8、 include标签

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

9、set、with语句笔记

(1)set语句

在模版中,可以使用set语句来定义变量。示例如下:

{% set username='admin' %}
<p>用户名:{{ username }}</p>

一旦定义了这个变量,那么在后面的代码中,都可以使用这个变量,就类似于Python的变量定义是一样的。

(2) with 语句

with语句定义的变量,只能在with语句块中使用,超过了这个代码块,就不能再使用了。示例代码如下:

{% with classroom = '五班' %}
<p>班级:{{ classroom }}</p>
{% endwith %}

with语句也不一定要跟一个变量,可以定义一个空的with语句,以后在with块中通过set定义的变量,就只能在这个with块中使用了:

{% with %}
    {% set classroom = '五班' %}
    <p>班级:{{ classroom }}</p>
{% endwith %}

10、 静态文件

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

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

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

11、模版继承

(1)为什么需要模版继承?

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

(2) 模版继承语法

使用extends语句,来指明继承的父模板。父模板的路径,也是相对于templates文件夹下的绝对路径。

示例代码如下:

{% extends "base.html" %}
(3) block语法

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

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

在子模板中:

{% block block的名字 %}
子模板中的代码
{% endblock %}
(4)调用父模版代码block中的代码:

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

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

子模板:

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

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

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

{% block body_block %}
    {{ self.title() }}
    <p style="background: green;">我是子模板中的代码</p>
{% endblock %}
(6)其他注意事项:
  1. 子模板中的代码,第一行,应该是extends
  2. 子模板中,如果要实现自己的代码,应该放到block中。如果放到其他地方,那么就不会被渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值