Flask Button运行Python而不刷新页面?

Adi*_*lik 7 python flask raspberry-pi

我刚刚开始使用python和flask(对于raspberry pi).我想要一个Web应用程序,它将执行一些python代码来平移和倾斜摄像机并显示视频流.

我现在对于烧瓶的代码是:

from flask import Flask, render_template
import time
import serial
#ser = serial.Serial('/dev/ttyUSB0',9600)
app = Flask(__name__)
@app.route('/')
@app.route('/<cmd>') #each button in my html redirects to a specified directory
def execute(cmd=None):
if cmd == "down":
    print "Moving Down"
    #ser.write("D")

if cmd == "up":
    print "Moving Up"
    #ser.write("U")

if cmd == "left":
    print "Moving Left"
   # ser.write("L")

if cmd == "right":
    print "Moving Right"
    #ser.write("R")

if cmd == "reset":
    print "Reseting.."
    #ser.write("X")
return render_template("main.html")


if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True)
Run Code Online (Sandbox Code Playgroud)

问题是我的代码依赖于每个按钮重定向到一个新的directry,虽然这确实很好,它每次都刷新页面,这意味着我的嵌入视频重新加载和缓冲.是否有更好的方法来检测按钮然后使用烧瓶执行python代码?

Sea*_*ira 9

我会把它拆分成两条路线,以便更容易看到你要做的事情:

LEFT, RIGHT, UP, DOWN, RESET = "left", "right", "up", "down", "reset"
AVAILABLE_COMMANDS = {
    'Left': LEFT,
    'Right': RIGHT,
    'Up': UP,
    'Down': DOWN,
    'Reset': RESET
}

@app.route('/')
def execute():
    return render_template('main.html', commands=AVAILABLE_COMMANDS)

@app.route('/<cmd>')
def command(cmd=None):
    if cmd == RESET:
       camera_command = "X"
       response = "Resetting ..."
    else:
        camera_command = cmd[0].upper()
        response = "Moving {}".format(cmd.capitalize())

    # ser.write(camera_command)
    return response, 200, {'Content-Type': 'text/plain'}
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,您只需使用一些JavaScript来发送请求:

{# in main.html #}
{% for label, command in commands.items() %}
    <button class="command command-{{ command }}" value="{{ command }}">
        {{ label }}
    </button>
{% endfor %}

{# and then elsewhere #}
<script>
// Only run what comes next *after* the page has loaded
addEventListener("DOMContentLoaded", function() {
  // Grab all of the elements with a class of command
  // (which all of the buttons we just created have)
  var commandButtons = document.querySelectorAll(".command");
  for (var i=0, l=commandButtons.length; i<l; i++) {
    var button = commandButtons[i];
    // For each button, listen for the "click" event
    button.addEventListener("click", function(e) {
      // When a click happens, stop the button
      // from submitting our form (if we have one)
      e.preventDefault();

      var clickedButton = e.target;
      var command = clickedButton.value;

      // Now we need to send the data to our server
      // without reloading the page - this is the domain of
      // AJAX (Asynchronous JavaScript And XML)
      // We will create a new request object
      // and set up a handler for the response
      var request = new XMLHttpRequest();
      request.onload = function() {
          // We could do more interesting things with the response
          // or, we could ignore it entirely
          alert(request.responseText);
      };
      // We point the request at the appropriate command
      request.open("GET", "/" + command, true);
      // and then we send it off
      request.send();
    });
  }
}, true);
</script>
Run Code Online (Sandbox Code Playgroud)