Как с помощью библиотеки jinja2 при нажатии кнопки можно вызвать функцию в python, передав параметр id этой кнопки? Долго просматривал документацию и искал похожие вопросы, но так и не нашел ничего схожего.
Имеется следующие части кода:
main.py
def json_load(num):
with open('db/pub_keys.json', 'r', encoding='utf-8') as file:
file_dumps = json.load(file)
for elem in file_dumps:
if elem.get('id') == num:
print(f'
PK user with num {num}:')
print(elem.get('meta').get('pub_key'))
file.html
Нужно, чтобы при нажатии на кнопку вызывалась функция json_load() с передачей в ней аргумента id нажатой кнопки. пытался использовать {{ }} внутри onclick и action, но это не помогло.
Возможно ли реализовать это по средствам jinja2?
Ответ
Jinja2 – это всего лишь библиотека для упрощения генерации HTML страниц. А нужная Вам задача решается средствами простых HTTP запросов, которые можно сделать и с помощью чистого HTML, и с помощью более управляемого JavaScript'a.
1.1. Чистый HTML + скрытые параметры
В обоих случаях нужен обработчик запросов на стороне сервера. Однако чистым HTML'ем можно передать только обычный HTTP запрос, без JSON'а. На странице нужно сделать такие формы:
А на серваке ловить эти действия и параметры:
@app.route('/process_data/', methods=['POST']) def doit(): index = request.form['index'] # ... обработать данные ...
1.2. Чистый HTML + параметры в адресе
Фласк позволяет легко обрабатывать аргументы как часть пути:
А на серваке так:
@app.route('/process_data/
1.3. Чистый HTML + JSON форма
Форме можно поставить тип формата, тогда поддерживающие этот JSON браузеры отправят данные в нужном формате, а не поддерживающие вернутся к классическому form url encoded
Больше подробностей и реально интересных примеров с формой JSON доступны внизу по ссылке №5.
На сервере ловить JSON тоже достаточно легко:
@app.route('/process_data/', methods=['POST']) def doit(): data = request.get_json(silent=True) index = data["index"] # ... обработать данные ...
2. HTML + JavaScript
Очевидно, что способы выше предполагают много повторяющегося HTML кода, что явно не удобно, особенно если захочется что-то поменять. JavaScript может значительно упростить код предоставив большую гибкость, а также позволит не перезагружать страницу при отправке данных:
Теперь конкретный формат запроса будет определён лишь в одном месте. В самом скрипте можно поступить по-разному.
2.1. Вариант для сервера из 1.1, где данные передаём HTTP аргументами:
function process(index) { $.post("/process_data/", {'index': index}, function (data, status) { alert("Data: " + data + "
Status: " + status); }); }
2.2. Вариант для сервера из 1.2, где данные передаём как часть пути:
function process(index) { $.post("/process_data/" + index + "/", {}, function (data, status) { alert("Data: " + data + "
Status: " + status); }); }
2.3. И, наконец, вариант для сервера из 1.3, c JSON на борту:
function process(index) { $.ajax({ url: "/process_data/", type: "post", dataType: "json", success: function (data) { alert(data); }, data: {"index": index} }); }
Для простоты здесь используется JS в связке с библиотекой jQuery.
Полезные и использованные ссылки
Документация Flask (в которой, вообще-то, есть всё необходимое) jQuery AJAX get and post Пример AJAX с JSON Про использование JSON во Flask'e Отправка JSON формы чистым HTML
Комментариев нет:
Отправить комментарий