Flask - вызов функции python при нажатии кнопки OnClick

Я новичок в python и Flask. У меня есть веб-приложение Flask с кнопкой. Когда я нажимаю на кнопку, я хотел бы выполнить метод python, а не метод Javascript. Как я могу это сделать?

Я видел примеры с python, где он перенаправляет меня на новую страницу с помощью тега формы, такого как

<form action="/newPage" method="post">

но я не хочу, чтобы он перенаправлял меня на новую страницу. Я просто хочу, чтобы он выполнял метод python. Я делаю это для робота-малины Pi. Когда я нажимаю кнопку "вперед", я хочу, чтобы он запускал метод для поворота колес вперед.

Кнопка HTML Code (index.html)

<button name="forwardBtn" onclick="move_forward()">Forward</button>

простой app.py Код - метод move_forward(), расположенный здесь

#### App.py code

from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html');

def move_forward():
    #Moving forward code
    print("Moving Forward...")

Я видел похожие вопросы для моего на Stackoverflow, но они, похоже, не отвечают на мой вопрос, или я не могу понять ответ. Если бы кто-то мог предоставить мне простой способ вызова метода Python при событии нажатия кнопки, было бы весьма полезно.

Другие вопросы, на которые я смотрел:

- Функции вызова Python Flask с помощью кнопок

- Вызов функции python с помощью кнопки

- Кнопка флажка запускает Python без обновления страницы?

Ответ 1

Вы можете просто сделать это с помощью AJAX... Вот пример, который вызывает функцию python, которая печатает привет, не перенаправляя или обновляя страницу.

В app.py помещается ниже сегмента кода.

//rendering the HTML page which has the button
@app.route('/json')
def json():
    return render_template('json.html')

//background process happening without any refreshing
@app.route('/background_process_test')
def background_process_test():
    print "Hello"
    return "nothing"

И ваша страница json.html должна выглядеть ниже.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type=text/javascript>
        $(function() {
          $('a#test').bind('click', function() {
            $.getJSON('/background_process_test',
                function(data) {
              //do nothing
            });
            return false;
          });
        });
</script>


//button
<div class='container'>
    <h3>Test</h3>
        <form>
            <a href=# id=test><button class='btn btn-default'>Test</button></a>
        </form>

</div>

Здесь, когда вы нажимаете кнопку Test simple в консоли, вы можете увидеть "Hello" отображается без каких-либо обновлений.

Ответ 2

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

Я думаю, что вы, возможно, неправильно поняли несколько вещей о Flask. С одной стороны, вы не можете вкладывать несколько функций в один маршрут. Вы не делаете набор функций доступным для определенного маршрута, вы определяете одну конкретную вещь, которую сервер будет делать при вызове этого маршрута.

Имея это в виду, вы сможете решить проблему с перезагрузкой страницы, изменив свой app.py так, чтобы он выглядел примерно так:

from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

@app.route("/forward/", methods=['POST'])
def move_forward():
    #Moving forward code
    forward_message = "Moving Forward..."
    return render_template('index.html', forward_message=forward_message);

Затем в своем html используйте это:

<form action="/forward/" method="post">
    <button name="forwardBtn" type="submit">Forward</button>
</form>

... Для выполнения вашего кода продвижения вперед. И включите это:

{{ forward_message }} 

... где вы хотите, чтобы в вашем шаблоне появилось сообщение о переходе вперед.

Это приведет к перезагрузке вашей страницы, что неизбежно без использования AJAX и Javascript.

Ответ 3

index.html(index.html должен находиться в папке шаблонов)

<!doctype html>
<html>

<head>
    <title>The jQuery Example</title>

    <h2>jQuery-AJAX in FLASK. Execute function on button click</h2>  

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> </script>
    <script type=text/javascript> $(function() { $("#mybutton").click(function (event) { $.getJSON('/SomeFunction', { },
    function(data) { }); return false; }); }); </script> 
</head>

<body>        
        <input type = "button" id = "mybutton" value = "Click Here" />
</body>    

</html>

test.py

from flask import Flask, jsonify, render_template, request
app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')

@app.route('/SomeFunction')
def SomeFunction():
    print('In SomeFunction')
    return "Nothing"



if __name__ == '__main__':
   app.run()