首页 > 游戏测评 >  > 

jinja2循环中的超链接 循环linkedhashmap

如何在jinja2的form中使用js

办法1.同一个页面中建立两个表单 各自提交: 办法2:如果非要只有一个表单的话,通过js提交: function submitYouFrom(path){ $('form1').action=path; $('form1').submit(); }

jinja2循环中的超链接 循环linkedhashmapjinja2循环中的超链接 循环linkedhashmap


jinja2循环中的超链接 循环linkedhashmap


jinja2 怎样获取循环 的索引

办法1.同一个页面中建立两个表单 各自提交: 办法2:如果非要只有一个表单的话,通过js提交: function submitYouFrom(path){ $('form1').action=path; $('form1').submit(); }

HttpRunner2.x源码分析——生成报告

在 api.py 中的run_tests函数中,runner执行测试用例并生成报告

api.py的_aggregate函数:

得到测试结果汇总后,通过 report.py 的 stringify_summary 函数将测试汇总串化,以便转储json文件并生成html报告。

串化测试汇总后,通过 report.py 的 render_html_report 函数生成html报告

runner使用jinja2生成测试报告,下文简单介绍jinja2的用法,想要更深入了解请查看:

在jinja2中有3中语法:

过滤器相当于jinja2中的内置函数,可以对变量进行相应的处理,常用的过滤器有:

过滤器用法:在变量后使用管道 | 调用,可链式调用

for循环由于迭代python中的列表和字典

宏相当于jinja2的自定义函数,定义宏的关键字是macro,后接宏的名称和参数

调用宏

jinja2中强大的部分就是模板继承。模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。

jinja2的骨架文件中,利用block关键字表示其包涵的内容可以进行修改。

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

jinja2模块中有一个名为Enviroment的类,这个类的实例用于存储配置和全局对象,然后从文件系统或其他位置中加载模板。

大多数应用都在初始化的时候撞见一个Environment对象,并用它加载模板。Environment支持两种加载方式:

使用包加载器来加载文档的简单的方式如下:

其中:

文件系统加载器,不需要模板文件存在某个Python包下,可以直接访问系统中的文件。

在Python中使用HTML模版的教程

这篇文章主要介绍了在Python中使用HTML模版的教程,HTML模版也是Python的各大框架下的一个基本功能,需要的朋友可以参考下。Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。

但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来么?反正我是做不到。

俗话说得好,不懂前端的Python工程师不是好的产品。有Web开发经验的同学都明白,Web App复杂的部分就在HTML页面。HTML不仅要正确,还要通过CSS美化,再加上复杂的JaScript脚本来实现各种交互和动画效果。总之,生成HTML页面的难度很大。

由于在Python代码里拼字符串是不现实的,所以,模板技术出现了。

使用模板,我们需要预先准备一个HTML文档,这个HTML文档不是普通的HTML,而是嵌入了一些变量和指令,然后,根据我们传入的数据,替换后,得到终的HTML,发送给用户:

这就是传说中的MVC:Model-View-Controller,中文名“模型-视图-”。

Python处理URL的函数就是C:Controller,Controller负责业务逻辑,比如检查用户名是否存在,取出用户信息等等;

包含变量{{ name }}的模板就是V:View,View负责显示逻辑,通过简单地替换一些变量,View终输出的就是用户看到的HTML。

MVC中的Model在哪?Model是用来传给View的,这样View在替换变量的时候,就可以从Model中取出相应的数据。

上面的例子中,Model就是一个dict:

{ name: Michael }

只是因为Python支持关键字参数,很多Web框架允许传入关键字参数,然后,在框架内部组装出一个dict作为Model。

现在,我们把上次直接输出字符串作为HTML的例子用高端大气上档次的MVC模式改写一下:

16

17

18

19

20

21

22

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route(/, mods=[GET, POST])

def home():

return render_template(home.html)

@app.route(/signin, mods=[GET])

def signin_form():

return render_template(form.html)

@app.route(/signin, mods=[POST])

def signin():

username = request.form[username]

password = request.form[password]

if username==admin and password==password:

return render_template(signin-ok.html, username=username)

return render_template(form.html, message=Bad username or password, username=username)

if __name__ == __main__:

app.run()

Flask通过render_template()函数来实现模板的渲染。和Web框架类似,Python的模板也有很多种。Flask默认支持的模板是jinja2,所以我们先直接安装jinja2:

?1

$ easy_install jinja2

然后,开始编写jinja2模板:

?1

home.html

用来显示首页的模板:

11

html

head

titleHome/title

/head

body

h1 style=font-style:italicHome/h1

/body

/html

form.html

用来显示登录表单的模板:

16

17

18

html

head

titlePlease Sign In/title

/head

body

{% if message %}

p style=color:red{{ message }}/p

{% endif %}

form action=/signin mod=t

legendPlease sign in:/legend

pinput name=username placeholder=Username value={{ username }}/p

pinput name=password placeholder=Password type=password/p

pbutton type=submitSign In/button/p

/form

/body

/html

signin-ok.html

登录成功的模板:

?7

8html

head

titleWelcome, {{ username }}/title

/head

body

pWelcome, {{ username }}!/p

/body

/html

登录失败的模板呢?我们在form.html中加了一点条件判断,把form.html重用为登录失败的模板。

后,一定要把模板放到正确的templates目录下,templates和app.py在同级目录下:

启动python app.py,看看使用模板的页面效果:

通过MVC,我们在Python代码中处理M:Model和C:Controller,而V:View是通过模板处理的,这样,我们就成功地把Python代码和HTML代码限度地分离了。

使用模板的另一大好处是,模板改起来很方便,而且,改完保存后,刷新浏览器就能看到新的效果,这对于调试HTML、CSS和JaScript的前端工程师来说实在是太重要了。

在Jinja2模板中,我们用{{ name }}表示一个需要替换的变量。很多时候,还需要循环、条件判断等指令语句,在Jinja2中,用{% ... %}表示指令。

比如循环输出页码:

?1

23

{% for i in page_list %}

a href=/page/{{ i }}{{ i }}/a

{% endfor %}

如果page_list是一个list:[1, 2, 3, 4, 5],上面的模板将输出5个超链接。

除了Jinja2,常见的模板还有:

Mako:用和${xxx}的一个模板;

Cheetah:也是用和${xxx}的一个模板;

Django:Django是一站式框架,内置一个用{% ... %}和{{ xxx }}的模板。

小结

有了MVC,我们就分离了Python代码和HTML代码。HTML代码全部放到模板里,写起来更。

2019-05-30 Python+Jinja2+yaml 批量生成配置

目前来看,Python+yaml+Jinja2是非常方便生成批量配置的组合,在运维工作中用于批量生成设备的基础配置。

这里我的案例是配置一批交换机,基础配置不同的地方有:loopback地址(IPV4和IPV6),设备名称,网络号,至于其他互联地址什么的因为情况比较复杂,还是手工做吧。

那么思路就有了。

1、生成yaml文件,类似于下面结构:

这里说明一下,loopback地址的V4网段是先规划好的,V6地址和网络号通过一定规则根据V4地址生成,这个yaml文件可以通过读取excel文件,按照算法生成yaml文件,这个在其他文章里再写。

2、读取yaml文件,生成一个由字典组成的列表。每个字典的信息就包含了每台设备需要的变量。

3、写一个函数,遍历列表里的字典,每读取一个字典,把其中变量取出来放进一个临时字典,渲染jinja2的模板,对每个字典输出不同的配置文件。这个临时字典每读取一次就清空,重新写入变量。

有一些细节比如文档取名,时间函数等要调用一些模块,总结一下涉及的知识点,有:yaml模块,jinja2模块,os模块,日期函数,条件循环,I/O作。

附上python脚本:

模板文件放在‘templates’目录下,否则会报错找不到文件。

python新手,有不合理的地方请高手指点。

Jinja2 教程 循环和条件

欢迎来到我的 Jinja2 教程的第 2 部分。在第 1 部分中,我们了解了 Jinja2 是什么,它的用途是什么,并开始研究模板基础知识。接下来是循环和条件语句,其中包含测试和大量示例!

在 Jinja2 中,循环和条件被称为控制结构,因为它们会影响程序的流程。 {% 控制结构使用由和 %} 字符包围的块。

我们首先要看的结构是循环。

Jinja2 作为一种模板语言不需要广泛的循环类型选择,所以我们只得到 for 循环。

For 循环以 开头 {% for my_ in my_collection %} 和结尾 {% endfor %} 。这与您在 Python 中循环迭代的方式非常相似。

这 my_ 是一个循环变量,它将在我们遍历元素时获取值。并且 my_collection 是持有对迭代的引用的变量的名称。

在循环体内部,我们可以 my_ 在其他控制结构中使用变量,比如 if 条件,或者简单地使用 {{ my_ }} 语句显示它。

好的,但是你会在哪里使用你问的循环?在您的模板中使用单个变量在大多数情况下都可以正常工作,但您可能会发现引入层次结构和循环将有助于抽象您的数据模型。

例如,前缀列表或 ACL 由许多行组成。将这些行表示为单个变量是没有意义的。

初,您可以使用每行一个变量对特定前缀列表进行建模,如下所示:

可以在以下模板中使用:

渲染结果:

这种方法虽然有效,但也存在一些问题。

如果我们想在前缀列表中有更多行,我们必须创建另一个变量,然后再创建一个,以此类推。我们不仅必须将这些新项目添加到我们的数据结构中,模板还必须单独包含所有这些新变量。这是不可维护的,消耗大量时间并且很容易出错。

有一个更好的方法,考虑下面的数据结构:

以及模板渲染前缀列表配置:

渲染后:

如果您仔细观察,您会发现这本质上是对同一事物进行建模,即带有多个条目的前缀列表。但是通过使用列表,我们清楚地说明了我们的意图。即使在视觉上,您也可以立即看出所有缩进的行都属于 PL_AS_65003_IN。

在这里添加前缀列表很简单,我们只需要在块中添加一个新行。此外,我们的模板根本不需要更改。如果我们使用循环来迭代,就像我们在这里所做的那样,遍历这个列表,那么如果我们重新运行渲染,新的行将被拾取。小小的改变,但让事情变得容易多了。

您可能已经注意到这里仍有改进的空间。前缀列表的名称在前缀列表定义和我们的 for 循环中是硬编码的。不要害怕,这是我们很快会改进的。

现在让我们看看如何遍历字典。我们将再次使用 for 循环构造,记住,这就是我们所拥有的!

我们可以使用与迭代列表元素相同的语法,但这里我们将迭代字典键。要检索分配给键的值,我们需要使用下标,即 [] 符号。

使用字典而不是列表的一个优点是我们可以使用元素的名称作为参考,这使得检索对象及其值变得更加容易。

设我们使用 list 来表示我们的接口:

没有简单的方法来检索 Ethernet2 条目。我们要么必须遍历所有元素并进行键名比较,要么必须求助于高级过滤器。

需要注意的一件事(希望这一点越来越明显)是我们需要花一些时间对数据进行建模,以便于使用。这是您在次尝试时很少会做对的事情,所以不要害怕尝试和迭代。

按照我们的示例,我们可以将数据保存在分配给 inteces 字典中键的各个接口上,而不是将它们放在列表中:

现在我们可以像这样在模板中访问这些数据:

给我们终结果:

这里 intf 指的是 Ethernet1 和 Ethernet2 键。要访问每个接口的属性,我们需要使用 inteces[intf] 符号。

还有另一种迭代字典的方法,我个人更喜欢。 s() 我们可以通过使用方法同时检索键和它的值。

终结果是相同的,但通过使用 s() 方法,我们简化了对属性的访问。如果您想递归地迭代深度嵌套的字典,这一点就变得尤为重要。

我还承诺展示如何改进前缀列表示例,这就是它的 s() 用武之地。

我们通过使每个前缀列表名称成为字典中的键来对我们的数据结构进行小修改 prefix_lists

我们现在添加外循环迭代字典中的键值对:

渲染给我们同样的结果:

在这里,不再有对前缀列表名称的硬编码引用!如果您需要另一个前缀列表,您只需将其添加到字典中,它就会被我们的循环 prefix_lists 自动拾取。 for

注意: 如果您使用的是 Python < 3.6 的版本,则不订购字典。这意味着您记录数据的顺序可能与模板内处理项目的顺序不同。

如果您依赖于它们被记录的顺序,您应该 collections.OrderedDict 在 Python 脚本中使用 Jinja2 时使用,或者您可以 dictsort 在模板中应用过滤器以按键或值对字典进行排序。

按键排序:

按值排序:

这就结束了 Jinja2 模板中循环的基础知识。上述用例应满足您 95% 的需求。

如果您正在寻找与循环相关的一些高级功能的讨论,请放心,我也会写这些内容。我决定在本教程的后几章留下更深入的 Jinja2 主题,并专注于让您更快地提高工作效率的核心内容。

现在我们已经完成了循环,是时候继续讨论条件了。

Jinja2 实现了一种条件语句,即 if 语句。对于分支,我们可以使用 elif and else 。

Jinja2 中的条件可以以几种不同的方式使用。现在,我们将看看一些用例以及它们如何与其他语言特性相结合。

我们首先要看的是将值与条件进行比较,这些使用 ==, !=, >, >=,

版权声明:本文内容由互联网用户自发贡献。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 836084111@qq.com,本站将立刻删除。