flask中jinjia2模板引擎使用详解2【分分快三计划】

作者:编程技术

想要在模板中输出原生jinjia2语法,要求开展转义,转义有二种办法

Python的Flask框架中的Jinja2模板引擎学习课程,flaskjinja2

Flask的模板功用是依据Jinja2模板引擎来兑现的。模板文件贮存在时下前段时间下的子目录templates(必须求选取那些名字)下。
main.py 代码如下:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello')
@app.route('/hello/<name>')
def hello(name=None):
  return render_template('hello.html', name=name)


if __name__ == '__main__':
  app.run(debug=True)

hello.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Hello Sample</title>
</head>
<body>
{% if name %}
  <h1>Hello {{ name }} !</h1>
{% else %}
  <h1>Hello World!</h1>
{% endif %}

</body>
</html>

模板的表明式都以包括在相隔符”{{ }}”内的;调整语句都以包罗在相隔符”{% %}”内的;此外,模板也支撑注释,都以含有在相隔符”{# #}”内,帮忙块注释。
表达式

表达式平日常有这般三种:

  • 最常用的是变量,由Flask渲染模板时传过来,比方上例中的”name”
  • 也能够是不管三七八十朝气蓬勃后生可畏种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”不是标准决定语句。

调节语句

Jinja2的主宰语句首要就是规范化决定语句if,和循环调整语句for,语法相近于Python。大家得以改过下上节的模板代码:

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

地点是三个原则决定语句的例证,注意if调整语句要用”{% endif %}”来甘休。模板中不能够像代码中同样靠缩进来推断代码块的甘休。再来看个循环的例证,我们先改下Python代码中的”hello”函数,让其传五个列表进模板。

def hello(name=None):
  return render_template('hello.html', name=name, digits=[1,2,3,4,5],
              users=[{'name':'John'},
                 {'name':'Tom', 'hidden':True},
                 {'name':'Lisa'}
                 {'name':'Bob'}])

模板如下:

{% if name and name == 'admin' %}
  <h1>Helle admin</h1>
{% elif name %}
  <h1>"Hello" ~ {{ name }} ~ "!"</h1>
{% else %}
  <h1>Hello World!</h1>
{% endif %}

  {% for digit in digits %}
  {{ digit }}
  {% endfor %}

同if语句相似,for调整语句要用”{% endfor %}”来甘休。页面上,各类成分之间会有空格,若是您不希望有空格,就要在”for”语句的最终,和”endfor”语句的最前面各拉长三个”-“号。如:

 {% for digit in digits -%}
  {{ digit }}
 {%- endfor %}

您可以见见数字”12345″被同台体现出来了。大家再来看个复杂的巡回例子:

<dl>
  {% for user in users if not user.hidden %}
  {% if loop.first %}
  <div>User List:</div>
  {% endif %}
  <div class="{{ loop.cycle('odd', 'even') }}">
  <dt>User No. {{ loop.index }}</dt>
  <dd>{{ user.name }}</dd>
  </div>
  {% if loop.last %}
  <dir>Total Users: {{ loop.length }}</dir>
  {% endif %}
  {% else %}
  <li>No users found</li>
  {% endfor %}
</dl>

那边有多少个知识点。首先for循环扶持else语句,当待遍历的列表”users”为空或然为None时,就步向else语句。
其次,在for语句后选取if关键字,能够对循环中的项作过滤。本例中,全体hidden属性为True的user都会被过滤掉。
其它,for循环中得以访谈Jinja2的巡回内置变量。本例中,大家会在第风姿罗曼蒂克项前彰显标题,最终意气风发项后彰显总的数量,每生机勃勃项呈现序号。此外,奇偶项的HTML div成分会有两样的class。倘使我们投入上边包车型地铁CSS style,就能够观察斑马线。

<style type="text/css">
  .odd {
    background-color: #BDF;
  }
</style>

Jinja2的循环内置变量重要有以下多少个:

1 2 3 4 5 6 7 8 9 10 11 12 from flask import Flask, render_template   app = Flask(__name__)   @app.route('/hello') @app.route('/hello/<name>') def hello(name=None):     return render_template('hello.html', name=name)     if __name__ == '__main__':     app.run(debug=True)

除此以外,假若您启用了”jinja2.ext.loopcontrols”扩充的话,你仍可以在循环中利用”{% break %}”和”{% continue %}”来调控循环实践。
别的常用语句:

忽视模板语法

不常,大家在页面上就是要来得”{{ }}”那样的标志如何做?Jinja2提供了”raw”语句来忽视全体模板语法。

{% raw %}
  <ul>
  {% for item in items %}
    <li>{{ item }}</li>
  {% endfor %}
  </ul>
{% endraw %}

自行转义

我们将本文一齐始的Flask代码”hello()”方法退换下:

@app.route('/hello')
@app.route('/hello/<name>')
def hello(name=None):
  if name is None:
    name = '<em>World</em>'
  return render_template('hello.html', name=name)

此时,访问” <em>World</em>!”,也正是其风度翩翩HTML标签”<em>”被自动转义了。Flask会对”.html”, “.htm”, “.xml”, “.xhtml”这种种类型的沙盘文件开启HTML格式自动转义。那样也足以堤防HTML语法注入。假设大家不想被转义怎么做?

{% autoescape false %}
 <h1>Hello {{ name }}!</h1>
{% endautoescape %}

将”autoescape”开关设为”false”就可以,反之,设为”true”即展开自动转义。使用”autoescape”开关前要启用”jinja2.ext.autoescape”扩展,在Flask框架中,那几个扩充暗中认可已启用。
赋值

动用”set”关键字给变量赋值:

{% set items = [[1,2],[3,4,5]] %}

with语句

就疑似于Python中的”with”关键字,它能够约束with语句块内对象的功效域:

{% with foo = 1 %}
  {% set bar = 2 %}
  {{ foo   bar }}
{% endwith %}
{# foo and bar are not visible here #}

行使”with”关键字前要启用”jinja2.ext.with_”扩大,在Flask框架中,那个扩张暗许已启用。
实践表达式

{% with arr = ['Sunny'] %}
 {{ arr.append('Rainy') }}
 {{ arr }}
{% endwith %}

看下边这段代码,大家想举行列表的”append”操作,此时使用”{{ arr.append(‘Rainy') }}”页面会输出”None”,换来”{% %}”来进行,程序会报错,因为这是个表明式,不是说话。这如何是好?大家得以启用”jinja2.ext.do”增添。然后在模板中进行”do”语句就可以:

{% with arr = ['Sunny'] %}
 {% do arr.append('Rainy') %}
 {{ arr }}
{% endwith %}

上下文情况 Flask各类乞请都有生命周期,在生命周期内央浼有其上下文情状Request Context。作为在号召中渲染的沙盘,自然也在呼吁的生命周期内,所以Flask应用中的模板能够使用到央求上下文中的境遇变量,及部分协助函数。本文就能够介绍下那几个变量和函数。
标准上下文变量和函数

恳求对象request request对象能够用来得到要求的不二秘技”request.method”,表单”request.form”,诉求的参数”request.args”,诉求地址”request.url”等。它本人是贰个字典。在模板中,你雷同能够获得那个内容,只要用表明式符号”{{ }}”括起来就可以。

<p>{{ request.url }}</p>

在平素不央浼上下文的条件中,这些目标不可用。
对话对象session session对象足以用来赢妥当前对话中保存的动静,它本身是二个字典。在模板中,你能够用表达式符号”{{ }}”来博取这一个指标。
Flask代码如下,别忘了设置会话密钥哦:

@app.route('/')
def index():
  session['user'] = 'guest'
  return render_template('hello.html')

app.secret_key = '123456'

模板代码:

<p>User: {{ session.user }}</p>

在未曾诉求上下文的碰到中,这么些目标不可用。
大局对象g 全局变量g,用来保存恳求中会用到全局内容,举例数据库连接。模板中也足以访问。
Flask代码:

@app.route('/')
def index():
  g.db = 'mysql'
  return render_template('hello.html')

模板代码:

<p>DB: {{ g.db }}</p>

g对象是保存在应用上下文情形中的,也只在两个伸手生命周期内有效。在未有运用上下文的条件中,那几个指标不可用。
Flask配置对象config 导入的布置音信,就保存在”app.config”对象中。这一个布局对象在模板中也足以访谈。

 <p>Host: {{ config.DEBUG }}</p>

“config”是大局对象,离开了央浼生命周期也能够访问。
url_for()函数 url_for()函数能够用来火速取得及创设U猎豹CS6L,Flask也将此函数引进到了模版中,比如上边的代码,就能够收获静态目录下的”style.css”文件。

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

该函数是全局的,离开了伏乞生命周期也足以调用。
get_flashed_messages()函数 get_flashed_messages()函数是用来获取音讯闪现的。那也是贰个大局可利用的函数。
自定义上下文变量和函数

自定义变量 除此之外Flask提供的专门的学业上下文变量和函数,我们还是能和煦定义。下边大家就来先定义叁个上下文变量,在Flask应用代码中,参加上边包车型客车函数:

from flask import current_app

@app.context_processor
def appinfo():
  return dict(appname=current_app.name)

函数重返的是贰个字典,里面有叁本质量”appname”,值为当下选用的名号。我们已经介绍过,这里的”current_app”对象是二个概念在运用上下文中的代理。函数用”@app.context_processor”装饰器修饰,它是贰个上下文管理器,它的功效是在模板被渲染前运转其所修饰的函数,并将函数重返的字典导入到模板上下文景况中,与模板上下文合并。然后,在模板中”appname”就不啻上节介绍的”request”, “session”同样,成为了可访谈的上下文对象。大家能够在模板旅长其出口:

<p>Current App is: {{ appname }}</p>

自定义函数 同理我们得以自定义上下文函数,只需将上例中回到字典的属性指向叁个函数即可,上面大家就来定义三个前后文函数来收获系统当下时光:

import time

@app.context_processor
def get_current_time():
  def get_time(timeFormat="%b %d, %Y - %H:%M:%S"):
    return time.strftime(timeFormat)
  return dict(current_time=get_time)

大家得以试下在模板少校其出口:

<p>Current Time is: {{ current_time() }}</p>
 <p>Current Day is: {{ current_time("%Y-%m-%d") }}</p>

上下文管理器可以修饰三个函数,也正是我们得以定义三个上下文情状变量和函数。
完整实例:
flask代码:

from flask import Flask, render_template, session, g, current_app
import time

app = Flask(__name__)

@app.route('/')
def index():
  session['user'] = 'guest'
  g.db = 'mysql'
  return render_template('hello-2.html')

@app.context_processor
def appinfo():
  return dict(appname=current_app.name)

@app.context_processor
def get_current_time():
  def get_time(timeFormat="%b %d, %Y - %H:%M:%S"):
    return time.strftime(timeFormat)
  return dict(current_time=get_time)

app.secret_key = '123456'

if __name__ == '__main__':
  app.run(debug=True)

模板代码:

<!doctype html>
<title>Hello Sample</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
 <h1>Hello World!</h1>
 <p>Request URL: {{ request.url }}</p>
 <p>User: {{ session.user }}</p>
 <p>DB: {{ g.db }}</p>
 <p>Host: {{ config.DEBUG }}</p>
 <p>Current App is: {{ appname }}</p>
 <p>Current Time is: {{ current_time() }}</p>
 <p>Current Day is: {{ current_time("%Y-%m-%d") }}</p>

{% with messages = get_flashed_messages() %}
 {% if messages %}
  {% for message in messages %}
   Flash Message: {{ message }}</li>
  {% endfor %}
 {% endif %}
{% endwith %}

Flask的模板成效是依据Jinja2模板引擎来达成的。模板文件寄放在当前近来下的子目录...

运作后意识,注释不会被render出来

生机勃勃种是通过变量表明式直接出口语言关键字,比方

在模板中投入注释

经过设置line_comment_prefix能够兑现行反革命注释,步骤跟行语句同样,譬如,大家设置:

 分分快三计划 1 

 分分快三计划 2

 分分快三计划 3

 

运维效果:

运作效果:

{% if name -%}

  <h1>Hello {{ name | upper }}!</h1>

    <h1>name is number? {% if name is number %}true{% else  %}false{% endif %}</h1>

  {# 这是一大堆注释 #}

{%- else -%}

  <h1>Hello World!</h1>

{% endif %}
行语句就是把一行当成是jinjia2的语句行,设置一下jinjia2的line_statement_prefix变量即可实现。比如设置为“#”

app.jinja_env.line_statement_prefix="#"

转出职能:

 

注:-是标签的一片段,所以中间不要有空格

行注释

注解的接收

$行注释,不输出

另生机勃勃种是透过在模板的逻辑块中增多-号

 

 分分快三计划 4

在jinjia2模板中,使用{#flask中jinjia2模板引擎使用详解2【分分快三计划】。 #}举行代码注释,如下所示

flask中jinjia2模板引擎使用详解2【分分快三计划】。{% - if xxx %}

运作后,查看源码,开采注释未有被输出

app.jinja_env.trim_blocks = True app.jinja_env.lstrip_blocks = True

-在前头表明要除去后面包车型客车空行,在背后除去后边的空行,两侧都加前后都去掉空白行。

去掉空行

分分快三计划 5

三种办法能够去掉jinjia2模板中的空白行,一是安装jinjia2的际遇变量,如下

{{ "{{ 通过转义输出变量表达式 }}" }}

{{ "{%  通过转义输出逻辑表达式 %}" }}

接上文

{% raw %}

    <ul>

    {% for item in seq %}

        <li>{{ item }}</li>

    {% endfor %}

    </ul>

{% endraw %}

并且在模板中参加行语句

flask中jinjia2模板引擎使用详解2【分分快三计划】。 分分快三计划 6 

app.jinja_env.line_comment_prefix = "$"
# if True

<p>行语句输出</p>

# endif

上边这种表达是违规的:

转义

行语句

另一种是透过raw关键字展开大块转义

分分快三计划 7

 关切“挨踢学霸”微信民众号,回复“jinjia2-2“ 获取本文源代码

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划