2017-01-25 8 views
1

В настоящее время я внедряю систему фильтров радиуса.Python flask jinja2 использовать математический модуль sin() cos() в шаблоне

Пользователь может найти номер в городе и на основании широты и долготы искомого города. Страница результатов покажет все остальные комнаты в радиусе 60 км.

Я нашел рабочую функцию, которую я уже испытанную (Eventhough цифра слишком высока, относительная proportians все еще показывает правильные результаты):

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

мне это нужно, как если выражение в дзиндзя :

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

Но в шаблоне дзиндзя не знает 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) 

Или есть другой подход?

+0

Почему вы не вычисляете результат в Python на стороне сервера и не передаете результат в шаблон? – MrLeeh

+0

Вы имеете в виду инструкцию SQL? Мне пришлось бы использовать .from_statement, потому что SQLalchemy не может сделать такой расчет, и из-за этого я получаю массу проблем. Потому что я использовал .from_statement, все остальные функции SQLalchemy и функции заказа больше не работают. Поэтому я выбрал этот путь. Вот мой старый вопрос: http://stackoverflow.com/questions/41804240/python-flask-translating-calculation-for-radius-filter-based-on-latitude-longi – Roman

+0

Я не вижу здесь никакого SQL. Возможно, вы должны включить это в вопрос. Я на самом деле имел в виду чистый код Python. – MrLeeh

ответ

3

Из Flask docs:

Чтобы придать новые переменные автоматически в контексте шаблона, контекстные процессоры существуют в термос. Контекстные процессоры запускаются до визуализации шаблона и имеют возможность вводить новые значения в контекст шаблона. Контекстный процессор - это функция, которая возвращает словарь. Ключи и значение этого словаря будут объединены с контекстом шаблона для всех шаблонов в приложении

В принципе, просто добавьте в свой код, и вы будете иметь возможность использовать эти функции во всех шаблонах.

from math import sin, cos, acos 

@app.context_processor 
def utility_processor(): 
    return dict(cos=cos, sin=sin, acos=acos) 

Добавьте любые другие функции или переменные возвращенного dict, чтобы сделать их доступными для ваших шаблонов.

+0

я уже решил ее: \t app.jinja_env.globals.update (the_cos = соз) \t app.jinja_env.globals.update (the_sin = син) \t app.jinja_env.globals.update (the_acos = экос) Является ли это хорошее решение? – Roman

+0

Лучше и чище идти стандартным способом, если вы используете Flask, но ваше решение также должно работать, да. – AArias

+0

Большое спасибо – Roman