Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Кнопка вызова функции python flask

#python #веб_программирование #flask #jinja2


Как с помощью библиотеки 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

Комментариев нет:

Отправить комментарий