如何在jinja中过滤词典?(代码片段)

author author     2023-05-12     405

关键词:

我有一个包的字典,包名是密钥,一些细节的字典是值:


        "php7.1-readline": 
            "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1", 
            "origins": [
                "ppa.launchpad.net"
            ], 
            "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1", 
            "www": "http://www.php.net/"
        , 
        "php7.1-xml": 
            "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1", 
            "origins": [
                "ppa.launchpad.net"
            ], 
            "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1", 
            "www": "http://www.php.net/"
        , 
        "plymouth": 
            "version": "0.8.8-0ubuntu17.1"
        ,
    ....

我想将上面的内容简化为仅包含其值中包含latest属性的包的字典。

似乎json_query是使用的过滤器,但我无法弄清楚语法。那里的例子似乎都在字典列表上运行,而不是相同的词典......

例如,如果我将上面的字典“管道”到json_query('*.latest'),我会得到实际最新版本的列表:

[
  "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
  "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
  "7.1.6-2~ubuntu14.04.1+deb.sury.org+1"
]

我怎样才能获得整个字典元素呢?

有希望吗?

答案

使用dict2items过滤器added in December 2017,可以使用本机功能:

- debug:
    msg: " dict(pkg | dict2items | json_query('[?value.latest].[key, value.latest]')) "

结果:

"msg": 
    "php7.1-readline": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
    "php7.1-xml": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1"

另一答案

您不能仅使用Jinja过滤器执行此转换(我认为),但您也可以通过应用一些Ansible逻辑来实现。下面的playbook使用with_dict循环遍历字典中的项目,并从匹配的字典中构建一个新的字典:

- hosts: localhost                                                              
  vars:                                                                         
    packages:                                                                  
        "php7.1-readline":                                                     
          "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",                     
          "origins": [                                                          
            "ppa.launchpad.net"                                                 
          ],                                                                    
          "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1",                    
          "www": "http://www.php.net/"                                          
        ,                                                                      
        "php7.1-xml":                                                          
          "latest": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",                     
          "origins": [                                                          
            "ppa.launchpad.net"                                                 
          ],                                                                    
          "version": "7.1.6-2~ubuntu14.04.1+deb.sury.org+1",                    
          "www": "http://www.php.net/"                                          
        ,                                                                      
        "plymouth":                                                            
          "version": "0.8.8-0ubuntu17.1"                                        
                                                                               
                                                                               

  tasks:                                                                        
    - set_fact:                                                                 
        new_packages: >                                                         
           new_packages|default()|                                          
                combine(item.key: item.value)                               
      with_dict: " packages "                                               
      when: " item.value.latest is defined "                                

    - debug:                                                                    
        var: new_packages                                                       
另一答案

您将此问题与https://stackoverflow.com/a/41584889/2795592相关联是正确的。

没有选项可以同时使用json_query操作键和值(从Ansible 2.4.0开始)。

这是补丁json_query.py,支持jq-like to_entries / from_entries函数。你可以把它放到你的剧本附近的./filter_plugins并进行这个查询:

- debug:
    msg: " pkg | json_query('to_entries(@) | [?value.latest].key:key, value:value.latest | from_entries(@)')"

得到这个结果:

"msg": 
    "php7.1-readline": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1",
    "php7.1-xml": "7.1.9-1+ubuntu14.04.1+deb.sury.org+1"

一旦我有空余时间,我就会让公关安全。

ansible中过滤器的介绍以及如何自定义过滤器(代码片段)

...个list2.5总结三、自定义过滤器四、总结之前介绍了关于如何通过shell,python,golang等语言实现自定义模块,可以参考这篇文章:今天主要是介绍下如何实现自定义过滤器来应对各种各样的场景。一、过滤器介绍在ansible中由于使用了... 查看详情

如何在 Flask/Jinja 模板中以不同于过滤器的方式使用管道?

】如何在Flask/Jinja模板中以不同于过滤器的方式使用管道?【英文标题】:HowtousepipeinFlask/Jinjatemplatedifferentlythanfilters?【发布时间】:2016-04-1922:42:04【问题描述】:我正在使用Flask和Jinja2templatingengine来构建网站。作为ORM,我使用... 查看详情

如何在 Jinja2 自定义过滤器中使用 Python 生成器

】如何在Jinja2自定义过滤器中使用Python生成器【英文标题】:HowtousePythonGeneratorinJinja2CustomFilter【发布时间】:2020-07-1900:10:35【问题描述】:我需要生成一个带有字母索引的文档,比如这个:Channels:-A:Foobaritem-B:Foobazitem-...我有带... 查看详情

在 jinja2 中使用 django 过滤器

...。由于我使用的是jinja2,因此我没有可用的时间过滤器。如何从django导入它并在jinja模板中使用。我看到了thisquestion,但它不能满足需要。【问题讨论】 查看详情

02-模板(过滤器,控制代码块)(代码片段)

...模板中字典,列表的取值方式能够写出数组反转的自定义过滤器(使用1种方式即可)能够说出Flask中模板代码复用的三种方式能够使用代码实现模板继承的功能能够说出可以在模板中直接使用的Flask变量和函数能够使用Flask-WTF扩... 查看详情

flask的jinja2模版过滤器(代码片段)

Jinja2模版过滤器过滤器是通过管道符号(|)进行使用的,例如:name|length,将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面... 查看详情

pythonpython过滤词典(代码片段)

查看详情

如何在python3中使用多个词典追加列表(代码片段)

作为我学习的一部分,我不得不使用append函数添加:video_ad_1="title":"HealthyLiving","company":"HealthPromotionBoard","views":15934video_ad_2="title":"Getaride,anytimeanywhere","company":"Uber","views":923834video_ad_3= 查看详情

ansible基础-jinja2模版|测试(代码片段)

...回True或False,经常和「when」语句搭配使用。测试语句和过滤器的相同点:测试语句的条件表达式也在控制端执行,在目的主机端生效。测试语句和过滤器的不同点:前者多被用于「比较」,执行结果是True或False,而后者多被用... 查看详情

如何调试 Jinja2 模板?

】如何调试Jinja2模板?【英文标题】:HowtodebugJinja2template?【发布时间】:2011-01-0110:07:09【问题描述】:我在django中使用jinja2模板系统。它真的很快,我非常喜欢它。不过,我在调试模板时遇到了一些问题:如果我在模板中犯了... 查看详情

flask过滤器(代码片段)

过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用Python中的某些方法,那么这就用到了过滤器。过滤器的使用方式为:变量名|... 查看详情

使用 Flask、SqlAlchemy 和 Jinja2 在 ORM 中引用过滤器项

】使用Flask、SqlAlchemy和Jinja2在ORM中引用过滤器项【英文标题】:ReferencingfilteritemsinORMwithFlask,SqlAlchemyandJinja2【发布时间】:2014-11-0923:01:19【问题描述】:我正在使用Flask来显示我从API收集的一些数据。它是饮料的形式,我已经有... 查看详情

如何从网站/词典中获取单个单词?(代码片段)

我正在尝试从字典website中获取一个单词。我希望将该单词保存为字符串,以便稍后将其翻译成另一种语言。这是我试过的代码:importrandomfromtranslateimportTranslatorimportrequestsresponse=requests.get(word_site)WORDS=response.content.splitlines()random_li... 查看详情

python筛选在特定键中具有特定值的词典的词典列表(代码片段)

查看详情

sanic-jinja2(代码片段)

sanic支持jinja2模板如果想使用flash和get_flashed_messages,首先需要设置会话。当前,app和request被挂载到jinja模板中,因此可以直接在模板中使用它们。而且,从版本0.3.0开始,enable_async默认为True。如果您需要同步功能,请使用jinja.ren... 查看详情

如何在 Django 1.8 中使用 jinja2 作为模板引擎

】如何在Django1.8中使用jinja2作为模板引擎【英文标题】:Howtousejinja2asatemplatingengineinDjango1.8【发布时间】:2015-08-2211:25:26【问题描述】:我一直在寻找如何在django1.8中使用jinja2,但是没有完整的源代码可以将django与jinja2一起使用... 查看详情

如何在 jinja (django) 中使用 for 循环显示最新的 5 个订单

】如何在jinja(django)中使用for循环显示最新的5个订单【英文标题】:Howtodisplaylatest5ordersbyusingforloopinjinja(django)【发布时间】:2021-09-3007:25:05【问题描述】:下面的代码将显示所有订单,但现在我只想在模板中显示5个最新订单。谁... 查看详情

jinja模板语言(代码片段)

...广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。  模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户。-->可以理... 查看详情