• 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>

    参考:

  • 相关阅读:
    9.11练习:文件访问,写一个逐页显示文本文件的程序,提示输入一个文件名,每次显示文本文件的25行,暂停并向用户提示“按任意键继续”,按键后继续执行。
    关于将缓冲器内容写入文件
    关于移动文件指针
    关于file.writelines换行符的添加
    石头剪子布游戏
    关于浅拷贝,深拷贝
    关于list.extend(iterable)
    vs2012编译openssl
    Sublime Text 3 安装及插件推荐
    bower--包管理工具
  • 原文地址:https://www.cnblogs.com/fengff/p/11649521.html
Copyright © 2020-2023  润新知