Flask Button run Python without refreshing page?

前端 未结 3 425
攒了一身酷
攒了一身酷 2020-12-31 16:42

I am just getting started into python and flask (for the raspberry pi). I want a web application that would execute some python code to pan and tilt a camera and display a v

相关标签:
3条回答
  • 2020-12-31 17:15

    You can simply do this with help of AJAX... Here is a example which calls a python function which prints hello without redirecting or refreshing the page.

    In app.py put below code segment.

    //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"
    

    And your json.html page should look like below.

    <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>
    

    Here when you press the button Test simple in the console you can see "Hello" is displaying without any refreshing.

    0 讨论(0)
  • 2020-12-31 17:23

    I've got the same problem, and the answer is simple using ajax XmlHttpRequest:

    // send a request, but don't refresh page
    xhttp = new XMLHttpRequest();
    xhttp.open("GET", "your script action", true);
    xhttp.send();
    

    Here's a small example, calling current script with parameters "like", embedded in a function:

    function likeStuffs()
    {
        // send a request, but don't refresh page
        xhttp = new XMLHttpRequest();
        xhttp.open("GET", "?like", true);
        xhttp.send();
    }
    
    0 讨论(0)
  • 2020-12-31 17:29

    I would split it out into two routes to make it easier to see what you have to do:

    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'}
    

    Then in your template you just need to use some JavaScript to send off the request:

    {# 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>
    
    0 讨论(0)
提交回复
热议问题