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()