【4858.com】基础语法,flask中jinjia贰模板引擎使用详解贰

By admin in 4858.com on 2019年5月2日

接上文

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

Flask的沙盘功效是依附Jinja二模板引擎来兑现的。模板文件存放在脚下最近下的子目录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”
  • 也足以是随机1种Python基础项目,比方字符串{{ “Hello”
    }},用引号括起;或许数值,列表,元祖,字典,布尔值。间接显示基础项目没啥意思,一般同盟别的表明式一同用
  • 运算。包罗算数运算,如{{ 二 + 叁 }};相比较运算,如{{ 二 > 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”语句的最前面各拉长2个”-“号。如:

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

【4858.com】基础语法,flask中jinjia贰模板引擎使用详解贰。您能够看看数字”123四伍″被一块体现出来了。大家再来看个复杂的巡回例子:

<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的大循环内置变量。本例中,我们会在第1项前展示标题,最终1项后显得总的数量,每一项展现序号。其余,奇偶项的HTML
div元素会有不一致的class。如若咱们进入下边包车型大巴CSS style,就会看到斑马线。

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

Jinja二的巡回内置变量首要有以下多少个:

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 %}”来调控循环执行。
此外常用语句:

大人体模型板语法

偶然,我们在页面上就是要显示”{{
}}”那样的标志怎么做?Jinja二提供了”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”那3种类型的模版文件开启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”关键字前要启用”jinja二.ext.with_”扩张,在Flask框架中,这几个扩张暗许已启用。
进行表明式

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

看上边那段代码,大家想实行列表的”append”操作,那时使用”{{
arr.append(‘Rainy’) }}”页面会输出”None”,换成”{%
%}”来实践,程序会报错,因为这是个表明式,不是唇舌。那如何是好?大家得以启用”jinja二.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对象足以用来博取当前对话中保存的景况,它本人是2个字典。在模板中,你能够用表达式符号”{{
}}”来赢得那一个目的。
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对象是保存在应用上下文境遇中的,也只在1个伸手生命周期内立竿见影。在未曾利用上下文的意况中,那个目的不可用。
Flask配置对象config 导入的布署消息,就保存在”app.config”对象中。这些布局对象在模板中也足以访问。

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

“config”是大局对象,离开了请求生命周期也足以访问。
url_for()函数 url_for()函数能够用来相当的慢赚取及构建U猎豹CS陆L,Flask也将此函数引入到了模版中,比方上面包车型地铁代码,就足以拿走静态目录下的”style.css”文件。

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

该函数是大局的,离开了请求生命周期也得以调用。
get_flashed_messages()函数 get_flashed_4858.com,messages()函数是用来获取音信闪现的。那也是1个大局可应用的函数。
自定义上下文变量和函数

自定义变量 除了那一个之外Flask提供的标准上下文变量和函数,大家还是可以够和煦定义。上面我们就来先定义1个上下文变量,在Flask应用代码中,到场下边包车型大巴函数:

from flask import current_app

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

函数重临的是一个字典,里面有三本品质”appname”,值为近来采纳的称号。大家早已介绍过,这里的”current_app”对象是3个概念在使用上下文中的代理。函数用”@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的模板成效是依附Jinja二模板引擎来得以达成的。模板文件存放在日前近日下的子目录…

1.编码

批注的运用

暗中认可情状下,Python 三 源码文件以UTF-8编码,全体字符串都以 unicode
字符串。 当然你也足以为源码文件钦赐不一样的编码:

在jinjia2模板中,使用{# #}进行代码注释,如下所示

# -*- coding: cp-1252 -*-

4858.com 1

最常见的正是utf-八

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

# -*- coding: utf-8 -*-

 4858.com 2 

诚如写在py文件的顶部。

去掉空行

2.标识符

三种艺术能够去掉jinjia二模板中的空白行,一是安装jinjia贰的意况变量,如下

率先个字符必须是字母表中字母或下划线_。

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

标记符的其余的局地由字母、数字和下划线组成。

另一种是通过在模板的逻辑块中增多-号

标识符对大小写敏感。

{% 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 %}

在 Python 3 中,非 ASCII 标记符也是同意的了。

 

3.python保留字

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

保留字即入眼字,我们无法把它们作为其余标记符名称。Python
的标准库提供了二个 keyword 模块,可以出口当前版本的有所主要字:

注:-是标签的壹局地,所以中级不要有空格

>>> importkeyword

上面那种表明是违法的:

>>> keyword.kwlist[‘False’, ‘None’, ‘True’, ‘and’, ‘as’,
‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’,
‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’,
‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’,
‘try’, ‘while’, ‘with’, ‘yield’]

{% – if xxx %}

4858.com 3

转义

4.注释

想要在模板中输出原生jinjia二语法,必要开始展览转义,转义有三种艺术

Python中单行注释以#开头,实比方下:

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

#注释 print (“Hello, Python!”)

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

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

4858.com 4

转出职能:

多行注释能够用三个 # 号,还有 ”’ 和 “””:

 4858.com 5

# 第1个注释# 第1个注释”’

 

其三批注

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

第5声明

{% raw %}

    <ul>

    {% for item in seq %}

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

    {% endfor %}

    </ul>

{% endraw %}

”'”””

运行效果:

第陆解说

 4858.com 6

第4申明

 

“””print (“Hello, Python!”)

行语句

进行以上代码,输出结果为:

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

app.jinja_env.line_statement_prefix="#"

Hello, Python!

并且在模板中插足行语句

伍.行与缩进

# if True

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

# endif

python最具特点的正是行使缩进来代表代码块,不须求选拔大括号{}。

运作效果:

缩进的空格数是可变的,然而同3个代码块的说话必须包罗一样的缩进空格数。实举例下

 4858.com 7 

if True:print (“True”)

行注释

else:    print (“False”)

通过安装line_comment_prefix可以完毕行注释,步骤跟行语句一样,比方,我们设置:

以下代码最终1行语句缩进数的空格数不等同,会导致运营错误:

app.jinja_env.line_comment_prefix = "$"

if True:    print (“Answer”)    print (“True”)else:    print (“Answer”)
 print (“False”)    # 缩进不雷同,会招致运营错误

在模板中参预注释

上述程序由于缩进不相同样,执行后会出现类似以下错误:

$行注释,不输出

File “test.py”, line 6    print (“False”)    #
缩进不均等,会导致运转错误IndentationError: unindent does not match any
outer indentation level

4858.com 8

六.多行语句

运营后,查看源码,开采注释没有被输出

Python
常常是单排写完一条语句,但只要语句非常长,大家得以选用反斜杠(\)来兑现多行语句,比如:

 4858.com 9

total = item_one + \

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

       item_two + \

       item_three

在 [ ], { }, 或 ( ) 中的多行语句,无需采取反斜杠(\),例如:

total = [‘item_one’, ‘item_two’, ‘item_three’,        ‘item_four’,
‘item_five’]

7.数字(Number)类型

python中数字有八种档案的次序:整数、长整数、浮点数和复数。

int(整数), 如 一, 只有壹种整数类型 int,表示为长整型,未有 python第22中学的 Long。

bool(布尔),如 true,false

float(浮点数), 如 1.23、3E-2

complex(复数), 如 1 + 2j、 1.1 + 2.2j

8.字符串(String)

python中单引号和双引号使用完全一样。

动用三引号(”’或”””)能够钦点一个多行字符串。

转义符 ‘\’

反斜杠能够用来转义,使用r能够让反斜杠不发生转义。。 如 r”this is a line
with \n” 则\n会突显,并不是换行。

按字面意义级联字符串,如”this ” “is ” “string”会被电动转变为this is
string。

字符串能够用 + 运算符连接在一齐,用 * 运算符重复。

Python 中的字符串有三种索引形式,从左往右以 0 起先,从右往左以 -壹 起首。

Python中的字符串无法退换。

Python 未有单身的字符类型,一个字符正是长度为 一 的字符串。

字符串的截取的语法格式如下:变量[头下标:尾下标]

word = ‘字符串’sentence = “那是1个句子。”paragraph = “””那是一个段子,

能够由多行组成”””

四个语句构成代码组

缩进相同的壹组语句构成三个代码块,大家称之代码组。

像if、while、def和class那样的复合语句,首行以主要字开始,以冒号( :
)甘休,该行之后的一行或多行代码构成代码组。

作者们将首行及末端的代码组称为多个子句(clause)。

正如实例:

if expression :

  suiteelif expression :

  suite else :

  suite

实例

#!/usr/bin/python3str=’Runoob’print(str)

# 输出字符串print(str[0:-1])           #
输出第贰个到倒数第3个的持有字符print(str[0])              #
输出字符串第3个字符print(str[2:5])            #
输出从第二个起来到第伍个的字符print(str[2:])             #
输出从第四个开端的后的有着字符print(str * 2)             #
输出字符串一次print(str + ‘你好’)        #
连接字符串print(‘——————————‘)print(‘hello\nrunoob’)
     # 使用反斜杠(\)+n转义特殊字符print(r’hello\nrunoob’)     #
在字符串前边增添2个 r,表示原始字符串,不会产生转义

输出结果为:

RunoobRunooR

noo

noobRunoobRunoobRunoob你好——————————hello

runoob

hello\nrunoob

9.空行

函数之间或类的方式之间用空行分隔,表示壹段新的代码的发端。类和函数入口之间也用壹行空行分隔,以优异函数入口的开头。

空行与代码缩进不相同,空行并不是Python语法的壹有的。书写时不插入空行,Python解释器运转也不会出错。但是空行的职能在于分隔两段区别成效或含义的代码,便于日后代码的保卫安全或重构。

记住:空行也是程序代码的1局地。

拾.等候用户输入

实施上边包车型地铁先后在按回车键后就能等待用户输入:

#!/usr/bin/python3input(“\n\n按下 enter 键后退出。”)

如上代码中 ,”\n\n”在结果输出前会输出多少个新的空行。1旦用户按下 enter
键时,程序将退出。

1一.同1行展现多条语句

Python能够在同样行中动用多条语句,语句之间接纳分号(;)分割,以下是二个粗略的实例:

#!/usr/bin/python3import sys; x = ‘runoob’; sys.stdout.write(x + ‘\n’)

实施以上代码,输出结果为:

runoob7

12.Print 输出

print 暗许输出是换行的,若是要完毕不换行供给在变量末尾加上end=””

#!/usr/bin/python3x=”a”y=”b”# 换行输出print( x )print( y
)print(‘———‘)# 不换行输出print( x, end=” ” )print( y, end=” ”
)print()

如上实例推行结果为:

a

b———a b

4858.com 10

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有