Ich bin neu in Python und Flask. Ich habe eine Flask Web App mit einer Schaltfläche. Wenn ich auf die Schaltfläche klicke, möchte ich eine Python-Methode und nicht eine Javascript-Methode ausführen. Wie kann ich das machen?
Ich habe Beispiele mit Python gesehen, bei denen ich mit einem Formular-Tag wie diesem auf eine neue Seite umgeleitet wurde
<form action="/newPage" method="post">
aber ich möchte nicht, dass es mich auf eine neue Seite umleitet. Ich möchte nur, dass es die Python-Methode ausführt. Ich mache das für ein Raspberry Pi Roboterauto. Wenn ich die Vorwärts-Taste drücke, soll die Methode zum Vorwärtsdrehen der Räder ausgeführt werden.
Schaltfläche HTML-Code (index.html)
<button name="forwardBtn" onclick="move_forward()">Forward</button>
einfacher app.py Code - move_forward() Methode befindet sich hier
#### 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...")
Ich habe ähnliche Fragen wie meine auf Stackoverflow gesehen, aber sie scheinen meine Frage nicht zu beantworten oder ich bin nicht in der Lage, die Antwort zu verstehen. Wenn mir jemand einen einfachen Weg zeigen könnte, wie man eine Python-Methode beim Klick-Ereignis einer Schaltfläche aufruft, wäre ich Ihnen sehr dankbar.
Andere Fragen, die ich mir angeschaut habe:
--https://stackoverflow.com/questions/30899484/python-flask-calling-functions-using-buttons
--https://stackoverflow.com/questions/40583347/calling-a-python-function-with-a-button
--https://stackoverflow.com/questions/21566649/flask-button-run-python-without-refreshing-page
Sie können dies einfach mit Hilfe von AJAX tun... Hier ist ein Beispiel, das eine Python-Funktion aufruft, die "Hallo" ausgibt, ohne die Seite weiterzuleiten oder zu aktualisieren.
Fügen Sie in app.py das folgende Codesegment ein.
//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"
Und Ihre json.html Seite sollte wie unten aussehen.
<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>
Wenn Sie hier die Schaltfläche Test simple in der Konsole drücken, sehen Sie, dass "Hello" ohne Auffrischung angezeigt wird.
Es klingt wie Sie diese Web-Anwendung als Fernbedienung für Ihren Roboter verwenden möchten, und ein Kernproblem ist, dass Sie nicht wollen, dass eine Seite neu laden jedes Mal, wenn Sie eine Aktion durchführen, in diesem Fall, der letzte Link, den Sie gepostet Antworten auf Ihr Problem.
Ich glaube, dass Sie einige Dinge über Flask falsch verstehen. Zum einen können Sie nicht mehrere Funktionen in einer einzigen Route verschachteln. Sie stellen nicht eine Reihe von Funktionen für eine bestimmte Route zur Verfügung, sondern Sie definieren die eine bestimmte Sache, die der Server tun wird, wenn diese Route aufgerufen wird.
In diesem Sinne könnten Sie Ihr Problem mit dem Neuladen der Seite lösen, indem Sie Ihre app.py so ändern, dass sie eher wie folgt aussieht:
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);
Verwenden Sie dann in Ihrer html-Datei dies:
<form action="/forward/" method="post">
<button name="forwardBtn" type="submit">Forward</button>
</form>
...um den Code für die Vorwärtsbewegung auszuführen. Und fügen Sie dies ein:
{{ forward_message }}
... an der Stelle, an der die Weiterleitungsnachricht in Ihrer Vorlage erscheinen soll.
Dadurch wird Ihre Seite neu geladen, was ohne AJAX und Javascript unvermeidlich ist.
index.html (index.html sollte sich im Ordner templates befinden)
<!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()