是否可以将Python模块导入Jinja模板,以便我可以使用它的功能?
例如,我有一个format.py文件,其中包含格式化日期和时间的方法.在神社宏,我可以做一些像下面?
{% from 'dates/format.py' import timesince %}
{% macro time(mytime) %}
<a title="{{ mytime }}">{{ timesince(mytime) }}</a>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
因为format.py不是模板,上面的代码给出了这个错误:
UndefinedError: the template 'dates/format.py' (imported on line 2 in 'dates/macros.html') does not export the requested name 'timesince'
Run Code Online (Sandbox Code Playgroud)
......但我想知道是否还有另一种方法来实现这一目标.
我需要在jinja2中格式化十进制数字.
当我需要格式化日期时,我在模板中调用strftime()方法,如下所示:
{{ somedate.strftime('%Y-%m-%d') }}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有类似的方法来做这个数字.
提前致谢!
我想在我的Flask应用程序中包含一个sass编译器.有一种普遍接受的方式吗?
我试图用一个if来确定哪个块应该填满我的{% block content %}.
我有一个base.html默认值{% block content %},这个模板正在扩展base.html.所以我尝试了这个:
{% extends "base.html" %}
{% if condition == True %}
{% block content %}
<div>blah blah blah blah</div>
{% endblock content %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
而且我期待看到blah blah blah blah条件是否为真并且如果不是真的则看默认块.
但我两次都得到了blah blah blah blah.
然后我尝试了这个:
{% extends "base.html" %}
{% if condition == True %}
{% block content %}
<div>blah blah blah blah</div>
{% endblock content %}
{% else …Run Code Online (Sandbox Code Playgroud) 不幸的是,Jinja不支持执行任意Python代码,例如
{% if len(some_var)>1 %} ... {% endif %}
Run Code Online (Sandbox Code Playgroud)
我目前的解决方法是使用弃用的,丑陋的双下划线方法:
{% if some_var.__len__()>1 %} ... {% endif %}
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但我担心将来某些字符串的实现可能会破坏这段代码.有一个更好的方法吗?
让我们假设一个像这样的库存文件:
node-01 ansible_ssh_host=192.168.100.101
node-02 ansible_ssh_host=192.168.100.102
node-03 ansible_ssh_host=192.168.100.103
node-04 ansible_ssh_host=192.168.100.104
node-05 ansible_ssh_host=192.168.100.105
[mainnodes]
node-[01:04]
Run Code Online (Sandbox Code Playgroud)
在我的剧本中,我现在想要创建一些包含该组IP地址的变量mainnodes:
vars:
main_nodes_ips: "192.168.100.101,192.168.100.102,192.168.100.103,192.168.100.104"
main_nodes_ips_with_port: "192.168.100.101:3000,192.168.100.102:3000,192.168.100.103:3000,192.168.100.104:3000"
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所得到的:
vars:
main_nodes_ips: "{{groups['mainnodes']|join(',')}}"
main_nodes_ips_with_port: "{{groups['mainnodes']|join(':3000,')}}"
Run Code Online (Sandbox Code Playgroud)
但那会使用主机名而不是IP地址.
有什么想法可以做到这一点?
更新:
看了一段时间的文档,我认为这将允许我遍历所有的IP地址:
{% for host in groups['mainnodes'] %}
{{hostvars[host]['ansible_ssh_host']}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何创建一个包含所有这些IP的数组.这样我就可以|join()对它们使用命令了.
Update2:
我只是觉得我已经弄明白了......但事实证明你不能在剧本中使用{%%}语法......或者我可以吗?在vars部分,它没有.:/
vars:
{% set main_nodes_ip_arr=[] %}
{% for host in groups['mesos-slave'] %}
{% if main_nodes_ip_arr.insert(loop.index,hostvars[host]['ansible_ssh_host']) %} {% endif %}
{% endfor %}
main_nodes_ips: "{{main_nodes_ip_arr|join(',')}}"
main_nodes_ips_with_port: "{{main_nodes_ip_arr|join(':3000,')}}"
Run Code Online (Sandbox Code Playgroud) 我正在尝试将浮点格式化为逗号分隔的货币.我543921.9354变成了$543,921.94.我format在Jinja模板中使用过滤器,它似乎模仿%Python中的运算符而不是Python format函数?
如何在Jinja中完成此格式化?是否可以使用format过滤器?这就是我到目前为止所做的事情,它除了逗号之外还完成了所有事情:
"$%.2f"|format(543921.9354)
这当然会产生
$543921.94
我正在使用Python 2.6和Jinja2来创建HTML报告.我为模板提供了许多结果,模板循环遍历它们并创建HTML表
在调用template.render时,我突然开始收到此错误.
<td>{{result.result_str}}</td>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,即使我将result.result_str设置为一个简单的ascii字符串,如每个结果的"abc",我仍然看到这个错误.我是Jinja2和Python的新手,我很欣赏任何有关如何调查问题以找到根本原因的想法.
我试图在jinja2模板中使用css设置文本颜色.在下面的代码中,我想将输出字符串设置为以特定字体颜色打印(如果变量包含字符串).每次生成模板虽然由于else语句而以红色打印,但它永远不会看到前两个条件,即使输出应该匹配,我可以告诉变量的输出是什么,当表生成时它是如预期的那样.我知道我的css是正确的,因为默认情况下打印的字符串为红色.
我的第一个想法是用引号括起我正在检查的字符串,但这不起作用.接下来是jinja没有扩展,RepoOutput[RepoName.index(repo)]但它上面的for循环工作,RepoName正确扩展.我知道如果我添加大括号它将打印变量,我相当肯定会破坏模板或只是不工作.
我尝试查看这些网站,并浏览了全局表达式列表,但找不到任何类似于我的示例或进一步查看的方向.
http://jinja.pocoo.org/docs/templates/#if
http://wsgiarea.pocoo.org/jinja/docs/conditions.html
{% for repo in RepoName %}
<tr>
<td> <a href="http://mongit201.be.monster.com/icinga/{{ repo }}">{{ repo }}</a> </td>
{% if error in RepoOutput[RepoName.index(repo)] %}
<td id=error> {{ RepoOutput[RepoName.index(repo)] }} </td> <!-- I want this in green if it is up-to-date, otherwise I want it in red -->
{% elif Already in RepoOutput[RepoName.index(repo) %}
<td id=good> {{ RepoOutput[RepoName.index(repo)] }} </td> <!-- I want this in green if it is up-to-date, otherwise I want it in …Run Code Online (Sandbox Code Playgroud) 我正在使用jinja 2输出一个yaml文件,但似乎无法摆脱尾随的换行符和for循环的结束.如下
- request:
path: {{ path }}
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'some.domain.com'
authority: 'somedomain.com'
querystring:
{% for key, value in querystring.items() -%}
{{ key }}: '{{ value }}'
{% endfor %}
response:
content:
file: {{ content }}
Run Code Online (Sandbox Code Playgroud)
给我输出:
- request:
path: /some/path
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'somedomain.com'
authority: 'somedomain.com'
querystring:
postcode: 'xxxxxx'
houseNo: '55'
response:
content:
file: address.json
Run Code Online (Sandbox Code Playgroud)
在houseNo之后还有一个不需要的空白行.我如何摆脱这条线?