zoukankan      html  css  js  c++  java
  • Flask:Jinjia模板

    Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。


    一、变量


    1.1 手动传入的变量:

    • 基本类型:{{ var }}
    • 字典类型:{{ mydic [ 'key' ] }} 或 {{ mydic.key }}
    • 列表类型:{{ mylist [ myindex ] }}
    • 对象类型:{{ myobj. somemethod() }}

    1.2 全局变量:

    可用的全局变量:configrequestsessiong、通过上下文管理器注册到全局变量...


    1.3 过滤器:

    过滤器名 说明
    safe 渲染值时不转义
    capitalize 把值的首字母转换成大写,其他字母转换成小写
    lower 把值转换成小写形式
    upper 把值转换成大写形式
    title 把值中每个单词的首字母都转换成大写
    trim 把值的首尾空格删掉
    striptags 渲染之前把值中所有的 HTML 标签都删掉
    • 使用语法:{{ var|safe }}

    • 过滤器可以嵌套使用

    • 可以自定义过滤器


    二、控制结构


    2.1 条件判断

    {% if user="张三" %}
        Hello, {{ user }}!
    {% elif user="李四"%}
        Hello, 李四!
    {% else %}
        Hello, Stranger!
    {% endif %}
    

    判断条件兼容python语法的条件判断,另外还有Jinjia模板内置判断条件:

    判断条件 说明 实例
    defined/undefined 环境中是否有此变量的定义 if var is defined
    none 变量是否为none if var is none
    number/string 数字、字符判断 ...
    even/odd 奇偶判断 ...
    upper/lower 大小写判断 ...

    2.2 循环

    Jinjia模板的循环语法如下,但原生不支持break和continue语句,可通过扩展实现app.jinjia_env.add_extension('jinjia2.ext.loopcontrols')

    <ul>
        {% for comment in comments %}
            <li>{{ comment }}</li>
        {% else %}
            <li>如果循环体为空则显示这里(可选)</li>
        {% endfor %}
    </ul>
    

    Jinjia模板中循环体内的内置函数:

    变量 描述
    loop.index 当前循环迭代的次数(从1开始)
    loop.index0 当前循环迭代的次数(从0开始)
    loop.revindex 到循环结束需要迭代的次数(从1开始)
    loop.revindex0 到循环结束需要迭代的次数(从0开始)
    loop.first 若是第一次迭代,则返回True
    loop.last 若是最后一次迭代,则返回True
    loop.length 当前循环的总长度
    loop.cycle(a,b,c) 循环的从指定序列中取值

    三、模板重用


    3.1 模板宏

    定义单独的宏文件(macro.html)

    {% macro render_comment(comment) %}
        <li>{{ comment }}</li>
    {% endmacro %}
    

    导入使用:

    {% import 'macros.html' as macros %}
    <ul>
        {% for comment in comments %}
            {{ macros.render_comment(comment) }}
        {% endfor %}
    </ul>
    

    3.2 模板包含

    需要在多处重复使用的模板代码片段可以写入单独的文件,再引入所有模板中,以避免重复。

    {% include 'common.html' %}
    {% include 'common.html' ignore missing %}                #如果模板不存在,不会报错
    {% include 'common.html' with/without context %}          #是否携带当前页面的上下文
    

    3.3 模板继承

    Jinja2 使用 blockendblock 指令在基模板中定义内容区块。

    • 语法:{% extends "base.html" %}
    • 同名区块直接覆盖
    • 同名区块可使用super()扩展
    {% extends "base.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
        {{ super() }}
        <style>
        </style>
    {% endblock %}
    {% block body %}
    <h1>Hello, World!</h1>
    {% endblock %}
    

    四、模板中的全局函数


    函数 说明
    url_for() 构建URL
    get_flashed_messages() 获取闪现消息
    range() 同python中的range函数
    dict() 同python中的dict函数
    cycler(* items) 常用于CSS类名的循环

    五、其他


    5.1 模板注释:

    模板注释的语法:{{# ... #}},模板注释不会出现在HTML文档中,HTML注释会。


    5.2 除HTML文档中多余的空白:

    在模板标签的开始或结束添加一个 -

    {%- for comment in comments %}
        <li>{{ comment }}</li>
    {% endfor -%}
    

    5.3 使用变量:

    设置变量:{{% set a,b=(1,2) %}}

    使用with实现变量的块级作用域:

    {{% with %}}
        {{% set a,b=(1,2) %}}
        ...只在区块内有效
    {{% endwith %}}
    
    
  • 相关阅读:
    推荐有关微信开发的十个开源项目
    curl 常见错误码
    mysql修改root密码
    BAT批处理之文件与文件夹操作代码(附xcopy命令详解)
    UE4 Pak包加载
    libcurl 文件上传
    win7右键在目录当前打开命令cmd窗口
    SQLiteDeveloper破解
    Excel替换应用
    解决局域网2级路由互相连接共享的问题
  • 原文地址:https://www.cnblogs.com/bqzzz/p/14406456.html
Copyright © 2011-2022 走看看