笔记-jinja2语法

笔记-jinja2语法


1. jinja2

1.1. 渲染

  
@app.route('/about/')  
def about():  
  # return render_template('about.html',user='username')  
  return render_template('about.html',**{'user':'username'})  

渲染模版时有两种传递参数的方式:用 var='value' 传递一个参数;使用字典组织多个参数,并且加两个*号转换成关键字参数传入。

1.2. 基本语法

控制结构 {% %}
变量取值 {{ }}
注释 {# #}

1.3. 变量

最常用的是变量,由Flask渲染模板时传过来,比如上例中的”user”,也可以是任意一种Python基础类型,比如字符串{{ “Hello” }},用引号括起;或者数值,列表,元祖,字典,布尔值。
直接显示基础类型没啥意义,一般配合其他表达式一起用
运算。
包括
算数运算,如{{ 2 + 3 }};
比较运算,如{{ 2 > 1 }};
逻辑运算,如{{ False and True }}
过滤器“|”和测试器“is”。这个在后面会介绍
函数调用,如{{ current_time() }};
数组下标操作,如{{ arr[1] }}
“in”操作符,如{{ 1 in [1,2,3] }}
字符串连接符”~”,作用同Python中的”+”一样,如{{ “Hello ” ~ name ~ “!” }}
“if”关键字,如{{ ‘Hi, %s’ % name if name }}。这里的”if”不是条件控制语句。

**定义变量 set **
{% set navigation = [('/','Home'),('/about','关于我')] %}

上面的语句创建的是全局变量,从定义之后的文件部分中都可以访问 。

局部变量
可以使用with语句来创建一个内部的作用域,将set语句放在其中,这样创建的变量只在with代码块中才有效。

  
{% with foo = 42 %}  
{{ foo }}  
{% endwith %}  

foo变量只能在with标签间可以使用。

获取变量
在模板中,我们可以使用“.”获取变量的属性
user = { 'username' : 'shansan', 'bio': '我佛了',}
如果user为传入模板中的字典变量,可通过"."获取它的键值。
user.username等价于user['username']

1.4. 过滤器

变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。

常用的过滤器:
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型

那么如何使用这些过滤器呢? 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。

  
{{ 'abc' | captialize  }}  
# Abc  

{{ 'abc' | upper  }}  
# ABC  

{{ 'hello world' | title  }}  
# Hello World  

{{ "hello world" | replace('world','daxin') | upper }}  
# HELLO DAXIN  

{{ 18.18 | round | int }}  
# 18  

1.5. 控制结构

if语句类:
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}

1.6. for循环

for循环用于迭代Python的数据类型,包括列表,元组和字典。jinja2中不存在while循环。

  
 <ul>  
{% for user in users %}  
 <li>{{ user.username|title }}</li>  
{% endfor %}  
 </ul>  

# 迭代字典  
 <dl>  
{% for key, value in my_dict.iteritems() %}  
 <dt>{{ key }}</dt>  
 <dd>{{ value}}</dd>  
{% endfor %}  
 </dl>  

当然也可以加入else语句,在循环正确执行完毕后执行

在for循环中,jinja2还提供了一些特殊的变量,用以来获取当前的遍历状态:
loop.index 当前迭代的索引(从1开始)
loop.index0 当前迭代的索引(从0开始)
loop.first 是否是第一次迭代,返回bool
loop.last 是否是最后一次迭代,返回bool
loop.length 序列中的项目数量
loop.revindex 到循环结束的次数(从1开始)
loop.revindex0 到循环结束的次数(从0开始)

1.7. 继承

模板继承允许创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。
jinja2的骨架文件中,利用block关键字表示其包涵的内容可以进行修改。

以下面的骨架文件base.html为例:

  
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
    {% block head %}  
    <link rel="stylesheet" href="style.css"/>  
    <title>{% block title %}{% endblock %} - My Webpage</title>  
    {% endblock %}  
 </head>  
 <body>  
 <div id="content">{% block content %}{% endblock %}</div>  
 <div id="footer">  
    {% block  footer %}  
    <script>This is javascript code </script>  
    {% endblock %}  
 </div>  
 </body>  
 </html>  

这里定义了四处 block,即:head,title,content,footer。

  
{% extend "base.html" %}       # 继承base.html文件  

{% block title %} Dachenzi {% endblock %}   # 定制title部分的内容  

{% block head %}  
    {{  super()  }}        # 用于获取原有的信息  
    <style type='text/css'>  
    .important { color: #FFFFFF }  
    </style>  
{% endblock %}  

继承父模板的块内容
super()表示继承父block块原内容,然后再执行子块的内容。
如果不使用super()则父块内容完全被覆盖。

1.8. 模版页面中引入静态文件

静态文件主要包括有CSS样式文件、JavaScript脚本文件、图片文件、字体文件等静态资源。

在Jinja中加载静态文件只需要通过url_for全局函数就可以实现:

  
 <link href="{{ url_for('static',filename='about.css') }}">  

引入static目录下的about.css文件。

posted @ 2020-07-04 19:36  木林森__𣛧  阅读(759)  评论(0)    收藏  举报