Flask Button运行Python而无需刷新页面?
我刚开始使用python和flask(对于树莓派)。我想要一个可以执行一些python代码来平移和倾斜摄像机并显示视频流的Web应用程序。
到目前为止,我的flask代码是:
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)
问题是我的代码依赖于重定向到新目录的每个按钮,尽管效果很好,但是每次刷新页面都会刷新我的嵌入式视频,并再次对其进行缓冲。有没有更好的方法来检测按下按钮,然后使用flask执行python代码?
-
我将其分为两条路线,以使您更轻松地了解所要做的事情:
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'}
然后,在模板中,您只需要使用一些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>