Как с помощью библиотеки 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'\nPK user with num {num}:')
print(elem.get('meta').get('pub_key'))
file.html
Нужно, чтобы при нажатии на кнопку вызывалась функция json_load() с передачей в ней
аргумента id нажатой кнопки. пытался использовать {{ }} внутри onclick и action, но
это не помогло.
Возможно ли реализовать это по средствам jinja2?
Ответы
Ответ 1
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//', methods=['POST'])
def doit(index):
# ... обработать данные ...
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 + "\nStatus: " + status);
});
}
2.2. Вариант для сервера из 1.2, где данные передаём как часть пути:
function process(index) {
$.post("/process_data/" + index + "/", {}, function (data, status) {
alert("Data: " + data + "\nStatus: " + 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
Комментариев нет:
Отправить комментарий