wake-up-neo.com

Flask - Aufruf von python Funktion auf Schaltfläche OnClick-Ereignis

Ich bin neu bei 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 ausführen, keine Javascript-Methode. Wie kann ich das machen?

Ich habe Beispiele mit python gesehen, bei denen ich mithilfe eines solchen Formular-Tags auf eine neue Seite umgeleitet werde

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

aber ich möchte nicht, dass es mich auf eine neue Seite weiterleitet. Ich möchte nur, dass die Methode python ausgeführt wird. 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>

einfache 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 bei Stackoverflow gesehen, aber sie scheinen meine Frage nicht zu beantworten, oder ich kann die Antwort nicht verstehen. Wenn mir jemand eine einfache Möglichkeit bieten könnte, eine Python - Methode beim Klicken auf eine Schaltfläche aufzurufen, wäre ich sehr dankbar.

Andere Fragen, die ich mir angesehen habe:

-- Python Flask ruft Funktionen über Schaltflächen auf

-- Aufrufen einer python - Funktion mit einer Taste

-- Flask Button führt Python aus, ohne die Seite zu aktualisieren?

40
Amaanite

Sie können dies einfach mit Hilfe von AJAX tun ... Hier ist ein Beispiel, das eine python - Funktion aufruft, die Hallo druckt, ohne die Seite umzuleiten oder zu aktualisieren.

In app.py unter Codesegment setzen.

#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 folgt 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 Taste Test einfach in der Konsole drücken, sehen Sie, dass "Hallo" ohne Aktualisierung angezeigt wird.

25
Gihan Gamage

Es hört sich so an, als ob Sie diese Webanwendung als Fernbedienung für Ihren Roboter verwenden möchten. Ein zentrales Problem ist, dass Sie nicht jedes Mal, wenn Sie eine Aktion ausführen, ein erneutes Laden der Seite wünschen. In diesem Fall antwortet der zuletzt veröffentlichte Link auf Ihre Problem.

Ich denke, Sie könnten ein paar Dinge über Flask falsch verstehen. Zum einen können Sie nicht mehrere Funktionen in einer einzigen Route verschachteln. Sie stellen keine Funktionen für eine bestimmte Route zur Verfügung, sondern definieren, was der Server beim Aufruf dieser Route tun soll.

In diesem Sinne können Sie Ihr Problem mit einem erneuten Laden der Seite lösen, indem Sie Ihre app.py so ändern, dass sie folgendermaßen 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 Ihrem HTML Folgendes:

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

... um Ihren Vorwärtscode auszuführen. Und schließen Sie dies ein:

{{ forward_message }} 

... wo die Weiterleitungsnachricht in Ihrer Vorlage angezeigt werden soll.

Dies führt dazu, dass Ihre Seite neu geladen wird, was ohne die Verwendung von AJAX und Javascript) unvermeidlich ist.

10
Logan Bertram

index.html (index.html sollte sich im Vorlagenordner 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()
2
user2371563