zoukankan      html  css  js  c++  java
  • flask基础之jijia2模板语言进阶(三)

    https://www.cnblogs.com/cwp-bg/p/8892424.html

    前言

    前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法。

    系列文章

    控制语句

    和python语言一样,模板语言也有自己的控制语句,比如条件语句、循环语句等等;

    条件语句if

    {% if name and name == 'admin'  %}
        <h1>This is admin console</h1>
    {% elif name %}
        <h1>Welcome {{ name }}!</h1>
    {% else %}
        <h1>Please login</h1>
    {% endif %}

    循环语句for

    # 基本的for循环结构
    {% for user in users %}
      <li>{{ user.username|e }}</li>
    {% endfor %}
    # 当for循环没有执行时使用else中代替
    {% for user in users %}
        <li>{{ user.username|e }}</li>
    {% else %}
        <li><em>no users found</em></li>
    {% endfor %}
    
    # 去除空白,加-,注意%和-必须紧靠,否则无效;
     {% for digit in digits -%}
        {{ digit }}
    {%- endfor %}

    注意:访问每次循环中的数据使用loop变量代表本次的循环

    {% for user in users %}
      <li>{{ user.username|e }}</li>
      {% if loop.index == 2 %}
        <p>OK</p>
      {% endif %}
    {% endfor %}
    
    loop.index  当前循环迭代的计数(从 1 开始)
    loop.index0 当前循环迭代的次数(从 0 开始)
    loop.revindex   到循环结束需要迭代的次数(从 1 开始)
    loop.revindex0  到循环结束需要迭代的次数(从 0 开始)
    loop.first  如果是第一次迭代,为 True 。
    loop.last   如果是最后一次迭代,为 True 。
    loop.length 序列中的元素的个数,即循环的长度;
    loop.cycle  在一串序列间期取值的辅助函数。
    loop.depth  当前循环在递归中的层级(从1开始)
    loop.depth0 当前循环在递归中的层级(从0开始)

    作用域控制with

    # 限制对象的作用域,foo作为局部变量
    {% with foo = 1 %}
        {% set bar = 2 %}
        {{ foo + bar }}
    {% endwith %}
    
    # do可以将表达式转换语句,即表示执行的意思
    {% with arr = ['Sunny'] %}
      {% do arr.append('Rainy') %} # 执行arr.append('Rainy')语句
      {{ arr }}
    {% endwith %}

    表达式

    • 算术表达式
    # 其语法和python中的一模一样
    {{ a + b}}
    • 比较表达式
    # 其语法和python中的一模一样
    {{ a == b}}
    • ~
    {{ "Hello " ~ name ~ "!" }} 
    返回(假设 name 值为 'John' ) Hello John! 

    转义

    • raw忽略模板的语法
    # {{}}{%%}这种形式将失效,代表它们本身的符号
    {% raw %}
        <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
        </ul>
    {% endraw %}
    • 自动转义
    # autoescape参数,如果为false则关闭转义,flask框架中默认为True
    {% autoescape false %}
      <h1>Hello {{ name }}!</h1>
    {% endautoescape %}

    模板继承

    # test.html
    # 父模板
    {% block head %}
    
    {% endblock %}
    
    # 子模板
    {% extends "test.html" %}
    {% block head %}
    {{ super() }}
    Index
    {% endblock %}
    • 想要渲染父模板中的模板需要使用{{ super() }},即如果父块中已经有语句,不是空的,如果要保留就需要使用这个

    注意:继承之后,块内是无法访问块外的变量的,如果想要访问,则:

    # scoped参数可以让list块内访问块外的变量
    {% block list scoped %}{% endblock %}

    包含include

    include可以加载另一个模板在当前的位置,直接渲染;

    # 直接在当前的位置
    <body>
        {% include 'footer.html' %}
    </body>
    # 当”include”的模板文件不存在时,程序会抛出异常。可以加上”ignore missing”关键字,这样如果模板不存在,就会忽略这段”{% include %}”语句。
     {% include 'footer.html' ignore missing %}
    # 添加多个模板
     {% include ['footer.html','bottom.html','end.html'] ignore missing %}

    • 宏简单来说就是在模板中定义并使用的函数,用来简化代码量

    • 定义一个宏

    # 使用macro定义,相当于def
    {% macro input(name, type='text', value='') -%}
        <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
        
    {%- endmacro %}
    • 调用一个宏
    # 通过表达式调用
    <p>{{ input('username', value='user') }}</p>
    <p>{{ input('password', 'password') }}</p>
    
    # 使用call,会将里面的内容替换func函数中的caller()方法
    {% call func(users) %}
        <td><input name="delete" type="button" value="Delete"></td>
    {% endcall %}
    # 调用宏的参数,func函数中的caller(name)方法的参数name可以传递过来
    {% call(name) func(users) %}
        <td><input name="delete" type="button" value="Delete"></td>
    {% endcall %}

    宏里面自动添加了varargs和kwargs参数,可以用来接收多余的变量或键值对参数;

    • 宏的导入:

    一个宏可以被不同的模板使用,建议将其声明在一个单独的模板文件中。需要使用时导入进来即可,而导入的方法也非常类似于Python中的”import”。

    {% import 'form.html' as form %}
    <p>{{ form.input('username', value='user') }}</p>

    参考:

  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/fengff/p/11649521.html
Copyright © 2011-2022 走看看