- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 python 和 mako 非常陌生,我可能在基本概念上遇到困难。我有工作模板,但如果我可以使用 netaddr 模块来处理模板中的 IP 地址,我的 CSV 输入可以得到很大的清理。我想做的是传递一个接口(interface) IP 变量,例如:LAN_IP = '192.168.1.1/24'(我从 CSV 中执行此操作)到模板,然后以某种方式使用 netaddr 模块来填写 IP、子网掩码(点分十进制和反掩码)和网络地址,这样我可以在同一配置中将这一 CSV 变量用于 bgp 网络语句、eigrp 掩码和 ACL 等。我可以从 Python shell 执行以下操作:
>>> from netaddr import *
>>> LAN_IP = '192.168.1.1/24'
>>> IP = IPNetwork(LAN_IP)
>>> print(IP.ip)
192.168.1.1
>>> print(IP.network)
192.168.1.0
>>> print(IP.netmask)
255.255.255.0
>>> print(IP.hostmask)
0.0.0.255
编辑。我被告知要尝试内置的 ipaddress 功能。在 Python 提示符下尝试此操作表明它可以工作:
MAKO_TEMPLATE_STRING = """\
<%def name="get_netmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).netmask
%></%def>
<%def name="get_address(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).ip
%></%def>
<%def name="get_subnet(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).network
%></%def>
<%def name="get_hostmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).hostmask
%></%def>
! Variable Input: ${data}
${get_address(data)} ${get_netmask(data)} ${get_subnet(data)} ${get_hostmask(data)}
"""
print(Template(MAKO_TEMPLATE_STRING).render(data="192.168.1.1/25"))
这给了我以下输出:!变量输入:192.168.1.1/25192.168.1.1 255.255.255.128 192.168.1.0/25 0.0.0.127
现在,一个新问题是 ipaddress.IPv4Interface(ip_string).network 定义返回网络加上子网“192.168.1.0/25”,而 netaddr 没有这样做。我还没有找到任何方法让 ipaddress 仅返回子网部分。
因此,对于模板构建,我走得更远了......如果我仅将其放入模板中,它就会验证:
<%def name="get_netmask(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).netmask
%></%def>
<%def name="get_address(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).ip
%></%def>
<%def name="get_network(ip_string)"><%
import ipaddress
return ipaddress.IPv4Interface(ip_string).network
%></%def>
但是当我尝试任何类型的引用时,我都会收到错误。
! Variable Input: ${LAN_IP} <--I tried with and without this line
${get_address(LAN_IP)} <--The template does not seem to like these references.
${get_netmask(LAN_IP)}
${get_subnet(LAN_IP)}
在我看来,我在这里遗漏了一些非常简单的东西,但也许我正在以错误的方式处理问题。任何帮助将不胜感激,因为 Mako 文档和 Google 几乎没有提供任何帮助来说明如何做这样的事情。
最佳答案
问题出在验证代码上。在模板的 python 部分中,类 IPv4Interface 将因验证过程中的值无效而引发异常。因此,服务器拒绝表单数据并且不会创建模板。
解决方案:如果将错误处理添加到模板的 python 部分,就会起作用。
<%!
## python module-level code
import ipaddress
%>
<%def name="get_address(ip_string)">
<%
try:
return ipaddress.IPv4Interface(ip_string).ip
except Exception:
return "FAIL_OR_EMPTY"
%>
</%def>
! Variable Input: ${LAN_IP}
${get_address(LAN_IP)}
说明:在 HTML 表单的服务器端验证期间,配置模板会使用虚拟参数集进行呈现,以验证语法(请参阅文件 app/forms.py,类 ConfigTemplateForm)。您的配置模板在表单验证期间使用以下参数集进行验证:
{
"hostname": "test",
"LAN_IP": "test"
}
关于python - 使用 mako 生成 Cisco 配置。是否可以在模板中使用 netaddr 模块(或任何模块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640281/
我想使用 netaddr 查找给定地址的子网起始地址(网络 ID)。 输入示例:192.168.1.130/26 示例输出:192.168.1.0 192.168.1.64 192.168.1.128
我想使用 netaddr 库将 netmask 转换为 wildcard mask 所以输入是 netmask = 255.255.255.0 输出是 wildcard = 0.0.0.255 或者输
我必须在这里做错事......我目前正在尝试使用内置模块验证 ip 是否在特定子网内。 我正在使用 activepython: ActivePython 3.1.2.3 (ActiveState So
我正在尝试使用 python 中的 netaddr 超网 IP 网络列表。 代码: import netaddr from netaddr import * iplist = [IPNetwork('
我正在按照安装说明安装 netaddr ( https://pythonhosted.org/netaddr/installation.html ),但不确定如何完成安装。 我已经从 https://
我试图了解 https://pythonhosted.org/netaddr/tutorial_01.html 上的 netaddr Python 教程中的某些代码是如何运行的。特别是以下教程。 Su
我有一个包含以下标题的静态 CSV 文档 City State Zip Latitude Longitude Subnet Wired1 Wired2 Wireless1
netaddr python 模块跳过 ImportError。我必须创建一个函数来使用 try/finally 来捕获 ImportError,然后重做 try/except 以返回打印值。想知道是
python 3.3.4网络地址 7.12Mac OSX 10.8.5 我有一个不会与 netaddr.cidr_merge() 合并的 IPNetworks 列表,即使有些是相邻的。我做错了什么吗?
我正在使用 Ruby NetAddr::Tree 类来保存一堆 CIDR 对象,但我需要一种方法将 CIDR 对象压缩到更大的子网中。 我想要一种获取 IP 的方法: 12.26.8.0/21 12.
使用 ruby 2.0.0,如何将 IPAddr 类型的对象转换为 NetAddr::CIDR? 例子: IPAddr.new("1a03:a240:0100::/56") IPAddr.new(
我可以传递“ip_list”和“banned_subnets”中的文件吗?我有多个 IP 列表,需要与多个子网匹配,并且不可能在脚本中将它们全部列出。为此,我创建了两个文件 ipaddr_list(其
我对 python 和 mako 非常陌生,我可能在基本概念上遇到困难。我有工作模板,但如果我可以使用 netaddr 模块来处理模板中的 IP 地址,我的 CSV 输入可以得到很大的清理。我想做的是
我正在使用 python-netaddr 库处理 IP 地址和子网。我阅读了 netaddrd 的完整文档:Netaddr documentation .但是没有找到解决我的问题的方法。我有一个 IP
我是一名优秀的程序员,十分优秀!