首页 > 编程问答 >如何更新 jinja2 中的字典键值列表

如何更新 jinja2 中的字典键值列表

时间:2024-08-01 04:29:10浏览次数:14  
标签:python jinja2 jinja2-cli

我已将字典的键 domain 设置为空字符串“”。我正在检查 dict key ssluser 的 var 字段是否已定义,如果是,则我需要从提供的用户值中填写电子邮件域数据。

{% 
  set sslusers= [
    {      
      'ssluser': SSL_VPN_User01,
      'sslusercred': SSL_USER_CRED01,
      'index': 0,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User02,
      'sslusercred': SSL_USER_CRED02,
      'index': 1,
      'domain': ""
    },
    {     
      'ssluser': SSL_VPN_User03,
      'sslusercred': SSL_USER_CRED03,
      'index': 2,
      'domain': ""
    },
    {   
      'ssluser': SSL_VPN_User04,
      'sslusercred': SSL_USER_CRED04,
      'index': 3,
      'domain': ""
    },
    {      
      'ssluser': SSL_VPN_User05,
      'sslusercred': SSL_USER_CRED05,
      'index': 4,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User06,
      'sslusercred': SSL_USER_CRED06,
      'index': 5,
      'domain': ""
    },
    {     
      'ssluser': SSL_VPN_User07,
      'sslusercred': SSL_USER_CRED07,
      'index': 6,
      'domain': ""
    },
    {   
      'ssluser': SSL_VPN_User08,
      'sslusercred': SSL_USER_CRED08,
      'index': 7,
      'domain': ""
    },
    {      
      'ssluser': SSL_VPN_User09,
      'sslusercred': SSL_USER_CRED09,
      'index': 8,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User10,
      'sslusercred': SSL_USER_CRED10,
      'index': 9,
      'domain': ""
    }
  ] 
%}

我正在尝试做的 jinja 块这个:

{%- for item in sslusers if item.ssluser is defined %}
    {% set domain_value_old = item.ssluser['domain'] %}
    {% for key, value in item.items() %}
        {% if key == 'domain' %}
            {% set domain_value_new = value.split('@') | last %}
            <update dicts in the list with the new value only for 'domain' key>
        {% endif %}
     {% endfor %}
{% endfor %}

我被困在 set domain_value_new... 下的线路上。对于上下文,我在 cli 脚本中使用它,该脚本是在网络设备上运行的 jinja 模板。


可以在 Jinja2 中使用循环索引来更新字典列表中的“domain”键。以下是如何执行此操作:

{% set sslusers= [
    {      
      'ssluser': SSL_VPN_User01,
      'sslusercred': SSL_USER_CRED01,
      'index': 0,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User02,
      'sslusercred': SSL_USER_CRED02,
      'index': 1,
      'domain': ""
    },
    {     
      'ssluser': SSL_VPN_User03,
      'sslusercred': SSL_USER_CRED03,
      'index': 2,
      'domain': ""
    },
    {   
      'ssluser': SSL_VPN_User04,
      'sslusercred': SSL_USER_CRED04,
      'index': 3,
      'domain': ""
    },
    {      
      'ssluser': SSL_VPN_User05,
      'sslusercred': SSL_USER_CRED05,
      'index': 4,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User06,
      'sslusercred': SSL_USER_CRED06,
      'index': 5,
      'domain': ""
    },
    {     
      'ssluser': SSL_VPN_User07,
      'sslusercred': SSL_USER_CRED07,
      'index': 6,
      'domain': ""
    },
    {   
      'ssluser': SSL_VPN_User08,
      'sslusercred': SSL_USER_CRED08,
      'index': 7,
      'domain': ""
    },
    {      
      'ssluser': SSL_VPN_User09,
      'sslusercred': SSL_USER_CRED09,
      'index': 8,
      'domain': ""
    },
    {
      'ssluser': SSL_VPN_User10,
      'sslusercred': SSL_USER_CRED10,
      'index': 9,
      'domain': ""
    }
  ] 
%}

{% for item in sslusers %}
  {% if item.ssluser is defined and item.ssluser %}
    {% set sslusers[loop.index0].domain = item.ssluser.split('@') | last %}
  {% endif %}
{% endfor %}

{{ sslusers }} 

解释:

  1. loop.index0 : 我们使用 loop.index0 来获取当前循环迭代的索引。请注意, loop.index0 从 0 开始。
  2. sslusers[loop.index0].domain : 我们使用此语法来直接访问 sslusers 列表中特定索引处的字典元素的 domain 键。
  3. item.ssluser.split('@') | last : 如果 item.ssluser 已定义且非空,则此部分会提取 @ 符号后的电子邮件地址部分,并将其赋值给相应的 domain 键。

通过这种方式,可以在迭代列表时更新 sslusers 列表中每个字典的 domain 键。

标签:python,jinja2,jinja2-cli
From: 78818263

相关文章

  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
    当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python提供了强大的正则表达式库re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。分组(Grouping)在正则表达式中,分组是将多个模式单元组合为一个单元,以便......
  • 零基础学python 之 第十九讲 正则表达式
    当你开始学习Python编程时,正则表达式是一项非常强大的工具,用于处理文本数据中的模式匹配和搜索。本篇博客将带你从零开始学习如何在Python中使用正则表达式。1.什么是正则表达式?正则表达式(RegularExpression)是用于描述字符串模式的一种工具,可以用来匹配、查找、替换符合特......
  • python之贪吃蛇
    废话不多说,直接上代码(确保已经安装pygame)importpygameimportrandom#基础设置#屏幕高度SCREEN_HEIGHT=480#屏幕宽度SCREEN_WIDTH=600#小方格大小GRID_SIZE=20#颜色设置WHITE=(255,255,255)BLACK=(0,0,0)GREEN=(0,255,0)#初始化Pyg......
  • Python - Context Managers
    withstatementHereisthesyntaxofthewithstatement:withexpressionasvar:statementsTheexpressionshouldbeacontextmanagerobject,oritshouldproduceacontextmanagerobject.Whenthiswithstatementisexecuted,thefirstthingthat......