Flask Button运行Python而无需刷新页面?

发布于 2021-01-29 15:21:38

我刚开始使用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代码?

关注者
0
被浏览
195
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我将其分为两条路线,以使您更轻松地了解所要做的事情:

    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>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看