我正在尝试将一个lat/long点作为JSON对象从Python发送到javascript.我正在使用Flask所以以下是Jinja模板..
蟒蛇:
@app.route('/')
def homepage():
lat_lng = (39.7392,-104.9847)
return render_template("index_v2.html", lat_lng=json.dumps(lat_lng))
Run Code Online (Sandbox Code Playgroud)
使用js的html:
<script type='text/javascript'>
var map;
function initialize() {
// Create the map.
var lat_lng = eval('({{ lat_lng }})')
map = new google.maps.Map(document.getElementById('map-canvas'), {
zoom: 8,
center: new google.maps.LatLng(lat_lng)
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
Run Code Online (Sandbox Code Playgroud)
我正在使用eval,因为变量= {{data}}的标准Jinja表示法不起作用,我发现了一些eval是必要的建议.有什么建议?
我有五页具有相同的页面布局和结构,但有一些不同的颜色,文本等,所以这是一个理想的模板环境.我决定使用Jinja2,可能还有烧瓶.我已经阅读了文档和一些在线教程,这些教程解释了很多关于你可以在页面上使用模板做什么,但没有太多关于如何将变量发送到页面的内容.
我有一个jinja_filters.py文件,里面有几十个自定义过滤器.现在我有多个需要使用这些过滤器的Flask应用程序.(我不确定我的问题是否是Flask特定的.)
完成我想要的一个hacky方法是:
app = Flask(__name__)
import jinja_filters
@app.template_filter('filter_name1')
def filter_name1(arg):
return jinja_filters.filter_name1(arg)
@app.template_filter('filter_name2')
def filter_name2(arg):
return jinja_filters.filter_name2(arg)
...
Run Code Online (Sandbox Code Playgroud)
这样做的"正确"方法是什么?
编辑:理想情况下,我不必列出每个过滤器名称.因此,当我向jinja_filters.py添加新过滤器时,我不必更新任何其他代码 - 我的所有应用程序都可以立即使用它.
是否有Flask或Jinja2配置标志/扩展名来在渲染模板后自动缩小HTML输出?
我在这里看到了这个问题,有些是通过评论标签解决它或打破这样的标签:
<i><!--
-->t does not work on the first level with tabspace = 2
beside it looks horrible.
<a
>nnoying<
/a> is it not?
Run Code Online (Sandbox Code Playgroud)
我记得好像我曾经看到过一些诡计
<a>&dont_put_here_space_please;
tricky ampersand code.
Run Code Online (Sandbox Code Playgroud)
有这样的事吗?
我正在使用jinja2 python模板引擎.它有一些防空间技巧吗?
更新:
有了jinja2,感谢dav1d,我能想出的最短路径是:
<a>{% if true -%}
No space in the output before this text.
</a>{% endif -%}
Nor after.
Run Code Online (Sandbox Code Playgroud)
这样做有什么简短的方法吗?
我有一个带有字典列表的Jinja模板.订单很重要.我想根据字典的键/值减少列表或查找值.这是一个例子:
{%
set ordered_dicts = [
{
'id': 'foo',
'name': 'My name is Foo'
},
{
'id': 'bar',
'name': 'My name is Bar'
}
]
%}
Run Code Online (Sandbox Code Playgroud)
如果我有变量some_id = 'foo',我如何'My name is Foo'退出ordered_dictsJinja模板?
我试着select()和selectattr()想不出他们出基于文档.这是我试过的:
{{ ordered_dicts|selectattr("id", "foo") }}
Run Code Online (Sandbox Code Playgroud)
那输出:
<generator object _select_or_reject at 0x10748d870>
Run Code Online (Sandbox Code Playgroud)
我不认为我理解使用select()和selectattr()正确.
我是否需要遍历列表并手动执行查找?
更新:
正如codegeek和gipi指出的那样,我需要用生成器做这样的事情:
{{ ordered_dicts|selectattr("id", "foo")|list }}
Run Code Online (Sandbox Code Playgroud)
由此产生的错误:TemplateRuntimeError: no test named 'foo',澄清了如何selectattr()工作.第二个参数必须是内置测试之一.据我所知,这些测试都不会让我检查与键相关的值是否与另一个值匹配.这是我想做的事情:
{{ ordered_dicts|selectattr("id", "sameas", "foo")|list …Run Code Online (Sandbox Code Playgroud) 我希望有一个父模板和许多子模板,它们有自己的变量传递给父模板,如下所示:
parent.html:
{% block variables %}
{% endblock %}
{% if bool_var %}
{{ option_a }}
{% else %}
{{ option_b }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
child.html:
{% extends "parent.html" %}
{% block variables %}
{% set bool_var = True %}
{% set option_a = 'Text specific to this child template' %}
{% set option_b = 'More text specific to this child template' %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
但变量最终在父级中未定义.
我的基本问题是,在创建一组aws服务器时,我想配置它们以了解彼此.
创建每个服务器后,它们的详细信息将保存在已注册的"服务器"var中(如下所示).我真正希望在创建之后能够执行的任务是这样的:
- name: Add servers details to all other servers
lineinfile:
dest: /path/to/configfile
line: "servername={{ item.1.private_ip }}"
delegate_to: "{{ item.0.public_dns_name }}"
with_nested:
- list_of_servers
- list_of_servers
Run Code Online (Sandbox Code Playgroud)
将列表提供两次到'with_nested'是必不可少的.
获取列表清单很容易:
"{{ servers.results | map(attribute='tagged_instances') | list }}"
Run Code Online (Sandbox Code Playgroud)
返回:
[
[ { "private_ip": "ip1", "public_dns_name": "dns1" } , { ... }],
[ { ... }, { ... } ]
]
Run Code Online (Sandbox Code Playgroud)
但你怎么会把它变成:
[
{ "private_ip": "ip1", "public_dns_name": "dns1" },
{ ... },
{ ... },
{ ... }
]
Run Code Online (Sandbox Code Playgroud)
'servers'注册的var看起来像:
"servers": {
"changed": …Run Code Online (Sandbox Code Playgroud) 我知道烧瓶的功能render_template.我必须给出模板的文件名.但现在我想渲染一个模板的字符串(即模板的内容).那讲得通.但我现在不想解释原因.如何简单地渲染模板的文本?
我正在尝试创建类似Google Suggest Tool的内容(通过建议api http://suggestqueries.google.com/complete/search?output=toolbar&hl=ru&q=query)
我正在监听输入变化,并发送数据去GET:
$("#search_form_input").keyup(function(){
var some_var = $(this).val();
$.ajax({
url: "",
type: "get", //send it through get method
data:{jsdata: some_var},
success: function(response) {
},
error: function(xhr) {
//Do Something to handle error
}
});
Run Code Online (Sandbox Code Playgroud)
之后,我正在处理这些数据并将其发送到Google API并在Python中得到响应:
@app.route('/', methods=['GET', 'POST'])
def start_page_data():
query_for_suggest = request.args.get('jsdata')
if query_for_suggest == None:
suggestions_list = ['',]
pass
else:
suggestions_list = []
r = requests.get('http://suggestqueries.google.com/complete/search?output=toolbar&hl=ru&q={}&gl=in'.format(query_for_suggest), 'lxml')
soup = BeautifulSoup(r.content)
suggestions = soup.find_all('suggestion')
for suggestion in suggestions:
suggestions_list.append(suggestion.attrs['data'])
print(suggestions_list)
return render_template('start_page.html', suggestions_list=suggestions_list)
Run Code Online (Sandbox Code Playgroud)
在Jinja尝试动态打印HTML:
<label …Run Code Online (Sandbox Code Playgroud) jinja2 ×10
python ×7
flask ×5
javascript ×2
ansible ×1
html ×1
jquery ×1
json ×1
python-2.7 ×1
python-2.x ×1
templates ×1
wsgi ×1