一:渲染模版

要渲染一个模板,通过render_template方法即可。

@app.route('/about/')

def about():

return render_template('about.html',**{'user':'username'})

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

python文件调用模板进行渲染的基本使用方法如下:

from jinja2 import loaders, FileSystemLoader, Environment

指定模板文件搜索的开始位置

TemplateLoader = FileSystemLoader(searchpath="./", encoding='utf-8')

TemplateEnv = Environment(loader=TemplateLoader)

这里的文件位置是以searchpath作为基准的,而不是当前文件夹.

template = TemplateEnv.get_template("./test.html")

html = template.render({"config": config})

需要注意的是:

如果传到模板文件的变量config是一个列表(字典)等容器类型;

当config作为整体被使用时,渲染之后不会进行decode,造成的结果就是中文显示不出来,解决办法是在模板文件中将config中的元素一一取出;模板文件正确写法

{% for i in config %}

i

{ endfor }有问题的写法

{{config}}  //直接渲染列表整体将造成里面的中文无法正常显示

二:模板概要

Jinja模板是简单的一个纯文本文件,一般用html页面来书写。

复制代码

My Webpage

{% for item in navigation %}

{{ item.caption }}

{% endfor %}

{{ a_variable }}

{{ user.name }}

{{ user['name'] }}

{# a comment #}

18.

转自作者:IT蔷薇

链接:http://www.jianshu.com/p/31a75d3d9270

复制代码

模版讲解:{{ ... }}:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。{% ... %}:装载一个控制语句。{# ... #}:装载一个注释,模板渲染的时候会忽视这中间的值。

三:变量

1)在模板中添加变量,可以使用(set)语句。

{% set name='xx' %}

之后就可以在页面文件中使用name这个变量了。在解释性语言中,变量的类型时运行时确定的,因此,这里的变量可以赋任何类型的值。

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

2)局部变量

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

{% with foo = 42 %}

{{ foo }}

{% endwith %}

这样,foo变量就只能在with标签间可以使用。

四:控制语句

控制语句都是放在{% ... %}中,并且有一个语句{% endxxx %}来进行结束。

1:if语句

复制代码

{% if kenny.sick %}

Kenny is sick.

{% elif kenny.dead %}

You killed Kenny! You bastard!!!

{% else %}

Kenny looks okay --- so far

{% endif %}

转自:IT蔷薇

链接:http://www.jianshu.com/p/31a75d3d9270

复制代码

2:for循环

1)普通用法

{% for user in users %}

{{ user.username|e }}

{% endfor %}

2)遍历字典

{% for key, value in my_dict.iteritems() %}

{{ key|e }}{{ value|e }}

{% endfor %}

3)在循环中加入else

复制代码

{% for user in users %}

{{ user.username|e }}

{% else %}

no users found

{% endfor %}

复制代码

4)Jinja2中for循环内置常量

loop.index  当前迭代的索引(从1开始)

loop.index0     当前迭代的索引(从0开始)

loop.first  是否是第一次迭代,返回True\/False

loop.last   是否是最后一次迭代,返回True\/False

loop.length     序列的长度

注意:不可以使用continue和break表达式来控制循环的执行。

五:运算符+号运算符:可以完成数字相加,字符串相加,列表相加。但是并不推荐使用+运算符来操作字符串,字符串相加应该使用~运算符。-号运算符:只能针对两个数字相减。/号运算符:对两个数进行相除。%号运算符:取余运算。*号运算符:乘号运算符,并且可以对字符进行相乘。**号运算符:次幂运算符,比如2**3=8。in操作符:跟python中的in一样使用,比如{{1 in [1,2,3]}}返回true。~号运算符:拼接多个字符串,比如{{"Hello" ~ "World"}}将返回HelloWorld。

六:Jiaja2模版最重要的部分——宏

宏相当于一个搭建好的页面一部分,可以被引入,可以往宏传递参数。可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量,在使用宏时传递参数,从而将宏渲染成为页面的一部分。

比如:定义一个input标签宏

{% macro input(name, value='', type='text') %}

{% endmacro %}

在其它地方使用这个宏快速创建出符合要求的input标签:

{{ input('username') }}

{{ input('password', type='password') }}

1)页面文件中导入宏——import

在开发中,会将一些常用的宏单独放在一个文件中,在需要使用的时候,再从这个文件中进行导入。

import语句的用法跟python中的import类似,可以直接import...as...,也可以from...import...或者from...import...as...。

复制代码

{% import 'forms.html' as forms %}  //导入宏文件

Username
{{ forms.input('username') }}
Password
{{ forms.input('password', type='password') }}

{{ forms.textarea('comment') }}

复制代码

导入模板并不会把当前上下文中的变量添加到被导入的模板中,我们可以在导入的时候使用with context 把上下文传进去:

{% from '_helpers.html' import my_macro with context %}

2)宏文件中引用其它宏——include

include语句可以把一个模板引入到另外一个模板中,类似于把一个模板的代码copy到另外一个模板的指定位置。

{% include 'header.html' %}

Body

{% include 'footer.html' %}

七:模版文件的继承

模板可以继承,通过继承可以把模板中许多重复出现的元素抽取出来,放在父模板中,并且父模板通过定义block给子模板开一个口,子模板根据需要,再实现这个block进行具体内容定义。

比如:父模版base.html如下:

复制代码

{% block head %} //开放一个地方,以待具体赋值

{% block title %}{% endblock %} - My Webpage

{% endblock %}

{% block content %}{% endblock %}

{% block footer %}

© Copyright 2008 by you;.

{% endblock %}

转自:IT蔷薇

链接:http://www.jianshu.com/p/31a75d3d9270

复制代码

然后定义子模版,对父模板中的block部分进行覆盖书写:

复制代码

{% extends "base.html" %}//1:继承父模板

{% block title %}Index{% endblock %}//2:书写title block

{% block head %}//3:书写head block

{{ super() }}//调用父模板中的内容,如果不调用,则此处会被子模板中书写的内容覆盖掉

.important { color: #336699; }

{% endblock %}

{% block content %}//4:书写content block

Index

Welcome to my awesome homepage.

{% endblock %}

转自:IT蔷薇

链接:http://www.jianshu.com/p/31a75d3d9270

复制代码

另外:模板文件中对block内容的调用,可以使用 self.blockName 的方式。

{% block title %}{% endblock %}

{{ self.title() }}

//调用title block的内容

注意:在子模板中,所有的标签和代码都要添加到从父模板中继承的block中。否则,这些文本和标签将不会被渲染。(因为子模板相当于把内容嵌入到父模板到block中,而没有写到block中的内容当然不会被嵌入,也就不会被渲染。)

八:过滤器

过滤器是通过(|)符号进行使用的,例如:{{ name|length }}:将返回name的长度。

过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。

Jinja2拥有许多过滤器:(转自:http://www.jianshu.com/p/31a75d3d9270)abs(value):返回一个数值的绝对值。示例:-1|absdefault(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。escape(value)或e:转义字符,会将等符号转义成HTML中的符号。示例:content|escape或content|e。first(value):返回一个序列的第一个元素。示例:names|firstformat(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):计算一个长字符串中单词的个数。

九:测试器

测试器主要用来判断一个值是否满足某种类型,语法是:if...is...:

{% if variable is escaped%}

value of variable: {{ escaped }}

{% else %}

variable is not escaped

{% endif %}

Jinja2中测试器有:callable(object):是否可调用。defined(object):是否已经被定义了。escaped(object):是否已经被转义了。upper(object):是否全是大写。lower(object):是否全是小写。string(object):是否是一个字符串。sequence(object):是否是一个序列。number(object):是否是一个数字。odd(object):是否是奇数。even(object):是否是偶数。

十:转义

在模板渲染字符串的时候,字符串有可能包括一些非常危险的字符比如等,这些字符会破坏掉原来HTML标签的结构,更严重的可能会发生XSS跨域脚本攻击,因此如果碰到这些字符的时候,应该转义成HTML能正确表示这些字符的写法。

对于一些不信任的字符串,可以通过{{ content_html|e }}或者是{{ content_html|escape }}的方式进行转义。

如果想关闭自动转义,可以通过{{ content_html|safe }}的方式关闭自动转义。

{%autoescape true/false%}...{%endautoescape%}可以将一段代码块放在中间,来关闭或开启自动转义:

{% autoescape false %}

autoescaping is disabled here

{{ will_not_be_escaped }}

{% endautoescape %}

十一:模版页面中引入静态文件

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

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

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

到我的github上查看更多项目:https://github.com/ygj0930

python jinja2_python-Jinja2用法相关推荐

  1. python语言用法_Python语言-Jinja2用法

    本文主要向大家介绍了Python语言-Jinja2用法,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 一:渲染模版要渲染一个模板,通过render_template方法即可.@a ...

  2. python jinja2_python中Jinja2是什么?如何使用?

    本篇文章给大家带来的内容是关于python中Jinja2是什么?如何使用?,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是Jinja2 Jinja2是Python下一个被广泛应 ...

  3. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  4. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  5. python matplotlib 简单用法

    python matplotlib 简单用法 具体内容请参考官网 代码 import matplotlib.pyplot as plt import numpy as np # 支持中文 plt.rc ...

  6. (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案

    (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 参考文章: (1)(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 (2)ht ...

  7. python装饰器实例-Python装饰器用法实例总结

    本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能, ...

  8. python所有函数用法_Python函数使用方法(高级用法)

    前面章节,已经介绍了 Python 函数的所有基本用法和使用注意事项.但是,Python 函数的用法还远不止此,Python 函数还支持赋值.作为其他函数的参数以及作为其他函数的返回值. 首先,Pyt ...

  9. python的property用法_python @property的用法及含义全面解析

    在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样. class Rectangle(object): de ...

  10. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

最新文章

  1. 图像颜色--opencv scalar
  2. 吴恩达机器学习:神经网络 | 反向传播算法
  3. 关于开发过程中的空指针问题
  4. c#对象集合去重_C# List集合去重操作注意点
  5. elasticsearch快照和恢复
  6. ABAP SET UPDATE TASK LOCAL的测试
  7. 【刷出存在感】锋会圆桌现场
  8. 计算机风险评估管理程序,第5章 信息安全风险评估实施流程
  9. ios 贝塞尔曲线 颜色填充_iOS贝塞尔曲线(UIBezierPath)的基本使用方法
  10. Python小项目——学生信息管理系统(详细讲解)
  11. Java基础---封装继承静态
  12. (转)ElasticSearch教程——汇总篇
  13. Function与Module的差异与应用场景
  14. 图像型PDF如何免费转换成可编辑的文字
  15. C语言lrc校验算法详解,C语言解析lrc文件
  16. 【天光学术】语言学论文:英语认知语言学和心理语言学的融通互补探析(节选)
  17. 主体阶段钢筋工程、模板工程、混凝土、管线预埋施工要点都有哪些?
  18. 一个可以为你的任何创作加速的神软件
  19. 苹果手机功能大全介绍_苹果手机功能大全,这些你都知道吗?
  20. 广义线性模型(GLM)

热门文章

  1. 前端人事面试问题总结
  2. RuoYi-Vue前端分页
  3. 微信小程序引入外部icon
  4. 总结一下自学到现在的学习方法感悟
  5. win10系统盘分多大合适?
  6. s7edge固件android7.0,欧版S7 edge刷上Android 7.0之后:超级流畅
  7. 将一个负数赋值给一个无符号数会出现什么情况呢
  8. 《高效人士的七个习惯》读后感-总结
  9. 生物信息学研究生课程-1
  10. TMB计算是否要去除驱动突变