Python flask jinja2在模板中使用数学模块sin()cos()

时间:2017-01-25 10:07:44

标签: python flask jinja2

我目前正在实施半径滤波器系统。

用户可以搜索城市中的房间,并根据搜索到的城市的纬度和经度,结果页面将显示半径60公里范围内的所有其他房间。

我找到了一个我已经测试过的工作函数(尽管数字太高,相对比例仍显示正确的结果):

acos(sin(loc_latitude) * sin(zimmer.zimmer_lat) + cos(loc_latitude) * cos(zimmer.zimmer_lat) * cos(zimmer.zimmer_lng - (loc_longitude))) * 6371 <= 6000:

我需要这个作为jinja if表达式:

{% if acos(sin(loc_latitude) * sin(zimmer.zimmer_lat) + cos(loc_latitude) * cos(zimmer.zimmer_lat) * cos(zimmer.zimmer_lng - (loc_longitude))) * 6371 <= 6000 %}

但是在模板中jinja不知道我从数学模块导入的cos()和sin()函数:

 File "C:\Users\User\Eclipse-Workspace\Monteurzimmer\templates\zimmer_gefunden.html", line 149, in block "content"
{% if acos(sin(loc_latitude) * sin(zimmer.zimmer_lat) + cos(loc_latitude) * cos(zimmer.zimmer_lat) * cos(zimmer.zimmer_lng - (loc_longitude))) * 6371 <= 60 %} 
UndefinedError: 'sin' is undefined

有没有办法将这些功能传递给模板?

我看到了这个:

your_template.render(sin())
your_template.render(cos())

但是我不知道在哪里获得your_template,因为我已经在这样渲染模板了:

return render_template('zimmer_gefunden.html', mymap=mymap, paginator_find=paginator_find, findroomcity=findroomcity, 
                    form=form, pagenumber_find=pagenumber_find, all_rooms_in_city=all_rooms_in_city, pages_list_find=pages_list_find, all_einzelzimmer = all_einzelzimmer,
                    all_doppelzimmer = all_doppelzimmer, all_mehrbettzimmer = all_mehrbettzimmer, all_wohnung = all_wohnung,
                    loc_latitude = loc_latitude, loc_longitude = loc_longitude)

或者还有其他方法吗?

1 个答案:

答案 0 :(得分:3)

来自Flask docs

  

要将新变量自动注入模板的上下文,Flask中存在上下文处理器。上下文处理器在呈现模板之前运行,并且能够将新值注入模板上下文。上下文处理器是返回字典的函数。然后,对于应用程序中的所有模板,此字典的键和值将与模板上下文合并

基本上,只需将其添加到您的代码中,您就可以在所有模板中使用这些功能。

DB_DATABASE = myproject

将任何其他函数或变量添加到返回的from math import sin, cos, acos @app.context_processor def utility_processor(): return dict(cos=cos, sin=sin, acos=acos) ,以使其可用于模板。